93 lines
1.7 KiB
C++
93 lines
1.7 KiB
C++
#include <SDL3/SDL.h>
|
|
#include "libtcod.hpp"
|
|
#include "Actor.h"
|
|
#include "Map.h"
|
|
#include "Engine.h"
|
|
|
|
|
|
|
|
Engine::Engine(tcod::Context *context, tcod::Console *console) {
|
|
this->context = context;
|
|
this->console = console;
|
|
map = nullptr;
|
|
player = nullptr;
|
|
fovRadius = 10;
|
|
computeFov = true;
|
|
}
|
|
|
|
void Engine::init() {
|
|
player = new Actor(40, 25, "@", TCOD_ColorRGB(255, 255, 255));
|
|
actors.push(player);
|
|
map = new Map(80, 45);
|
|
}
|
|
|
|
Engine::~Engine() {
|
|
actors.clearAndDelete();
|
|
delete map;
|
|
}
|
|
|
|
bool Engine::update() {
|
|
SDL_Event event;
|
|
while (SDL_PollEvent(&event)) {
|
|
context->convert_event_coordinates(event);
|
|
switch (event.type) {
|
|
case SDL_EVENT_KEY_DOWN:
|
|
switch (event.key.key) {
|
|
case SDLK_UP:
|
|
if (!map->isWall(player->x, player->y - 1)) {
|
|
player->y--;
|
|
computeFov = true;
|
|
}
|
|
break;
|
|
case SDLK_DOWN:
|
|
if (!map->isWall(player->x, player->y + 1)) {
|
|
player->y++;
|
|
computeFov = true;
|
|
}
|
|
break;
|
|
case SDLK_LEFT:
|
|
if (!map->isWall(player->x - 1, player->y)) {
|
|
player->x--;
|
|
computeFov = true;
|
|
}
|
|
break;
|
|
case SDLK_RIGHT:
|
|
if (!map->isWall(player->x + 1, player->y)) {
|
|
player->x++;
|
|
computeFov = true;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case SDL_EVENT_QUIT:
|
|
return false;
|
|
default:
|
|
break;
|
|
}
|
|
if (computeFov) {
|
|
map->computeFov();
|
|
computeFov = false;
|
|
}
|
|
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void Engine::render() {
|
|
console->clear();
|
|
// draw the map
|
|
map->render(*console);
|
|
|
|
// draw the actors
|
|
for (Actor** iterator = actors.begin();
|
|
iterator != actors.end(); iterator++) {
|
|
Actor* actor = *iterator;
|
|
if (map->isInFov(actor->x, actor->y)) {
|
|
actor->render(*console);
|
|
}
|
|
}
|
|
context->present(*console);
|
|
}
|