summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2014-09-22 21:54:01 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2014-09-22 21:54:01 +0200
commitfe0c3b733abf6eac5f4b5bc18f24f8a5cda1bfc4 (patch)
tree6f96e327b37fad557bd7cba7b45911c401f98ad2
parent6e67a0f13263b748718c692b4c6481a70b127fda (diff)
downloadrpgedit-fe0c3b733abf6eac5f4b5bc18f24f8a5cda1bfc4.tar
rpgedit-fe0c3b733abf6eac5f4b5bc18f24f8a5cda1bfc4.zip
Render entities
-rw-r--r--resources/entity/square.pngbin0 -> 179 bytes
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/control/ImageLoader.cpp (renamed from src/control/TileLoader.cpp)10
-rw-r--r--src/control/ImageLoader.hpp (renamed from src/control/TileLoader.hpp)4
-rw-r--r--src/control/MapContext.cpp12
-rw-r--r--src/control/MapContext.hpp11
-rw-r--r--src/model/Direction.hpp35
-rw-r--r--src/model/Entity.hpp74
-rw-r--r--src/model/Map.cpp5
-rw-r--r--src/model/Map.hpp11
-rw-r--r--src/rpgedit.cpp3
-rw-r--r--src/view/MapView.hpp33
12 files changed, 182 insertions, 18 deletions
diff --git a/resources/entity/square.png b/resources/entity/square.png
new file mode 100644
index 0000000..97d7802
--- /dev/null
+++ b/resources/entity/square.png
Binary files differ
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 400481f..f8a2b8a 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,8 +3,8 @@ link_directories(${SDL2_LIBRARY_DIRS})
add_executable(rpgedit
rpgedit.cpp
+ control/ImageLoader.cpp
control/MapContext.cpp
- control/TileLoader.cpp
model/Map.cpp
)
set_target_properties(rpgedit PROPERTIES COMPILE_FLAGS "-std=c++11 -Wall ${SDL2_CFLAGS_OTHER}")
diff --git a/src/control/TileLoader.cpp b/src/control/ImageLoader.cpp
index 476ffa4..2e78087 100644
--- a/src/control/TileLoader.cpp
+++ b/src/control/ImageLoader.cpp
@@ -24,7 +24,7 @@
*/
-#include "TileLoader.hpp"
+#include "ImageLoader.hpp"
#include <SDL_image.h>
@@ -33,19 +33,19 @@ namespace RPGEdit {
namespace Control {
-std::unique_ptr<SDL_Surface, TileLoader::SDL_Surface_deleter> TileLoader::loadTile(const std::string &name) {
- std::string filename = "../resources/tile/" + name + ".png";
+std::unique_ptr<SDL_Surface, ImageLoader::SDL_Surface_deleter> ImageLoader::load(const std::string &name) {
+ std::string filename = "../resources/" + name + ".png";
SDL_Surface *surface = IMG_Load(filename.c_str());
return std::unique_ptr<SDL_Surface, SDL_Surface_deleter>(surface, SDL_Surface_deleter());
}
-SDL_Surface * TileLoader::get(const std::string &name) {
+SDL_Surface * ImageLoader::get(const std::string &name) {
std::unique_ptr<SDL_Surface, SDL_Surface_deleter> &surface = tiles[name];
if (!surface)
- surface = loadTile(name);
+ surface = load(name);
if (!surface)
tiles.erase(tiles.find(name));
diff --git a/src/control/TileLoader.hpp b/src/control/ImageLoader.hpp
index 9fc9dfa..36ae7cd 100644
--- a/src/control/TileLoader.hpp
+++ b/src/control/ImageLoader.hpp
@@ -36,7 +36,7 @@ namespace RPGEdit {
namespace Control {
-class TileLoader {
+class ImageLoader {
private:
class SDL_Surface_deleter {
public:
@@ -47,7 +47,7 @@ private:
std::unordered_map<std::string, std::unique_ptr<SDL_Surface, SDL_Surface_deleter>> tiles;
- std::unique_ptr<SDL_Surface, SDL_Surface_deleter> loadTile(const std::string &name);
+ std::unique_ptr<SDL_Surface, SDL_Surface_deleter> load(const std::string &name);
public:
SDL_Surface * get(const std::string &name);
diff --git a/src/control/MapContext.cpp b/src/control/MapContext.cpp
index 4d3a4d7..5fda337 100644
--- a/src/control/MapContext.cpp
+++ b/src/control/MapContext.cpp
@@ -31,14 +31,18 @@ namespace RPGEdit {
namespace Control {
-MapContext::MapContext(TileLoader *tileLoader0, const std::shared_ptr<const Model::Map> &map0)
- : tileLoader(tileLoader0), map(map0) {
+MapContext::MapContext(ImageLoader *imageLoader0, const std::shared_ptr<const Model::Map> &map0)
+ : imageLoader(imageLoader0), map(map0) {
const std::vector<std::string> &tileset = map->getTileset();
tiles.resize(tileset.size());
-
for (size_t i = 0; i < tileset.size(); i++)
- tiles[i] = tileLoader->get(tileset[i]);
+ tiles[i] = imageLoader->get("tile/" + tileset[i]);
+
+ std::deque<std::shared_ptr<Model::Entity>> &mapEntities = map->getEntities();
+
+ for (const std::shared_ptr<Model::Entity> &entity : mapEntities)
+ entities[entity->getName()] = imageLoader->get("entity/" + entity->getName());
}
}
diff --git a/src/control/MapContext.hpp b/src/control/MapContext.hpp
index 703a582..a98d818 100644
--- a/src/control/MapContext.hpp
+++ b/src/control/MapContext.hpp
@@ -26,10 +26,11 @@
#pragma once
-#include "TileLoader.hpp"
+#include "ImageLoader.hpp"
#include "../model/Map.hpp"
#include "../view/MapView.hpp"
+#include <map>
#include <memory>
@@ -39,16 +40,18 @@ namespace Control {
class MapContext {
private:
- TileLoader *const tileLoader;
+ ImageLoader *const imageLoader;
std::shared_ptr<const Model::Map> map;
+
std::vector<SDL_Surface *> tiles;
+ std::map<std::string, SDL_Surface *> entities;
public:
- MapContext(TileLoader *tileLoader0, const std::shared_ptr<const Model::Map> &map0);
+ MapContext(ImageLoader *imageLoader0, const std::shared_ptr<const Model::Map> &map0);
std::shared_ptr<View::MapView> initView(const std::shared_ptr<View::Window> &window) {
- return std::make_shared<View::MapView>(window, map, tiles);
+ return std::make_shared<View::MapView>(window, map, tiles, entities);
}
};
diff --git a/src/model/Direction.hpp b/src/model/Direction.hpp
new file mode 100644
index 0000000..c1cb269
--- /dev/null
+++ b/src/model/Direction.hpp
@@ -0,0 +1,35 @@
+/*
+ Copyright (c) 2014, Matthias Schiffer <mschiffer@universe-factory.net>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#pragma once
+
+
+enum Direction {
+ NORTH,
+ EAST,
+ SOUTH,
+ WEST,
+};
diff --git a/src/model/Entity.hpp b/src/model/Entity.hpp
new file mode 100644
index 0000000..518ce5f
--- /dev/null
+++ b/src/model/Entity.hpp
@@ -0,0 +1,74 @@
+/*
+ Copyright (c) 2014, Matthias Schiffer <mschiffer@universe-factory.net>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#pragma once
+
+
+#include "Direction.hpp"
+
+
+#include <string>
+#include <utility>
+
+
+namespace RPGEdit {
+
+namespace Model {
+
+class Entity {
+private:
+ const std::string name;
+
+ float x, y;
+
+ Direction dir;
+
+public:
+ Entity(const std::string &name0)
+ : name(name0), dir(NORTH) {
+ }
+
+ const std::string & getName() const {
+ return name;
+ }
+
+ std::pair<float, float> getPosition() const {
+ return std::pair<float, float>(x, y);
+ }
+
+ Direction getDirection() const {
+ return dir;
+ }
+
+ void move(float newX, float newY) {
+ x = newX;
+ y = newY;
+ }
+};
+
+}
+
+}
diff --git a/src/model/Map.cpp b/src/model/Map.cpp
index c31f55b..9cbe880 100644
--- a/src/model/Map.cpp
+++ b/src/model/Map.cpp
@@ -45,6 +45,11 @@ std::shared_ptr<Map> Map::load(__attribute__((unused)) const std::string &name)
}
}
+ std::shared_ptr<Entity> square(new Entity("square"));
+ square->move(6, 6);
+
+ map->entities.push_back(square);
+
return map;
}
diff --git a/src/model/Map.hpp b/src/model/Map.hpp
index 6d3ef0e..e01d9c4 100644
--- a/src/model/Map.hpp
+++ b/src/model/Map.hpp
@@ -27,10 +27,14 @@
#pragma once
#include <cstdint>
+#include <deque>
#include <memory>
#include <stdexcept>
#include <vector>
+#include "Entity.hpp"
+
+
namespace RPGEdit {
namespace Model {
@@ -42,6 +46,9 @@ private:
size_t width, height;
std::unique_ptr<uint32_t[]> tiles;
+ mutable std::deque<std::shared_ptr<Entity>> entities;
+
+
Map(size_t width0, size_t height0)
: width(width0), height(height0), tiles(new uint32_t[width*height]) {
}
@@ -55,6 +62,10 @@ public:
return tileset;
}
+ std::deque<std::shared_ptr<Entity>> & getEntities() const {
+ return entities;
+ }
+
size_t getWidth() const {
return width;
}
diff --git a/src/rpgedit.cpp b/src/rpgedit.cpp
index 32a28e9..48425e5 100644
--- a/src/rpgedit.cpp
+++ b/src/rpgedit.cpp
@@ -26,6 +26,7 @@
#include "control/MapContext.hpp"
#include "view/MapView.hpp"
+#include "model/Entity.hpp"
#include <unistd.h>
@@ -40,7 +41,7 @@ int main(__attribute__((unused)) int argc, __attribute__((unused)) char *argv[])
SDL_Init(SDL_INIT_VIDEO);
{
- Control::TileLoader tileLoader;
+ Control::ImageLoader tileLoader;
std::shared_ptr<Model::Map> map = Model::Map::load("test");
std::shared_ptr<Control::MapContext> ctx(new Control::MapContext(&tileLoader, map));
diff --git a/src/view/MapView.hpp b/src/view/MapView.hpp
index 9150753..e3fccc6 100644
--- a/src/view/MapView.hpp
+++ b/src/view/MapView.hpp
@@ -30,6 +30,7 @@
#include "../model/Map.hpp"
#include <cmath>
+#include <map>
namespace RPGEdit {
@@ -41,11 +42,13 @@ private:
std::shared_ptr<Window> window;
std::shared_ptr<const Model::Map> map;
SDL_Texture *tileTexture;
+ std::map<std::string, SDL_Texture *> entityTextures;
public:
MapView(const std::shared_ptr<Window> &window0,
const std::shared_ptr<const Model::Map> &map0,
- const std::vector<SDL_Surface *> tiles)
+ const std::vector<SDL_Surface *> &tiles,
+ const std::map<std::string, SDL_Surface *> &entities)
: window(window0), map(map0) {
uint32_t rmask, gmask, bmask, amask;
@@ -77,10 +80,17 @@ public:
tileTexture = SDL_CreateTextureFromSurface(window->getRenderer(), surface);
SDL_FreeSurface(surface);
+
+ for (const std::pair<std::string, SDL_Surface *> &entity : entities) {
+ entityTextures[entity.first] = SDL_CreateTextureFromSurface(window->getRenderer(), entity.second);
+ }
}
~MapView() {
SDL_DestroyTexture(tileTexture);
+
+ for (const std::pair<std::string, SDL_Texture *> &entity : entityTextures)
+ SDL_DestroyTexture(entity.second);
}
void render(float centerX, float centerY) {
@@ -123,6 +133,27 @@ public:
}
}
+ for (const std::shared_ptr<Model::Entity> &entity : map->getEntities()) {
+ std::pair<float, float> pos = entity->getPosition();
+ Direction dir = entity->getDirection();
+
+ SDL_Rect src = {
+ .x = 16*dir,
+ .y = 0,
+ .w = 16,
+ .h = 16,
+ };
+
+ SDL_Rect dst = {
+ .x = baseX + int(pos.first*tilePixels),
+ .y = baseY + int(pos.second*tilePixels),
+ .w = tilePixels,
+ .h = tilePixels,
+ };
+
+ SDL_RenderCopy(window->getRenderer(), entityTextures[entity->getName()], &src, &dst);
+ }
+
SDL_RenderPresent(window->getRenderer());
}
};