Imported updates to the map system
This commit is contained in:
+1
-1
@@ -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
@@ -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))
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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 ®ionList.front();
|
return ®ionList.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 ®ionList.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
//something to work on
|
//something to work on
|
||||||
|
|||||||
@@ -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; }
|
||||||
Reference in New Issue
Block a user