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 <cmath>
void CameraLOL::plan_move(Raycaster &rayview, int dir, bool strafe) {
Point CameraLOL::plan_move(Raycaster &rayview, int dir, bool strafe) {
t = 0.0;
if(strafe) {
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);
targetY = rayview.$posY + int(rayview.$dirY * 1.5 * dir);
}
return {size_t(targetX), size_t(targetY)};
}
void CameraLOL::plan_rotate(Raycaster &rayview, int dir) {

@ -12,7 +12,7 @@ struct CameraLOL {
double targetPlaneX = 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);
bool play_rotate(Raycaster &rayview);

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

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

Loading…
Cancel
Save