FINALLY fix that stupid bug. The cause was two-fold: I was giving every 'enemy' a sprite, but that automatically included the player in the list of enemies, which meant that I was rendering the player's sprite while moving. Then in the sprite casting loop I was rendering things at 0.

master
Zed A. Shaw 1 month ago
parent 25ad9b51f8
commit a19bc47904
  1. 4
      camera.cpp
  2. 2
      camera.hpp
  3. 7
      gui.cpp
  4. 5
      raycaster.cpp

@ -2,7 +2,7 @@
#include <numbers> #include <numbers>
#include <cmath> #include <cmath>
void CameraLOL::plan_move(Raycaster &rayview, int dir, bool strafe) { Point CameraLOL::plan_move(Raycaster &rayview, int dir, bool strafe) {
t = 0.0; t = 0.0;
if(strafe) { if(strafe) {
targetX = rayview.$posX + int(-rayview.$dirY * 1.5 * dir); targetX = rayview.$posX + int(-rayview.$dirY * 1.5 * dir);
@ -11,6 +11,8 @@ void CameraLOL::plan_move(Raycaster &rayview, int dir, bool strafe) {
targetX = rayview.$posX + int(rayview.$dirX * 1.5 * dir); targetX = rayview.$posX + int(rayview.$dirX * 1.5 * dir);
targetY = rayview.$posY + int(rayview.$dirY * 1.5 * dir); targetY = rayview.$posY + int(rayview.$dirY * 1.5 * dir);
} }
return {size_t(targetX), size_t(targetY)};
} }
void CameraLOL::plan_rotate(Raycaster &rayview, int dir) { void CameraLOL::plan_rotate(Raycaster &rayview, int dir) {

@ -12,7 +12,7 @@ struct CameraLOL {
double targetPlaneX = 0.0; double targetPlaneX = 0.0;
double targetPlaneY = 0.0; double targetPlaneY = 0.0;
void plan_move(Raycaster &rayview, int dir, bool strafe); Point plan_move(Raycaster &rayview, int dir, bool strafe);
void plan_rotate(Raycaster &rayview, int dir); void plan_rotate(Raycaster &rayview, int dir);
bool play_rotate(Raycaster &rayview); bool play_rotate(Raycaster &rayview);

@ -1,3 +1,4 @@
#define FSM_DEBUG 1
#include "gui.hpp" #include "gui.hpp"
#include <iostream> #include <iostream>
#include <chrono> #include <chrono>
@ -96,9 +97,7 @@ namespace gui {
void FSM::try_move(int dir, bool strafe) { void FSM::try_move(int dir, bool strafe) {
// prevent moving into occupied space // prevent moving into occupied space
$camera.plan_move($rayview, dir, strafe); Point move_to = $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)) { if($level.map->can_move(move_to) && !$level.collision->occupied(move_to)) {
state(State::MOVING); state(State::MOVING);
@ -221,8 +220,8 @@ namespace gui {
} }
void FSM::run_systems() { void FSM::run_systems() {
System::motion($level);
System::enemy_pathing($level); System::enemy_pathing($level);
System::motion($level);
System::collision($level); System::collision($level);
System::death($level); System::death($level);
} }

@ -67,6 +67,7 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) {
// sort sprites from far to close // sort sprites from far to close
auto sprite_order = $level.collision->distance_sorted({(size_t)$posX, (size_t)$posY}); auto sprite_order = $level.collision->distance_sorted({(size_t)$posX, (size_t)$posY});
// after sorting the sprites, do the projection // after sorting the sprites, do the projection
for(auto& rec : sprite_order) { for(auto& rec : sprite_order) {
if(!$sprites.contains(rec.second)) continue; if(!$sprites.contains(rec.second)) continue;
@ -332,9 +333,13 @@ void Raycaster::set_level(GameLevel level) {
$level = level; $level = level;
auto& tiles = $level.map->tiles(); auto& tiles = $level.map->tiles();
auto world = $level.world; auto world = $level.world;
auto& player = world->get_the<components::Player>();
$map = $textures.convert_char_to_texture(tiles.$tile_ids); $map = $textures.convert_char_to_texture(tiles.$tile_ids);
world->query<components::Position>([&](const auto ent, auto &pos) { world->query<components::Position>([&](const auto ent, auto &pos) {
// player doesn't need a sprite
if(player.entity == ent) return;
if(world->has<components::Combat>(ent)) { if(world->has<components::Combat>(ent)) {
fmt::println("enemy: {}, pos={},{}", ent, pos.location.x, pos.location.y); fmt::println("enemy: {}, pos={},{}", ent, pos.location.x, pos.location.y);
auto sprite_txt = $textures.sprite_textures.at("evil_eye"); auto sprite_txt = $textures.sprite_textures.at("evil_eye");

Loading…
Cancel
Save