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

This commit is contained in:
Zed A. Shaw 2025-02-06 11:55:43 -05:00
parent b0437d352b
commit 1973a7a1df
4 changed files with 26 additions and 27 deletions

30
gui.cpp
View file

@ -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));
}