Imported updates to the map system

This commit is contained in:
2015-07-20 13:35:10 +10:00
parent 4ced681c76
commit d2e75e02c5
7 changed files with 50 additions and 20 deletions
+1 -1
View File
@@ -4,5 +4,5 @@ all:
$(MAKE) -C graphics $(MAKE) -C graphics
$(MAKE) -C map $(MAKE) -C map
$(MAKE) -C network $(MAKE) -C network
$(MAKE) -C ui # $(MAKE) -C ui
$(MAKE) -C utilities $(MAKE) -C utilities
+1 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. ../utilities INCLUDES+=. ../graphics
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+2
View File
@@ -52,6 +52,8 @@ public:
std::bitset<REGION_WIDTH*REGION_HEIGHT>* GetSolidBitset(); std::bitset<REGION_WIDTH*REGION_HEIGHT>* GetSolidBitset();
private: private:
friend class TileSheet;
const int x; const int x;
const int y; const int y;
+15 -7
View File
@@ -23,9 +23,6 @@
#include <stdexcept> #include <stdexcept>
//DOCS: Load, Save and Create fail unless the lua function has been set
//DOCS: UnloadIf and UnloadAll will still continue without the function set
RegionPagerLua::~RegionPagerLua() { RegionPagerLua::~RegionPagerLua() {
//unload all regions //unload all regions
UnloadAll(); UnloadAll();
@@ -44,6 +41,7 @@ Region* RegionPagerLua::LoadRegion(int x, int y) {
//check if this function is available //check if this function is available
if (lua_isnil(lua, -1)) { if (lua_isnil(lua, -1)) {
lua_pop(lua, 1); lua_pop(lua, 1);
//signal that there is no load function
return nullptr; return nullptr;
} }
@@ -57,17 +55,20 @@ Region* RegionPagerLua::LoadRegion(int x, int y) {
} }
//check the return value, success or failure //check the return value, success or failure
if (lua_toboolean(lua, -1)) { if (lua_isboolean(lua, -1) && lua_toboolean(lua, -1)) {
lua_pop(lua, 1); lua_pop(lua, 1);
//push and return the loaded region
regionList.push_front(tmpRegion); regionList.push_front(tmpRegion);
return &regionList.front(); return &regionList.front();
} }
else { else {
lua_pop(lua, 1); lua_pop(lua, 1);
//signal a failure
return nullptr; return nullptr;
} }
} }
//NOTE: this return value seems strange; could replace it with a boolean
//return the saved region, or nullptr on failure //return the saved region, or nullptr on failure
Region* RegionPagerLua::SaveRegion(int x, int y) { Region* RegionPagerLua::SaveRegion(int x, int y) {
//get the pager's function from the registry //get the pager's function from the registry
@@ -76,6 +77,7 @@ Region* RegionPagerLua::SaveRegion(int x, int y) {
//check if this function is available //check if this function is available
if (lua_isnil(lua, -1)) { if (lua_isnil(lua, -1)) {
lua_pop(lua, 1); lua_pop(lua, 1);
//signal that the region wasn't saved
return nullptr; return nullptr;
} }
@@ -83,6 +85,7 @@ Region* RegionPagerLua::SaveRegion(int x, int y) {
Region* ptr = FindRegion(x, y); Region* ptr = FindRegion(x, y);
if (!ptr) { if (!ptr) {
lua_pop(lua, 1); lua_pop(lua, 1);
//signal that there is no save function
return nullptr; return nullptr;
} }
lua_pushlightuserdata(lua, ptr); lua_pushlightuserdata(lua, ptr);
@@ -93,17 +96,20 @@ Region* RegionPagerLua::SaveRegion(int x, int y) {
} }
//check the return value, success or failure //check the return value, success or failure
if (lua_toboolean(lua, -1)) { if (lua_isboolean(lua, -1) && lua_toboolean(lua, -1)) {
lua_pop(lua, 1); lua_pop(lua, 1);
//return the specified region that was saved
return ptr; return ptr;
} }
else { else {
lua_pop(lua, 1); lua_pop(lua, 1);
//signal a failure
return nullptr; return nullptr;
} }
} }
//return the created region, or nullptr on failure //DOCS: since this method is the last ditch call from GetRegion, it must return a valid region object, even if the create function hasn't been set.
//return a new region, throwing an error on failure
Region* RegionPagerLua::CreateRegion(int x, int y) { Region* RegionPagerLua::CreateRegion(int x, int y) {
if (FindRegion(x, y)) { if (FindRegion(x, y)) {
throw(std::logic_error("Cannot overwrite an existing region")); throw(std::logic_error("Cannot overwrite an existing region"));
@@ -115,7 +121,9 @@ Region* RegionPagerLua::CreateRegion(int x, int y) {
//check if this function is available //check if this function is available
if (lua_isnil(lua, -1)) { if (lua_isnil(lua, -1)) {
lua_pop(lua, 1); lua_pop(lua, 1);
return nullptr; //return an empty region object
regionList.emplace_front(x, y);
return &regionList.front();
} }
//something to work on //something to work on
+2
View File
@@ -28,6 +28,8 @@
#include <functional> #include <functional>
#include <string> #include <string>
//DOCS: set the lua hook before use
class RegionPagerLua : public RegionPagerBase { class RegionPagerLua : public RegionPagerBase {
public: public:
RegionPagerLua() = default; RegionPagerLua() = default;
@@ -21,6 +21,8 @@
*/ */
#include "tile_sheet.hpp" #include "tile_sheet.hpp"
#include <stdexcept>
TileSheet& TileSheet::operator=(TileSheet const& rhs) { TileSheet& TileSheet::operator=(TileSheet const& rhs) {
//don't screw yourself //don't screw yourself
if (this == &rhs) { if (this == &rhs) {
@@ -81,25 +83,41 @@ void TileSheet::Free() {
} }
void TileSheet::DrawLayerTo(SDL_Renderer* const renderer, Region* const region, int layer, int camX, int camY, double scaleX, double scaleY) { void TileSheet::DrawLayerTo(SDL_Renderer* const renderer, Region* const region, int layer, int camX, int camY, double scaleX, double scaleY) {
//TODO: empty //TODO: (2) empty
} }
void TileSheet::DrawRegionTo(SDL_Renderer* const renderer, Region* const region, int camX, int camY, double scaleX, double scaleY) { void TileSheet::DrawRegionTo(SDL_Renderer* const renderer, Region* const region, int camX, int camY, double scaleX, double scaleY) {
//TODO: (2) make TileSheet a friend class of Region //NOTE: TileSheet is a friend class of Region
//reimplementing DrawTo() to improve performance (less indirection)
if (!texture) {
throw(std::logic_error("No image texture to draw"));
}
//the local variables
SDL_Rect sclip = {0, 0, clip.w, clip.h};
SDL_Rect dclip = {0, 0, Uint16(clip.w * scaleX), Uint16(clip.h * scaleY)};
Region::type_t tile = 0; Region::type_t tile = 0;
//for each tile
for (register int i = 0; i < REGION_WIDTH; ++i) { for (register int i = 0; i < REGION_WIDTH; ++i) {
for (register int j = 0; j < REGION_HEIGHT; ++j) { for (register int j = 0; j < REGION_HEIGHT; ++j) {
for (register int k = 0; k < REGION_DEPTH; ++k) { for (register int k = 0; k < REGION_DEPTH; ++k) {
tile = region->GetTile(i, j, k); //get the value to skip expensive lookups
tile = region->tiles[i][j][k];
//0 is invisible //0 is invisible
if (tile == 0) continue; if (tile == 0) continue;
clip.x = (tile-1) % countX * clip.h;
clip.y = (tile-1) / countX * clip.w; //set the sclip
//TODO: (2) raw rendering; improve preformance sclip.x = (tile-1) % countX * clip.h;
Image::DrawTo(renderer, sclip.x = (tile-1) / countX * clip.w;
(region->GetX() + i) * clip.w - camX,
(region->GetY() + j) * clip.h - camY, //set the dclip
scaleX, scaleY); dclip.x = ((region->x + i) * clip.w - camX) * scaleX;
dclip.y = ((region->y + j) * clip.h - camY) * scaleY;
//draw
SDL_RenderCopy(renderer, texture, &sclip, &dclip);
} }
} }
} }
@@ -47,7 +47,7 @@ public:
void DrawRegionTo(SDL_Renderer* const renderer, Region* const region, int camX, int camY, double scaleX = 1.0, double scaleY = 1.0); void DrawRegionTo(SDL_Renderer* const renderer, Region* const region, int camX, int camY, double scaleX = 1.0, double scaleY = 1.0);
//accessors //accessors
//DOCS: reuse Image::clip for tile sizes //DOCS: Reuse Image::clip for tile sizes
int GetCountX() { return countX; } int GetCountX() { return countX; }
int GetCountY() { return countY; } int GetCountY() { return countY; }
int GetTileW() { return clip.w; } int GetTileW() { return clip.w; }