Render entities
This commit is contained in:
parent
6e67a0f132
commit
fe0c3b733a
12 changed files with 182 additions and 18 deletions
BIN
resources/entity/square.png
Normal file
BIN
resources/entity/square.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 179 B |
|
@ -3,8 +3,8 @@ link_directories(${SDL2_LIBRARY_DIRS})
|
||||||
|
|
||||||
add_executable(rpgedit
|
add_executable(rpgedit
|
||||||
rpgedit.cpp
|
rpgedit.cpp
|
||||||
|
control/ImageLoader.cpp
|
||||||
control/MapContext.cpp
|
control/MapContext.cpp
|
||||||
control/TileLoader.cpp
|
|
||||||
model/Map.cpp
|
model/Map.cpp
|
||||||
)
|
)
|
||||||
set_target_properties(rpgedit PROPERTIES COMPILE_FLAGS "-std=c++11 -Wall ${SDL2_CFLAGS_OTHER}")
|
set_target_properties(rpgedit PROPERTIES COMPILE_FLAGS "-std=c++11 -Wall ${SDL2_CFLAGS_OTHER}")
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "TileLoader.hpp"
|
#include "ImageLoader.hpp"
|
||||||
|
|
||||||
#include <SDL_image.h>
|
#include <SDL_image.h>
|
||||||
|
|
||||||
|
@ -33,19 +33,19 @@ namespace RPGEdit {
|
||||||
|
|
||||||
namespace Control {
|
namespace Control {
|
||||||
|
|
||||||
std::unique_ptr<SDL_Surface, TileLoader::SDL_Surface_deleter> TileLoader::loadTile(const std::string &name) {
|
std::unique_ptr<SDL_Surface, ImageLoader::SDL_Surface_deleter> ImageLoader::load(const std::string &name) {
|
||||||
std::string filename = "../resources/tile/" + name + ".png";
|
std::string filename = "../resources/" + name + ".png";
|
||||||
|
|
||||||
SDL_Surface *surface = IMG_Load(filename.c_str());
|
SDL_Surface *surface = IMG_Load(filename.c_str());
|
||||||
|
|
||||||
return std::unique_ptr<SDL_Surface, SDL_Surface_deleter>(surface, SDL_Surface_deleter());
|
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];
|
std::unique_ptr<SDL_Surface, SDL_Surface_deleter> &surface = tiles[name];
|
||||||
|
|
||||||
if (!surface)
|
if (!surface)
|
||||||
surface = loadTile(name);
|
surface = load(name);
|
||||||
|
|
||||||
if (!surface)
|
if (!surface)
|
||||||
tiles.erase(tiles.find(name));
|
tiles.erase(tiles.find(name));
|
|
@ -36,7 +36,7 @@ namespace RPGEdit {
|
||||||
|
|
||||||
namespace Control {
|
namespace Control {
|
||||||
|
|
||||||
class TileLoader {
|
class ImageLoader {
|
||||||
private:
|
private:
|
||||||
class SDL_Surface_deleter {
|
class SDL_Surface_deleter {
|
||||||
public:
|
public:
|
||||||
|
@ -47,7 +47,7 @@ private:
|
||||||
|
|
||||||
std::unordered_map<std::string, std::unique_ptr<SDL_Surface, SDL_Surface_deleter>> tiles;
|
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:
|
public:
|
||||||
SDL_Surface * get(const std::string &name);
|
SDL_Surface * get(const std::string &name);
|
|
@ -31,14 +31,18 @@ namespace RPGEdit {
|
||||||
|
|
||||||
namespace Control {
|
namespace Control {
|
||||||
|
|
||||||
MapContext::MapContext(TileLoader *tileLoader0, const std::shared_ptr<const Model::Map> &map0)
|
MapContext::MapContext(ImageLoader *imageLoader0, const std::shared_ptr<const Model::Map> &map0)
|
||||||
: tileLoader(tileLoader0), map(map0) {
|
: imageLoader(imageLoader0), map(map0) {
|
||||||
const std::vector<std::string> &tileset = map->getTileset();
|
const std::vector<std::string> &tileset = map->getTileset();
|
||||||
|
|
||||||
tiles.resize(tileset.size());
|
tiles.resize(tileset.size());
|
||||||
|
|
||||||
for (size_t i = 0; i < tileset.size(); i++)
|
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,10 +26,11 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "TileLoader.hpp"
|
#include "ImageLoader.hpp"
|
||||||
#include "../model/Map.hpp"
|
#include "../model/Map.hpp"
|
||||||
#include "../view/MapView.hpp"
|
#include "../view/MapView.hpp"
|
||||||
|
|
||||||
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,16 +40,18 @@ namespace Control {
|
||||||
|
|
||||||
class MapContext {
|
class MapContext {
|
||||||
private:
|
private:
|
||||||
TileLoader *const tileLoader;
|
ImageLoader *const imageLoader;
|
||||||
|
|
||||||
std::shared_ptr<const Model::Map> map;
|
std::shared_ptr<const Model::Map> map;
|
||||||
|
|
||||||
std::vector<SDL_Surface *> tiles;
|
std::vector<SDL_Surface *> tiles;
|
||||||
|
std::map<std::string, SDL_Surface *> entities;
|
||||||
|
|
||||||
public:
|
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) {
|
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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
35
src/model/Direction.hpp
Normal file
35
src/model/Direction.hpp
Normal file
|
@ -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,
|
||||||
|
};
|
74
src/model/Entity.hpp
Normal file
74
src/model/Entity.hpp
Normal file
|
@ -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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,10 +27,14 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <deque>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "Entity.hpp"
|
||||||
|
|
||||||
|
|
||||||
namespace RPGEdit {
|
namespace RPGEdit {
|
||||||
|
|
||||||
namespace Model {
|
namespace Model {
|
||||||
|
@ -42,6 +46,9 @@ private:
|
||||||
size_t width, height;
|
size_t width, height;
|
||||||
std::unique_ptr<uint32_t[]> tiles;
|
std::unique_ptr<uint32_t[]> tiles;
|
||||||
|
|
||||||
|
mutable std::deque<std::shared_ptr<Entity>> entities;
|
||||||
|
|
||||||
|
|
||||||
Map(size_t width0, size_t height0)
|
Map(size_t width0, size_t height0)
|
||||||
: width(width0), height(height0), tiles(new uint32_t[width*height]) {
|
: width(width0), height(height0), tiles(new uint32_t[width*height]) {
|
||||||
}
|
}
|
||||||
|
@ -55,6 +62,10 @@ public:
|
||||||
return tileset;
|
return tileset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::deque<std::shared_ptr<Entity>> & getEntities() const {
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
|
||||||
size_t getWidth() const {
|
size_t getWidth() const {
|
||||||
return width;
|
return width;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include "control/MapContext.hpp"
|
#include "control/MapContext.hpp"
|
||||||
#include "view/MapView.hpp"
|
#include "view/MapView.hpp"
|
||||||
|
#include "model/Entity.hpp"
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
@ -40,7 +41,7 @@ int main(__attribute__((unused)) int argc, __attribute__((unused)) char *argv[])
|
||||||
SDL_Init(SDL_INIT_VIDEO);
|
SDL_Init(SDL_INIT_VIDEO);
|
||||||
|
|
||||||
{
|
{
|
||||||
Control::TileLoader tileLoader;
|
Control::ImageLoader tileLoader;
|
||||||
std::shared_ptr<Model::Map> map = Model::Map::load("test");
|
std::shared_ptr<Model::Map> map = Model::Map::load("test");
|
||||||
|
|
||||||
std::shared_ptr<Control::MapContext> ctx(new Control::MapContext(&tileLoader, map));
|
std::shared_ptr<Control::MapContext> ctx(new Control::MapContext(&tileLoader, map));
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "../model/Map.hpp"
|
#include "../model/Map.hpp"
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
|
||||||
namespace RPGEdit {
|
namespace RPGEdit {
|
||||||
|
@ -41,11 +42,13 @@ private:
|
||||||
std::shared_ptr<Window> window;
|
std::shared_ptr<Window> window;
|
||||||
std::shared_ptr<const Model::Map> map;
|
std::shared_ptr<const Model::Map> map;
|
||||||
SDL_Texture *tileTexture;
|
SDL_Texture *tileTexture;
|
||||||
|
std::map<std::string, SDL_Texture *> entityTextures;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MapView(const std::shared_ptr<Window> &window0,
|
MapView(const std::shared_ptr<Window> &window0,
|
||||||
const std::shared_ptr<const Model::Map> &map0,
|
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) {
|
: window(window0), map(map0) {
|
||||||
uint32_t rmask, gmask, bmask, amask;
|
uint32_t rmask, gmask, bmask, amask;
|
||||||
|
|
||||||
|
@ -77,10 +80,17 @@ public:
|
||||||
|
|
||||||
tileTexture = SDL_CreateTextureFromSurface(window->getRenderer(), surface);
|
tileTexture = SDL_CreateTextureFromSurface(window->getRenderer(), surface);
|
||||||
SDL_FreeSurface(surface);
|
SDL_FreeSurface(surface);
|
||||||
|
|
||||||
|
for (const std::pair<std::string, SDL_Surface *> &entity : entities) {
|
||||||
|
entityTextures[entity.first] = SDL_CreateTextureFromSurface(window->getRenderer(), entity.second);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
~MapView() {
|
~MapView() {
|
||||||
SDL_DestroyTexture(tileTexture);
|
SDL_DestroyTexture(tileTexture);
|
||||||
|
|
||||||
|
for (const std::pair<std::string, SDL_Texture *> &entity : entityTextures)
|
||||||
|
SDL_DestroyTexture(entity.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void render(float centerX, float centerY) {
|
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());
|
SDL_RenderPresent(window->getRenderer());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Reference in a new issue