GUI MOVE state is now cleaner and the camera is more consistent.
This commit is contained in:
parent
b0437d352b
commit
1973a7a1df
4 changed files with 26 additions and 27 deletions
17
camera.cpp
17
camera.cpp
|
@ -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);
|
||||
};
|
||||
|
|
30
gui.cpp
30
gui.cpp
|
@ -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));
|
||||
}
|
||||
|
|
2
gui.hpp
2
gui.hpp
|
@ -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…
Add table
Add a link
Reference in a new issue