nuclear@0: #include nuclear@0: #include nuclear@0: #include "opengl.h" nuclear@0: #include "player.h" nuclear@0: #include "level.h" nuclear@0: nuclear@0: void player_init(struct player *p, struct level *lvl) nuclear@0: { nuclear@0: p->lvl = lvl; nuclear@0: level_cell_to_pos(lvl, lvl->start_pos[0], lvl->start_pos[1], &p->x, &p->y); nuclear@0: p->horiz_angle = 0; nuclear@0: p->vert_angle = 0; nuclear@0: } nuclear@0: nuclear@0: int player_move(struct player *p, float dfwd, float dright) nuclear@0: { nuclear@0: int collide; nuclear@0: float angle = M_PI * p->horiz_angle / 180.0; nuclear@0: float fwd_dirx = sin(angle); nuclear@0: float fwd_diry = -cos(angle); nuclear@0: float right_dirx = sin(angle + M_PI / 2.0); nuclear@0: float right_diry = -cos(angle + M_PI / 2.0); nuclear@0: nuclear@0: float dx = dfwd * fwd_dirx + dright * right_dirx; nuclear@0: float dy = dfwd * fwd_diry + dright * right_diry; nuclear@0: nuclear@0: if(!dfwd && !dright) return 1; nuclear@0: nuclear@0: /* calculate collisions */ nuclear@0: collide = level_collide(p->lvl, 0.7, p->x, p->y, &dx, &dy); nuclear@0: nuclear@0: p->x += dx; nuclear@0: p->y += dy; nuclear@0: nuclear@0: return !collide; nuclear@0: } nuclear@0: nuclear@0: void player_turn(struct player *p, float horiz_deg, float vert_deg) nuclear@0: { nuclear@0: float va = p->vert_angle + vert_deg; nuclear@0: nuclear@0: if(va < -90.0) va = -90.0; nuclear@0: if(va > 90.0) va = 90.0; nuclear@0: nuclear@0: p->horiz_angle += horiz_deg;/*fmod(p->horiz_angle + horiz_deg, 360.0);*/ nuclear@0: p->vert_angle = va; nuclear@0: } nuclear@0: nuclear@0: void player_setup_view_matrix(struct player *p) nuclear@0: { nuclear@0: glRotatef(p->vert_angle, 1, 0, 0); nuclear@0: glRotatef(p->horiz_angle, 0, 1, 0); nuclear@0: glTranslatef(-p->x, 0, -p->y); nuclear@0: }