GUI MOVE state is now cleaner and the camera is more consistent.

master
Zed A. Shaw 1 month ago
parent b0437d352b
commit 1973a7a1df
  1. 17
      camera.cpp
  2. 4
      camera.hpp
  3. 30
      gui.cpp
  4. 2
      gui.hpp

@ -2,16 +2,15 @@
#include <numbers>
#include <cmath>
void CameraLOL::plan_run(Raycaster &rayview, int dir) {
void CameraLOL::plan_move(Raycaster &rayview, int dir, bool strafe) {
t = 0.0;
targetX = rayview.$posX + int(rayview.$dirX * 1.5 * dir);
targetY = rayview.$posY + int(rayview.$dirY * 1.5 * dir);
}
void CameraLOL::plan_strafe(Raycaster &rayview, int dir) {
t = 0.0;
targetX = rayview.$posX + int(-rayview.$dirY * 1.5 * dir);
targetY = rayview.$posY + int(rayview.$dirX * 1.5 * dir);
if(strafe) {
targetX = rayview.$posX + int(-rayview.$dirY * 1.5 * dir);
targetY = rayview.$posY + int(rayview.$dirX * 1.5 * dir);
} else {
targetX = rayview.$posX + int(rayview.$dirX * 1.5 * dir);
targetY = rayview.$posY + int(rayview.$dirY * 1.5 * dir);
}
}
void CameraLOL::plan_rotate(Raycaster &rayview, int dir) {

@ -12,11 +12,11 @@ struct CameraLOL {
double targetPlaneX = 0.0;
double targetPlaneY = 0.0;
void plan_run(Raycaster &rayview, int dir);
void plan_strafe(Raycaster &rayview, int dir);
void plan_move(Raycaster &rayview, int dir, bool strafe);
void plan_rotate(Raycaster &rayview, int dir);
bool play_rotate(Raycaster &rayview);
bool play_move(Raycaster &rayview);
void abort_plan(Raycaster &rayview);
};

@ -73,44 +73,44 @@ namespace gui {
state(State::END);
return; // done
case FU::MOVE_FORWARD:
$camera.plan_run($rayview, 1);
state(State::MOVING);
try_move(1, false);
break;
case FU::MOVE_BACK:
$camera.plan_run($rayview, -1);
state(State::MOVING);
try_move(-1, false);
break;
case FU::MOVE_LEFT:
$camera.plan_strafe($rayview, 1);
state(State::MOVING);
try_move(1, true);
break;
case FU::MOVE_RIGHT:
$camera.plan_strafe($rayview, -1);
state(State::MOVING);
try_move(-1, true);
break;
case FU::ROTATE_LEFT:
$camera.plan_rotate($rayview, 1);
state(State::ROTATING);
return; // get out early since can always rotate
break;
case FU::ROTATE_RIGHT:
$camera.plan_rotate($rayview, -1);
state(State::ROTATING);
return; // get out early since can always rotate
break;
default:
dbc::sentinel("unhandled event in IDLE");
}
}
void FSM::try_move(int dir, bool strafe) {
// prevent moving into occupied space
if(!can_move({size_t($camera.targetX), size_t($camera.targetY)})) {
$camera.plan_move($rayview, dir, strafe);
Point move_to{size_t($camera.targetX), size_t($camera.targetY)};
if(level.map->can_move(move_to) && !level.collision->occupied(move_to)) {
state(State::MOVING);
} else {
state(State::IDLE);
$camera.abort_plan($rayview);
}
}
bool FSM::can_move(Point move_to) {
return level.map->can_move(move_to) && !level.collision->occupied(move_to);
}
void FSM::END(Event ev) {
fmt::println("END: received event after done: {}", int(ev));
}

@ -51,7 +51,7 @@ namespace gui {
void IDLE(Event ev);
void END(Event ev);
bool can_move(Point move_to);
void try_move(int dir, bool strafe);
void keyboard();
void draw_weapon();
void draw_gui();

Loading…
Cancel
Save