mapgen wip
This commit is contained in:
parent
70feced202
commit
79ff797cfd
11 changed files with 93 additions and 68 deletions
|
@ -1,5 +1,5 @@
|
||||||
cmake_minimum_required(VERSION 3.4)
|
cmake_minimum_required(VERSION 3.4)
|
||||||
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
|
#set(CMAKE_DISABLE_SOURCE_CHANGES ON)
|
||||||
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
|
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ execute_process(
|
||||||
file(WRITE "src/gitparams.h" "#define GIT_CUR_COMMIT ${GIT_COMMIT}")
|
file(WRITE "src/gitparams.h" "#define GIT_CUR_COMMIT ${GIT_COMMIT}")
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 11)
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -g -static-libgcc -static-libstdc++")
|
||||||
|
|
||||||
project(dungeon LANGUAGES CXX)
|
project(dungeon LANGUAGES CXX)
|
||||||
|
|
||||||
|
|
5
build.sh
Executable file
5
build.sh
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cd build
|
||||||
|
cmake .. && make -j4 && mv dungeon ..
|
||||||
|
cd ..
|
BIN
dungeon
Executable file
BIN
dungeon
Executable file
Binary file not shown.
12
src/App.cpp
12
src/App.cpp
|
@ -102,10 +102,6 @@ bool App::init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int App::start() {
|
int App::start() {
|
||||||
current = new PlayState();
|
|
||||||
current->init(this);
|
|
||||||
current->load();
|
|
||||||
|
|
||||||
double dt = 1.0/30;
|
double dt = 1.0/30;
|
||||||
double currentTime = currTime();
|
double currentTime = currTime();
|
||||||
double accumulator = dt;
|
double accumulator = dt;
|
||||||
|
@ -114,6 +110,10 @@ int App::start() {
|
||||||
bool running = true;
|
bool running = true;
|
||||||
Gamestate* nextstate = nullptr;
|
Gamestate* nextstate = nullptr;
|
||||||
|
|
||||||
|
current = new PlayState();
|
||||||
|
current->init(this);
|
||||||
|
current->load();
|
||||||
|
|
||||||
while (running) {
|
while (running) {
|
||||||
double newTime = currTime();
|
double newTime = currTime();
|
||||||
double frametime = newTime - currentTime;
|
double frametime = newTime - currentTime;
|
||||||
|
@ -136,7 +136,7 @@ int App::start() {
|
||||||
ImGuiIO &io = ImGui::GetIO();
|
ImGuiIO &io = ImGui::GetIO();
|
||||||
renderer->ImguiNewFrame();
|
renderer->ImguiNewFrame();
|
||||||
while (SDL_PollEvent(&ev)) {
|
while (SDL_PollEvent(&ev)) {
|
||||||
renderer->ImguiProcessEvents(&ev);
|
//renderer->ImguiProcessEvents(&ev);
|
||||||
switch (ev.type) {
|
switch (ev.type) {
|
||||||
case SDL_WINDOWEVENT:
|
case SDL_WINDOWEVENT:
|
||||||
switch (ev.window.event) {
|
switch (ev.window.event) {
|
||||||
|
@ -199,7 +199,7 @@ int App::start() {
|
||||||
SDL_Delay(1);
|
SDL_Delay(1);
|
||||||
}
|
}
|
||||||
delete renderer;
|
delete renderer;
|
||||||
ImGui::Shutdown();
|
//ImGui::Shutdown();
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
|
|
||||||
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Quit.");
|
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Quit.");
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include "FieldOfView.h"
|
#include "FieldOfView.h"
|
||||||
#include "Tilemap.h"
|
#include "Tilemap.h"
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
FieldOfView::FieldOfView() {
|
||||||
|
}
|
||||||
|
|
||||||
FieldOfView::FieldOfView(Tilemap *map) {
|
FieldOfView::FieldOfView(Tilemap *map) {
|
||||||
this->map = map;
|
this->map = map;
|
||||||
|
@ -20,14 +24,19 @@ void FieldOfView::calc(vec2i pos, float range) {
|
||||||
counter++;
|
counter++;
|
||||||
seen->set_tile(pos.x, pos.y, counter);
|
seen->set_tile(pos.x, pos.y, counter);
|
||||||
// Once for each octant
|
// Once for each octant
|
||||||
cast_light(1, 1.0f, 0.0f, 0, -1, -1, 0, pos.x, pos.y, range);
|
if (map != nullptr) {
|
||||||
cast_light(1, 1.0f, 0.0f, -1, 0, 0, -1, pos.x, pos.y, range);
|
cast_light(1, 1.0f, 0.0f, 0, -1, -1, 0, pos.x, pos.y, range);
|
||||||
cast_light(1, 1.0f, 0.0f, 0, 1, -1, 0, pos.x, pos.y, range);
|
cast_light(1, 1.0f, 0.0f, -1, 0, 0, -1, pos.x, pos.y, range);
|
||||||
cast_light(1, 1.0f, 0.0f, 1, 0, 0, -1, pos.x, pos.y, range);
|
cast_light(1, 1.0f, 0.0f, 0, 1, -1, 0, pos.x, pos.y, range);
|
||||||
cast_light(1, 1.0f, 0.0f, 0, -1, 1, 0, pos.x, pos.y, range);
|
cast_light(1, 1.0f, 0.0f, 1, 0, 0, -1, pos.x, pos.y, range);
|
||||||
cast_light(1, 1.0f, 0.0f, -1, 0, 0, 1, pos.x, pos.y, range);
|
cast_light(1, 1.0f, 0.0f, 0, -1, 1, 0, pos.x, pos.y, range);
|
||||||
cast_light(1, 1.0f, 0.0f, 0, 1, 1, 0, pos.x, pos.y, range);
|
cast_light(1, 1.0f, 0.0f, -1, 0, 0, 1, pos.x, pos.y, range);
|
||||||
cast_light(1, 1.0f, 0.0f, 1, 0, 0, 1, pos.x, pos.y, range);
|
cast_light(1, 1.0f, 0.0f, 0, 1, 1, 0, pos.x, pos.y, range);
|
||||||
|
cast_light(1, 1.0f, 0.0f, 1, 0, 0, 1, pos.x, pos.y, range);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Tried to calc fov with a null tilemap!\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FieldOfView::can_see(vec2i pos) {
|
bool FieldOfView::can_see(vec2i pos) {
|
||||||
|
|
|
@ -16,7 +16,8 @@ class FieldOfView {
|
||||||
void cast_light(int row, float start, float end, int xx, int xy, int yx, int yy, int startX, int startY, float radius);
|
void cast_light(int row, float start, float end, int xx, int xy, int yx, int yy, int startX, int startY, float radius);
|
||||||
public:
|
public:
|
||||||
Tilemap* seen;
|
Tilemap* seen;
|
||||||
explicit FieldOfView(Tilemap* map);
|
FieldOfView();
|
||||||
|
FieldOfView(Tilemap* map);
|
||||||
~FieldOfView();
|
~FieldOfView();
|
||||||
void calc(vec2i pos, float range);
|
void calc(vec2i pos, float range);
|
||||||
bool can_see(vec2i pos);
|
bool can_see(vec2i pos);
|
||||||
|
|
|
@ -12,6 +12,7 @@ class Gamestate {
|
||||||
protected:
|
protected:
|
||||||
App* app;
|
App* app;
|
||||||
public:
|
public:
|
||||||
|
//virtual ~Gamestate() {};
|
||||||
void init(App* app);
|
void init(App* app);
|
||||||
virtual void load() = 0;
|
virtual void load() = 0;
|
||||||
virtual Gamestate* update(double delta) = 0;
|
virtual Gamestate* update(double delta) = 0;
|
||||||
|
|
18
src/Mapgen.cpp
Normal file
18
src/Mapgen.cpp
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#include "Mapgen.h"
|
||||||
|
|
||||||
|
Tilemap generate_level(int seed, int width, int height) {
|
||||||
|
Tilemap map = Tilemap(width, height);
|
||||||
|
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
if (x == 0 || x == width || y == 0 || y == height) {
|
||||||
|
map.set_tile(x,y, '#');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
map.set_tile(x,y, '.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
4
src/Mapgen.h
Normal file
4
src/Mapgen.h
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#pragma once
|
||||||
|
#include "Tilemap.h"
|
||||||
|
|
||||||
|
Tilemap generate_level(int seed, int width, int height);
|
|
@ -8,7 +8,7 @@
|
||||||
#include "Actor.h"
|
#include "Actor.h"
|
||||||
#include "App.h"
|
#include "App.h"
|
||||||
#include "Tileset.h"
|
#include "Tileset.h"
|
||||||
#include "Tilemap.h"
|
#include "Mapgen.h"
|
||||||
#include "FieldOfView.h"
|
#include "FieldOfView.h"
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
#include "Hero.h"
|
#include "Hero.h"
|
||||||
|
@ -25,6 +25,8 @@ void PlayState::load() {
|
||||||
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Created ascii tileset.\n");
|
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Created ascii tileset.\n");
|
||||||
|
|
||||||
app->input->bind_key(SDLK_ESCAPE, ACTION_ESCAPE_MENU);
|
app->input->bind_key(SDLK_ESCAPE, ACTION_ESCAPE_MENU);
|
||||||
|
|
||||||
|
// Movement: keypad
|
||||||
app->input->bind_key(SDLK_KP_8, ACTION_MOVE_NORTH);
|
app->input->bind_key(SDLK_KP_8, ACTION_MOVE_NORTH);
|
||||||
app->input->bind_key(SDLK_KP_7, ACTION_MOVE_NORTHWEST);
|
app->input->bind_key(SDLK_KP_7, ACTION_MOVE_NORTHWEST);
|
||||||
app->input->bind_key(SDLK_KP_9, ACTION_MOVE_NORTHEAST);
|
app->input->bind_key(SDLK_KP_9, ACTION_MOVE_NORTHEAST);
|
||||||
|
@ -34,11 +36,14 @@ void PlayState::load() {
|
||||||
app->input->bind_key(SDLK_KP_1, ACTION_MOVE_SOUTHWEST);
|
app->input->bind_key(SDLK_KP_1, ACTION_MOVE_SOUTHWEST);
|
||||||
app->input->bind_key(SDLK_KP_3, ACTION_MOVE_SOUTHEAST);
|
app->input->bind_key(SDLK_KP_3, ACTION_MOVE_SOUTHEAST);
|
||||||
app->input->bind_key(SDLK_KP_5, ACTION_WAIT);
|
app->input->bind_key(SDLK_KP_5, ACTION_WAIT);
|
||||||
|
|
||||||
|
// Movement: arrow-keys
|
||||||
app->input->bind_key(SDLK_UP, ACTION_MOVE_NORTH);
|
app->input->bind_key(SDLK_UP, ACTION_MOVE_NORTH);
|
||||||
app->input->bind_key(SDLK_DOWN, ACTION_MOVE_SOUTH);
|
app->input->bind_key(SDLK_DOWN, ACTION_MOVE_SOUTH);
|
||||||
app->input->bind_key(SDLK_LEFT, ACTION_MOVE_WEST);
|
app->input->bind_key(SDLK_LEFT, ACTION_MOVE_WEST);
|
||||||
app->input->bind_key(SDLK_RIGHT, ACTION_MOVE_EAST);
|
app->input->bind_key(SDLK_RIGHT, ACTION_MOVE_EAST);
|
||||||
|
|
||||||
|
// Movement: vim-keys
|
||||||
app->input->bind_key(SDLK_k, ACTION_MOVE_NORTH);
|
app->input->bind_key(SDLK_k, ACTION_MOVE_NORTH);
|
||||||
app->input->bind_key(SDLK_y, ACTION_MOVE_NORTHWEST);
|
app->input->bind_key(SDLK_y, ACTION_MOVE_NORTHWEST);
|
||||||
app->input->bind_key(SDLK_u, ACTION_MOVE_NORTHEAST);
|
app->input->bind_key(SDLK_u, ACTION_MOVE_NORTHEAST);
|
||||||
|
@ -48,9 +53,10 @@ void PlayState::load() {
|
||||||
app->input->bind_key(SDLK_n, ACTION_MOVE_SOUTHWEST);
|
app->input->bind_key(SDLK_n, ACTION_MOVE_SOUTHWEST);
|
||||||
app->input->bind_key(SDLK_m, ACTION_MOVE_SOUTHEAST);
|
app->input->bind_key(SDLK_m, ACTION_MOVE_SOUTHEAST);
|
||||||
|
|
||||||
|
// debug
|
||||||
app->input->bind_key(SDLK_F1, ACTION_TOGGLE_DEBUG);
|
app->input->bind_key(SDLK_F1, ACTION_TOGGLE_DEBUG);
|
||||||
|
|
||||||
app->input->bind_key(SDLK_r, ACTION_RESET);
|
app->input->bind_key(SDLK_r, ACTION_RESET);
|
||||||
|
|
||||||
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Keybinds bound.\n");
|
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Keybinds bound.\n");
|
||||||
new_game();
|
new_game();
|
||||||
}
|
}
|
||||||
|
@ -58,22 +64,11 @@ void PlayState::load() {
|
||||||
void PlayState::new_game() {
|
void PlayState::new_game() {
|
||||||
action = ACTION_NONE;
|
action = ACTION_NONE;
|
||||||
|
|
||||||
if (tilemap != nullptr) {
|
|
||||||
delete tilemap;
|
|
||||||
tilemap = nullptr;
|
|
||||||
hero = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hero != nullptr) {
|
if (hero != nullptr) {
|
||||||
delete hero;
|
delete hero;
|
||||||
hero = nullptr;
|
hero = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fov != nullptr) {
|
|
||||||
delete fov;
|
|
||||||
fov = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string map =
|
std::string map =
|
||||||
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #"
|
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #"
|
||||||
"# @ . . . # # # # # # # # . . . . . . . . . . . . . . . . . # #"
|
"# @ . . . # # # # # # # # . . . . . . . . . . . . . . . . . # #"
|
||||||
|
@ -110,6 +105,7 @@ void PlayState::new_game() {
|
||||||
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #";
|
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #";
|
||||||
|
|
||||||
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Creating tilemap...\n");
|
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Creating tilemap...\n");
|
||||||
|
/*
|
||||||
tilemap = new Tilemap(32, 32);
|
tilemap = new Tilemap(32, 32);
|
||||||
int y = 0;
|
int y = 0;
|
||||||
int x = 0;
|
int x = 0;
|
||||||
|
@ -128,31 +124,36 @@ void PlayState::new_game() {
|
||||||
|
|
||||||
if (i == '@') {
|
if (i == '@') {
|
||||||
hero = new Hero(tilemap, vec2i(x, y));
|
hero = new Hero(tilemap, vec2i(x, y));
|
||||||
tilemap->add_entity(hero);
|
tilemap.add_entity(hero);
|
||||||
tilemap->set_tile(x, y, '.');
|
tilemap.set_tile(x, y, '.');
|
||||||
}
|
}
|
||||||
else if (i == 'g') {
|
else if (i == 'g') {
|
||||||
tilemap->add_entity(new Goblin(tilemap, vec2i(x, y)));
|
tilemap.add_entity(new Goblin(tilemap, vec2i(x, y)));
|
||||||
tilemap->set_tile(x, y, '.');
|
tilemap.set_tile(x, y, '.');
|
||||||
}
|
}
|
||||||
else if (i == 's') {
|
else if (i == 's') {
|
||||||
tilemap->add_entity(new Shaman(tilemap, vec2i(x, y)));
|
tilemap.add_entity(new Shaman(tilemap, vec2i(x, y)));
|
||||||
tilemap->set_tile(x, y, '.');
|
tilemap.set_tile(x, y, '.');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tilemap->set_tile(x, y, i);
|
tilemap.set_tile(x, y, i);
|
||||||
}
|
}
|
||||||
x++;
|
x++;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
tilemap = generate_level(1, 32, 32);
|
||||||
|
hero = new Hero(&tilemap, vec2i(4,4));
|
||||||
|
tilemap.add_entity(hero);
|
||||||
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Done.\n");
|
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Done.\n");
|
||||||
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Calculating initial FOV...\n");
|
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Calculating initial FOV...\n");
|
||||||
fov = new FieldOfView(tilemap);
|
fov = FieldOfView(&tilemap);
|
||||||
fov->calc(hero->get_position(), 6);
|
fov.calc(hero->get_position(), 6);
|
||||||
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Done.\n");
|
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Done.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
Gamestate *PlayState::update(double delta) {
|
Gamestate *PlayState::update(double delta) {
|
||||||
if (action != ACTION_NONE) {
|
if (action != ACTION_NONE) {
|
||||||
|
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Starting turn...\n");
|
||||||
if (hero && hero->is_alive()) {
|
if (hero && hero->is_alive()) {
|
||||||
vec2i dir;
|
vec2i dir;
|
||||||
switch (action) {
|
switch (action) {
|
||||||
|
@ -165,13 +166,14 @@ Gamestate *PlayState::update(double delta) {
|
||||||
case ACTION_MOVE_SOUTHWEST: dir = {-1, 1}; break;
|
case ACTION_MOVE_SOUTHWEST: dir = {-1, 1}; break;
|
||||||
case ACTION_MOVE_SOUTHEAST: dir = {1, 1}; break;
|
case ACTION_MOVE_SOUTHEAST: dir = {1, 1}; break;
|
||||||
case ACTION_WAIT: dir = {0, 0}; break;
|
case ACTION_WAIT: dir = {0, 0}; break;
|
||||||
default: action = ACTION_NONE; return nullptr; // abort turn
|
default: action = ACTION_NONE; SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Turn aborted: no player action.\n"); return nullptr; // abort turn
|
||||||
}
|
}
|
||||||
if (dir != vec2i(0,0)) {
|
if (dir != vec2i(0,0)) {
|
||||||
if (!hero->move(dir.x, dir.y)) {
|
if (!hero->move(dir.x, dir.y)) {
|
||||||
vec2i heropos = hero->get_position();
|
vec2i heropos = hero->get_position();
|
||||||
auto acts = tilemap->get_entities(heropos.x + dir.x, heropos.y + dir.y, 0, ENTITY_ACTOR);
|
auto acts = tilemap.get_entities(heropos.x + dir.x, heropos.y + dir.y, 0, ENTITY_ACTOR);
|
||||||
if(acts.empty()) {
|
if(acts.empty()) {
|
||||||
|
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Turn aborted: invalid player action.\n");
|
||||||
return nullptr; // unable to move and nothing to attack == abort turn
|
return nullptr; // unable to move and nothing to attack == abort turn
|
||||||
}
|
}
|
||||||
for (auto ent : acts) {
|
for (auto ent : acts) {
|
||||||
|
@ -184,10 +186,10 @@ Gamestate *PlayState::update(double delta) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hero->update();
|
hero->update();
|
||||||
fov->calc(hero->get_position(), 6);
|
fov.calc(hero->get_position(), 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto actors = tilemap->get_entity_list();
|
auto actors = tilemap.get_entity_list();
|
||||||
for (Entity* var : *actors) {
|
for (Entity* var : *actors) {
|
||||||
if (var == hero) continue;
|
if (var == hero) continue;
|
||||||
if (var->entity_type() == ENTITY_ACTOR) {
|
if (var->entity_type() == ENTITY_ACTOR) {
|
||||||
|
@ -207,6 +209,7 @@ Gamestate *PlayState::update(double delta) {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
action = ACTION_NONE;
|
action = ACTION_NONE;
|
||||||
|
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Turn finished.\n");
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -242,7 +245,7 @@ void PlayState::draw(double delta) {
|
||||||
if (debug_actors) {
|
if (debug_actors) {
|
||||||
ImGui::Begin("Actors", &debug_actors);
|
ImGui::Begin("Actors", &debug_actors);
|
||||||
|
|
||||||
auto actors = tilemap->get_entity_list();
|
auto actors = tilemap.get_entity_list();
|
||||||
const char* headers[] {
|
const char* headers[] {
|
||||||
"id", "name", "health", "strength"
|
"id", "name", "health", "strength"
|
||||||
};
|
};
|
||||||
|
@ -283,17 +286,16 @@ void PlayState::draw(double delta) {
|
||||||
(tilesize.x/2-heropos.x),
|
(tilesize.x/2-heropos.x),
|
||||||
(tilesize.y/2-heropos.y),
|
(tilesize.y/2-heropos.y),
|
||||||
};
|
};
|
||||||
|
tilemap.draw(app->renderer, ascii, margin.x, margin.y, -offset.x, -offset.y, tilesize.x, tilesize.y, &fov);
|
||||||
|
|
||||||
tilemap->draw(app->renderer, ascii, margin.x, margin.y, -offset.x, -offset.y, tilesize.x, tilesize.y, fov);
|
auto entities = tilemap.get_entity_list();
|
||||||
|
|
||||||
auto entities = tilemap->get_entity_list();
|
|
||||||
|
|
||||||
// Draw dead actors
|
// Draw dead actors
|
||||||
for (Entity* var : *entities) {
|
for (Entity* var : *entities) {
|
||||||
if (var->entity_type() == ENTITY_ACTOR && ((Actor*)var)->is_alive()) continue;
|
if (var->entity_type() == ENTITY_ACTOR && ((Actor*)var)->is_alive()) continue;
|
||||||
|
|
||||||
vec2i pos = var->get_position();
|
vec2i pos = var->get_position();
|
||||||
if ((fov == nullptr || fov->can_see(pos))) {
|
if (fov.can_see(pos)) {
|
||||||
|
|
||||||
app->renderer->set_color(0, 0, 0, 1);
|
app->renderer->set_color(0, 0, 0, 1);
|
||||||
app->renderer->draw_sprite(ascii->get_sprite(219), margin.x + (offset.x + pos.x) * asciisize.x, margin.y + (offset.y + pos.y) * asciisize.y);
|
app->renderer->draw_sprite(ascii->get_sprite(219), margin.x + (offset.x + pos.x) * asciisize.x, margin.y + (offset.y + pos.y) * asciisize.y);
|
||||||
|
@ -311,7 +313,7 @@ void PlayState::draw(double delta) {
|
||||||
if (var->entity_type() == ENTITY_ACTOR && !((Actor*)var)->is_alive()) continue;
|
if (var->entity_type() == ENTITY_ACTOR && !((Actor*)var)->is_alive()) continue;
|
||||||
|
|
||||||
vec2i pos = var->get_position();
|
vec2i pos = var->get_position();
|
||||||
if ((fov == nullptr || fov->can_see(pos))) {
|
if (fov.can_see(pos)) {
|
||||||
|
|
||||||
app->renderer->set_color(0, 0, 0, 1);
|
app->renderer->set_color(0, 0, 0, 1);
|
||||||
app->renderer->draw_sprite(ascii->get_sprite(219), margin.x + (offset.x + pos.x) * asciisize.x, margin.y + (offset.y + pos.y) * asciisize.y);
|
app->renderer->draw_sprite(ascii->get_sprite(219), margin.x + (offset.x + pos.x) * asciisize.x, margin.y + (offset.y + pos.y) * asciisize.y);
|
||||||
|
@ -335,21 +337,6 @@ void PlayState::draw(double delta) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayState::quit() {
|
void PlayState::quit() {
|
||||||
if (tilemap != nullptr) {
|
|
||||||
delete tilemap;
|
|
||||||
tilemap = nullptr;
|
|
||||||
hero = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hero != nullptr) {
|
|
||||||
delete hero;
|
|
||||||
hero = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fov != nullptr) {
|
|
||||||
delete fov;
|
|
||||||
fov = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayState::inputevent(InputEvent *event) {
|
void PlayState::inputevent(InputEvent *event) {
|
||||||
|
|
|
@ -7,17 +7,17 @@
|
||||||
|
|
||||||
|
|
||||||
#include "Gamestate.h"
|
#include "Gamestate.h"
|
||||||
|
#include "Tilemap.h"
|
||||||
|
#include "FieldOfView.h"
|
||||||
|
|
||||||
class Tileset;
|
class Tileset;
|
||||||
class Tilemap;
|
|
||||||
class Actor;
|
class Actor;
|
||||||
class FieldOfView;
|
|
||||||
|
|
||||||
class PlayState : public Gamestate {
|
class PlayState : public Gamestate {
|
||||||
Tileset* ascii;
|
Tileset* ascii;
|
||||||
Tilemap* tilemap;
|
Tilemap tilemap;
|
||||||
Actor * hero;
|
Actor * hero;
|
||||||
FieldOfView *fov;
|
FieldOfView fov;
|
||||||
|
|
||||||
bool debug;
|
bool debug;
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue