Now have enemies chasing us around and implemented diagonal movement as a test but I kind of like it.
This commit is contained in:
parent
d5301acab5
commit
14128ab10f
5 changed files with 37 additions and 14 deletions
|
@ -9,13 +9,13 @@
|
||||||
"ceiling": "assets/ceiling_test-256.png"
|
"ceiling": "assets/ceiling_test-256.png"
|
||||||
},
|
},
|
||||||
"enemy": {
|
"enemy": {
|
||||||
"HEARING_DISTANCE": 8
|
"HEARING_DISTANCE": 20
|
||||||
},
|
},
|
||||||
"player": {
|
"player": {
|
||||||
},
|
},
|
||||||
"worldgen": {
|
"worldgen": {
|
||||||
"enemy_probability": 20,
|
"enemy_probability": 20,
|
||||||
"empty_room_probability": 10,
|
"empty_room_probability": 50,
|
||||||
"device_probability": 30
|
"device_probability": 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ void CameraLOL::plan_strafe(Raycaster &rayview, int dir) {
|
||||||
|
|
||||||
void CameraLOL::plan_rotate(Raycaster &rayview, int dir) {
|
void CameraLOL::plan_rotate(Raycaster &rayview, int dir) {
|
||||||
t = 0.0;
|
t = 0.0;
|
||||||
double angle_dir = std::numbers::pi * 0.5 * dir;
|
double angle_dir = std::numbers::pi * 0.25 * dir;
|
||||||
|
|
||||||
targetDirX = rayview.$dirX * cos(angle_dir) - rayview.$dirY * sin(angle_dir);
|
targetDirX = rayview.$dirX * cos(angle_dir) - rayview.$dirY * sin(angle_dir);
|
||||||
targetDirY = rayview.$dirX * sin(angle_dir) + rayview.$dirY * cos(angle_dir);
|
targetDirY = rayview.$dirX * sin(angle_dir) + rayview.$dirY * cos(angle_dir);
|
||||||
|
|
27
gui.cpp
27
gui.cpp
|
@ -5,6 +5,7 @@
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include "components.hpp"
|
#include "components.hpp"
|
||||||
#include <numbers>
|
#include <numbers>
|
||||||
|
#include "systems.hpp"
|
||||||
|
|
||||||
using namespace components;
|
using namespace components;
|
||||||
|
|
||||||
|
@ -43,6 +44,15 @@ namespace gui {
|
||||||
|
|
||||||
void FSM::MOVING(Event ) {
|
void FSM::MOVING(Event ) {
|
||||||
if($camera.play_move($rayview)) {
|
if($camera.play_move($rayview)) {
|
||||||
|
|
||||||
|
auto &level = $levels.current();
|
||||||
|
auto player = level.world->get_the<Player>();
|
||||||
|
auto& player_position = level.world->get<Position>(player.entity);
|
||||||
|
player_position.location.x = size_t($camera.targetX);
|
||||||
|
player_position.location.y = size_t($camera.targetY);
|
||||||
|
|
||||||
|
run_systems();
|
||||||
|
|
||||||
state(State::IDLE);
|
state(State::IDLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,8 +64,6 @@ 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) {
|
||||||
|
@ -91,12 +99,17 @@ namespace gui {
|
||||||
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)})) {
|
if(!can_move({size_t($camera.targetX), size_t($camera.targetY)})) {
|
||||||
state(State::IDLE);
|
state(State::IDLE);
|
||||||
$camera.abort_plan($rayview);
|
$camera.abort_plan($rayview);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FSM::can_move(Point move_to) {
|
||||||
|
auto& level = $levels.current();
|
||||||
|
return level.map->can_move(move_to) && !level.collision->occupied(move_to);
|
||||||
|
}
|
||||||
|
|
||||||
void FSM::END(Event ev) {
|
void FSM::END(Event ev) {
|
||||||
fmt::println("END: received event after done: {}", int(ev));
|
fmt::println("END: received event after done: {}", int(ev));
|
||||||
}
|
}
|
||||||
|
@ -200,6 +213,14 @@ namespace gui {
|
||||||
$rayview.set_level(level);
|
$rayview.set_level(level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FSM::run_systems() {
|
||||||
|
auto& level = $levels.current();
|
||||||
|
System::motion(level);
|
||||||
|
System::enemy_pathing(level);
|
||||||
|
System::collision(level);
|
||||||
|
System::death(level);
|
||||||
|
}
|
||||||
|
|
||||||
bool FSM::active() {
|
bool FSM::active() {
|
||||||
return !in_state(State::END);
|
return !in_state(State::END);
|
||||||
}
|
}
|
||||||
|
|
2
gui.hpp
2
gui.hpp
|
@ -50,6 +50,7 @@ namespace gui {
|
||||||
void IDLE(Event ev);
|
void IDLE(Event ev);
|
||||||
void END(Event ev);
|
void END(Event ev);
|
||||||
|
|
||||||
|
bool can_move(Point move_to);
|
||||||
void keyboard();
|
void keyboard();
|
||||||
void draw_weapon();
|
void draw_weapon();
|
||||||
void draw_gui();
|
void draw_gui();
|
||||||
|
@ -57,5 +58,6 @@ namespace gui {
|
||||||
void mouse();
|
void mouse();
|
||||||
void generate_map();
|
void generate_map();
|
||||||
bool active();
|
bool active();
|
||||||
|
void run_systems();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,16 +67,15 @@ 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;
|
||||||
// BUG: eventually this needs to go away too
|
// BUG: eventually this needs to go away too
|
||||||
auto& sf_sprite = $sprites.at(rec.second).sprite;
|
auto& sf_sprite = $sprites.at(rec.second).sprite;
|
||||||
auto sprite_pos = $level.world->get<components::Position>(rec.second);
|
auto sprite_pos = $level.world->get<components::Position>(rec.second);
|
||||||
|
|
||||||
double spriteX = double(sprite_pos.location.x) - $posX + 0.5;
|
double spriteX = double(sprite_pos.location.x) - $posX + 0.5;
|
||||||
double spriteY = double(sprite_pos.location.y) - $posY + 0.5;
|
double spriteY = double(sprite_pos.location.y) - $posY + 0.5;
|
||||||
|
|
||||||
//transform sprite with the inverse camera matrix
|
//transform sprite with the inverse camera matrix
|
||||||
// [ $planeX $dirX ] -1 [ $dirY -$dirX ]
|
// [ $planeX $dirX ] -1 [ $dirY -$dirX ]
|
||||||
// [ ] = 1/($planeX*$dirY-$dirX*$planeY) * [ ]
|
// [ ] = 1/($planeX*$dirY-$dirX*$planeY) * [ ]
|
||||||
|
@ -333,9 +332,10 @@ void Raycaster::set_level(GameLevel level) {
|
||||||
auto& tiles = $level.map->tiles();
|
auto& tiles = $level.map->tiles();
|
||||||
$map = $textures.convert_char_to_texture(tiles.$tile_ids);
|
$map = $textures.convert_char_to_texture(tiles.$tile_ids);
|
||||||
|
|
||||||
// this will need to go away too but for now everything is evil eye
|
$level.world->query<components::Combat, components::Position>([&](const auto ent, auto& combat, auto &pos) {
|
||||||
for(auto &thing : $level.collision->table) {
|
fmt::println("entity: {}, hp: {}, pos={},{}", ent, combat.hp, pos.location.x, pos.location.y);
|
||||||
auto sprite_txt = $textures.sprite_textures.at("evil_eye");
|
|
||||||
$sprites.try_emplace(thing.second, sprite_txt);
|
auto sprite_txt = $textures.sprite_textures.at("evil_eye");
|
||||||
}
|
$sprites.try_emplace(ent, sprite_txt);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue