From d6c09e111d976179e15f77e02206a4edd35208bf Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Tue, 4 Feb 2025 14:13:00 -0500 Subject: [PATCH] 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. --- camera.cpp | 5 +++++ camera.hpp | 1 + gui.cpp | 15 ++++++++++----- gui.hpp | 2 +- raycaster.cpp | 6 ++++++ raycaster.hpp | 2 ++ 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/camera.cpp b/camera.cpp index 84834d4..290bbf2 100644 --- a/camera.cpp +++ b/camera.cpp @@ -41,3 +41,8 @@ bool CameraLOL::play_move(Raycaster &rayview) { rayview.$posY = std::lerp(rayview.$posY, targetY, t); return t >= 1.0; } + +void CameraLOL::abort_plan(Raycaster &rayview) { + targetX = rayview.$posX; + targetY = rayview.$posY; +} diff --git a/camera.hpp b/camera.hpp index b91dd2f..7e1c407 100644 --- a/camera.hpp +++ b/camera.hpp @@ -18,4 +18,5 @@ struct CameraLOL { bool play_rotate(Raycaster &rayview); bool play_move(Raycaster &rayview); + void abort_plan(Raycaster &rayview); }; diff --git a/gui.cpp b/gui.cpp index 379596e..126266e 100644 --- a/gui.cpp +++ b/gui.cpp @@ -36,7 +36,7 @@ namespace gui { void FSM::START(Event ) { // ZED: this must die - $rayview.$map = generate_map(); + generate_map(); $rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y); $rayview.position_camera($player.x + 0.5, $player.y + 0.5); state(State::IDLE); @@ -55,6 +55,8 @@ namespace gui { } void FSM::IDLE(Event ev) { + auto& level = $levels.current(); + using FU = Event; switch(ev) { @@ -89,6 +91,11 @@ namespace gui { default: 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) { @@ -194,14 +201,12 @@ namespace gui { } } - Matrix FSM::generate_map() { + void FSM::generate_map() { auto& level = $levels.current(); - auto& tiles = level.map->tiles(); auto& player = level.world->get_the(); auto& player_position = level.world->get(player.entity); $player = player_position.location; - - return $textures.convert_char_to_texture(tiles.$tile_ids); + $rayview.set_level(level); } bool FSM::active() { diff --git a/gui.hpp b/gui.hpp index aa8540b..f7c13c6 100644 --- a/gui.hpp +++ b/gui.hpp @@ -55,7 +55,7 @@ namespace gui { void draw_gui(); void render(); void mouse(); - Matrix generate_map(); + void generate_map(); bool active(); }; } diff --git a/raycaster.cpp b/raycaster.cpp index a2f1aff..689fe0f 100644 --- a/raycaster.cpp +++ b/raycaster.cpp @@ -356,3 +356,9 @@ DinkyECS::Entity Raycaster::position_sprite(Point pos, string name) { $collision.insert({pos.x, pos.y}, 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); +} diff --git a/raycaster.hpp b/raycaster.hpp index 03c5cff..88d8829 100644 --- a/raycaster.hpp +++ b/raycaster.hpp @@ -33,6 +33,7 @@ struct Raycaster { int $width; int $height; sf::RenderWindow& $window; + GameLevel $level; Matrix $map; SpatialMap $collision; std::vector $sprites; @@ -70,4 +71,5 @@ struct Raycaster { return ((y) * $width) + (x); } + void set_level(GameLevel level); };