X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=vrlugburz;a=blobdiff_plain;f=src%2Fplayer.c;fp=src%2Fplayer.c;h=81ce5b81c64c039deac2d56ed249f858a823a178;hp=24c5851570d996fd64a1e7e6942052eb897a7b69;hb=67b9bf8d28722bbc8c03c897c0a46d202286bd16;hpb=60a62013e45b8dd307494b792c48b5fde17d2fdc diff --git a/src/player.c b/src/player.c index 24c5851..81ce5b8 100644 --- a/src/player.c +++ b/src/player.c @@ -13,9 +13,18 @@ void init_player(struct player *p) void move_player(struct player *p, int right, int fwd) { static const int step[][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; - int rdir = (p->dir + 1) & 3; - p->cx += step[p->dir][0] * fwd + step[rdir][0] * right; - p->cy += step[p->dir][1] * fwd + step[rdir][1] * right; + int fdir, rdir; + float angle; + cgm_vec3 vdir = {0, 0, -1}; + + cgm_vmul_m3v3(&vdir, p->view_xform); + + angle = atan2(vdir.z, vdir.x) + 3.0 * M_PI; + fdir = (p->dir + (int)(2.0 * angle / M_PI)) & 3; + + rdir = (fdir + 1) & 3; + p->cx += step[fdir][0] * fwd + step[rdir][0] * right; + p->cy += step[fdir][1] * fwd + step[rdir][1] * right; } void turn_player(struct player *p, int turn) @@ -23,6 +32,7 @@ void turn_player(struct player *p, int turn) if(!turn) return; turn = turn > 0 ? 1 : 3; p->dir = (p->dir + turn) & 3; + p->theta = 0; } void upd_player_xform(struct player *p) @@ -35,7 +45,7 @@ void upd_player_xform(struct player *p) cgm_midentity(p->view_xform); cgm_mprerotate_x(p->view_xform, -p->phi); - cgm_mprerotate_y(p->view_xform, p->dir * M_PI / 2.0f); + cgm_mprerotate_y(p->view_xform, p->theta + p->dir * M_PI / 2.0f); cgm_mrotate_quat(p->view_xform, &p->vrot); cgm_mpretranslate(p->view_xform, -pos.x, -pos.y, -pos.z); }