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.
This commit is contained in:
parent
25ad9b51f8
commit
a19bc47904
4 changed files with 12 additions and 6 deletions
|
@ -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);
|
||||||
|
|
7
gui.cpp
7
gui.cpp
|
@ -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…
Add table
Add a link
Reference in a new issue