From: Andreas Eversberg Date: Sun, 18 Nov 2018 07:33:42 +0000 (+0100) Subject: OVR: Change the way to walk and rotate with the controller X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=mercenary-reloaded.git;a=commitdiff_plain;h=59abe0e01a3db005db7ff8907b7b26cd4054a722 OVR: Change the way to walk and rotate with the controller --- diff --git a/src/mercenary/main.c b/src/mercenary/main.c index e654f28..95277db 100644 --- a/src/mercenary/main.c +++ b/src/mercenary/main.c @@ -386,6 +386,7 @@ static int thrust_last = 0; static int joystick_set_x_last = 0, joystick_set_y_last = 0; static int keyboard_on = 0; static enum keycode vr_key_pressed = 0, vr_key = 0; +static int we_walk = 0, we_rotate = 0; static void handle_vr_poses(void) { @@ -430,12 +431,6 @@ static void handle_vr_poses(void) vr_key_pressed = vr_key; set_amiga_key(vr_key_pressed, 1); } - } else - if (mercenary_get_info_walking()) { - /* change orientation */ - double roll, pitch, yaw; - mercenary_get_orientation(&roll, &pitch, &yaw); - mercenary_set_orientation(yaw + hand_right_yaw); } else { /* fire button */ set_joystick(-1, -1, -1, -1, 1); @@ -480,24 +475,48 @@ static void handle_vr_poses(void) } } else { double roll, pitch, yaw; - double dist, dir, east, north; + double tilt, dir, east, north; int32_t move_east[4], move_north[4]; - /* check if we push the stick */ - dist = sqrt(stick_right_x * stick_right_x + stick_right_y * stick_right_y); - if (dist > STICK_WALK_THRESHOLD) { + tilt = sqrt(stick_right_x * stick_right_x + stick_right_y * stick_right_y); + + /* check if we rotate, walk or rest */ + if (we_rotate == 0 && we_walk == 0) { + /* we rest */ + if (fabs(stick_right_y) > fabs(stick_right_x) && tilt > STICK_WALK_THRESHOLD) + we_walk = 1; + if (fabs(stick_right_x) > fabs(stick_right_y) && tilt > STICK_ROTATE_THRESHOLD) + we_rotate = 1; + } else if (we_walk) { + /* we walk */ + if (tilt < STICK_WALK_THRESHOLD) { + we_walk = 0; + /* we need to stop right here and not continue until next rendering */ + set_joystick(-1, -1, 0, 0, -1); /* stop y */ + reset_joystick(); /* commit stop */ + } + } else { + /* we rotate */ + if (tilt < STICK_ROTATE_THRESHOLD) + we_rotate = 0; + } + + /* if we walk */ + if (we_walk) { /* get stick amplitude (dist) and direction (dir) */ - if (dist > 1.0) - dist = 1.0; - dist = (dist - STICK_WALK_THRESHOLD) / (1.0 - STICK_WALK_THRESHOLD) * 40.0; + if (tilt > 1.0) + tilt = 1.0; + tilt = (tilt - STICK_WALK_THRESHOLD) / (1.0 - STICK_WALK_THRESHOLD) * 40.0; dir = atan2(stick_right_x, stick_right_y); +#if 0 /* use hand direction to get actual stick direction */ dir = fmod(dir - hand_right_yaw, M_PI * 2.0); if (dir < -M_PI) dir += M_PI * 2.0; if (dir > M_PI) dir -= M_PI * 2.0; - /* flip directin, if we walk backwards */ +#endif + /* flip direction, if we walk backwards */ if (dir > M_PI / 2.0 || dir < -M_PI / 2.0) { /* go backwards */ set_joystick(-1, -1, 0, 1, -1); @@ -507,10 +526,9 @@ static void handle_vr_poses(void) set_joystick(-1, -1, 1, 0, -1); joystick_set_y = 1; } - joystick_set_y = 1; mercenary_get_orientation(&roll, &pitch, &yaw); - east = sin(yaw - dir + M_PI) * dist; - north = -cos(yaw - dir + M_PI) * dist; + east = sin(yaw - dir + M_PI) * tilt; + north = -cos(yaw - dir + M_PI) * tilt; /* calculatate the integer positions of 4 steps */ move_east[0] = (int32_t)((east * 0.25) + 0.5); move_north[0] = (int32_t)((north * 0.25) + 0.5); @@ -530,6 +548,18 @@ static void handle_vr_poses(void) /* the game takes 4 steps to move the player */ mercenary_vr_move(1, move_east, move_north, 256, 256); } + + /* if we rotate */ + if (we_rotate == 1) { + /* change orientation */ + mercenary_get_orientation(&roll, &pitch, &yaw); + if (stick_right_x > 0) + mercenary_set_orientation(yaw - 45.0 / 180.0 * M_PI); + else + mercenary_set_orientation(yaw + 45.0 / 180.0 * M_PI); + /* rotate only once */ + we_rotate = 2; + } } if (joystick_set_x_last && !joystick_set_x) set_joystick(0, 0, -1, -1, -1); @@ -1492,7 +1522,7 @@ int main(int argc, char *argv[]) "\n" "Walking / Driving / Flying using Controller:\n" " Use thumb stick on right controller, to move player / craft.\n" - " Point right controller towards the direction to walk to.\n" + " Move thumb stick forth and back to walk, left and right to rotate.\n" " Pull `Trigger' on right controller to change orientation.\n" " Press `X' button to board, `Y' button to leave.\n" " Move thumb stick on left controller to drive/fly forward or backward.\n"