Raycaster now has wall collision so won't go through walls. Next step is to render all the sprites being places and then implement the Systems.

master
Zed A. Shaw 10 months ago
parent 75ffb49a53
commit d6c09e111d
  1. 5
      camera.cpp
  2. 1
      camera.hpp
  3. 15
      gui.cpp
  4. 2
      gui.hpp
  5. 6
      raycaster.cpp
  6. 2
      raycaster.hpp

@ -41,3 +41,8 @@ bool CameraLOL::play_move(Raycaster &rayview) {
rayview.$posY = std::lerp(rayview.$posY, targetY, t); rayview.$posY = std::lerp(rayview.$posY, targetY, t);
return t >= 1.0; return t >= 1.0;
} }
void CameraLOL::abort_plan(Raycaster &rayview) {
targetX = rayview.$posX;
targetY = rayview.$posY;
}

@ -18,4 +18,5 @@ struct CameraLOL {
bool play_rotate(Raycaster &rayview); bool play_rotate(Raycaster &rayview);
bool play_move(Raycaster &rayview); bool play_move(Raycaster &rayview);
void abort_plan(Raycaster &rayview);
}; };

@ -36,7 +36,7 @@ namespace gui {
void FSM::START(Event ) { void FSM::START(Event ) {
// ZED: this must die // ZED: this must die
$rayview.$map = generate_map(); generate_map();
$rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y); $rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y);
$rayview.position_camera($player.x + 0.5, $player.y + 0.5); $rayview.position_camera($player.x + 0.5, $player.y + 0.5);
state(State::IDLE); state(State::IDLE);
@ -55,6 +55,8 @@ namespace gui {
} }
void FSM::IDLE(Event ev) { void FSM::IDLE(Event ev) {
auto& level = $levels.current();
using FU = Event; using FU = Event;
switch(ev) { switch(ev) {
@ -89,6 +91,11 @@ namespace gui {
default: default:
dbc::sentinel("unhandled event in IDLE"); dbc::sentinel("unhandled event in IDLE");
} }
if(!level.map->can_move({size_t($camera.targetX), size_t($camera.targetY)})) {
state(State::IDLE);
$camera.abort_plan($rayview);
}
} }
void FSM::END(Event ev) { void FSM::END(Event ev) {
@ -194,14 +201,12 @@ namespace gui {
} }
} }
Matrix FSM::generate_map() { void FSM::generate_map() {
auto& level = $levels.current(); auto& level = $levels.current();
auto& tiles = level.map->tiles();
auto& player = level.world->get_the<Player>(); auto& player = level.world->get_the<Player>();
auto& player_position = level.world->get<Position>(player.entity); auto& player_position = level.world->get<Position>(player.entity);
$player = player_position.location; $player = player_position.location;
$rayview.set_level(level);
return $textures.convert_char_to_texture(tiles.$tile_ids);
} }
bool FSM::active() { bool FSM::active() {

@ -55,7 +55,7 @@ namespace gui {
void draw_gui(); void draw_gui();
void render(); void render();
void mouse(); void mouse();
Matrix generate_map(); void generate_map();
bool active(); bool active();
}; };
} }

@ -356,3 +356,9 @@ DinkyECS::Entity Raycaster::position_sprite(Point pos, string name) {
$collision.insert({pos.x, pos.y}, ent); $collision.insert({pos.x, pos.y}, ent);
return ent; return ent;
} }
void Raycaster::set_level(GameLevel level) {
$level = level;
auto& tiles = $level.map->tiles();
$map = $textures.convert_char_to_texture(tiles.$tile_ids);
}

@ -33,6 +33,7 @@ struct Raycaster {
int $width; int $width;
int $height; int $height;
sf::RenderWindow& $window; sf::RenderWindow& $window;
GameLevel $level;
Matrix $map; Matrix $map;
SpatialMap $collision; SpatialMap $collision;
std::vector<Sprite> $sprites; std::vector<Sprite> $sprites;
@ -70,4 +71,5 @@ struct Raycaster {
return ((y) * $width) + (x); return ((y) * $width) + (x);
} }
void set_level(GameLevel level);
}; };