Split the pager class into two
I've also made the base class abstract, and the derived class a template. Hopefully this'll let me work on different parts of the class without major issues. This code compiles, but since it's incomplete, I can't test it properly.
This commit is contained in:
+36
-18
@@ -21,42 +21,60 @@
|
|||||||
*/
|
*/
|
||||||
#include "region_pager.hpp"
|
#include "region_pager.hpp"
|
||||||
|
|
||||||
RegionPager::RegionPager(int argWidth, int argHeight, int argDepth):
|
#include "utility.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
RegionPagerBase::RegionPagerBase(int argWidth, int argHeight, int argDepth):
|
||||||
regionWidth(argWidth),
|
regionWidth(argWidth),
|
||||||
regionHeight(argHeight),
|
regionHeight(argHeight),
|
||||||
regionDepth(argDepth)
|
regionDepth(argDepth)
|
||||||
{
|
{
|
||||||
//
|
//EMPTY
|
||||||
}
|
}
|
||||||
|
|
||||||
RegionPager::~RegionPager() {
|
RegionPagerBase::~RegionPagerBase() {
|
||||||
//
|
//EMPTY
|
||||||
}
|
}
|
||||||
|
|
||||||
int RegionPager::SetTile(int x, int y, int z, int v) {
|
int RegionPagerBase::SetTile(int x, int y, int z, int v) {
|
||||||
//
|
Region* ptr = GetRegion(snapToBase(regionWidth, x), snapToBase(regionHeight, y));
|
||||||
|
return ptr->SetTile(x - ptr->GetX(), y = ptr->GetY(), z, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
int RegionPager::GetTile(int x, int y, int z) {
|
int RegionPagerBase::GetTile(int x, int y, int z) {
|
||||||
//
|
Region* ptr = GetRegion(snapToBase(regionWidth, x), snapToBase(regionHeight, y));
|
||||||
|
return ptr->GetTile(x - ptr->GetX(), y = ptr->GetY(), z);
|
||||||
}
|
}
|
||||||
|
|
||||||
Region* RegionPager::GetRegion(int x, int y) {
|
Region* RegionPagerBase::GetRegion(int x, int y) {
|
||||||
//
|
//TODO: clean this up
|
||||||
|
Region* ptr = nullptr;
|
||||||
|
|
||||||
|
//find the loaded region
|
||||||
|
auto iter = std::find_if(regionList.begin(), regionList.end(), [x,y](Region& it) {
|
||||||
|
if (it.GetX() == x && it.GetY() == y)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
if (iter != regionList.end()) { //ugly hack
|
||||||
|
ptr = &(*iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegionPager::LoadRegion(int x, int y) {
|
//or load the region
|
||||||
//
|
if (!ptr) {
|
||||||
|
ptr = LoadRegion(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegionPager::SaveRegion(int x, int y) {
|
//or create the region
|
||||||
//
|
if (!ptr) {
|
||||||
|
ptr = CreateRegion(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegionPager::CreateRegion(int x, int y) {
|
return ptr;
|
||||||
//
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegionPager::UnloadRegion(int x, int y) {
|
void RegionPagerBase::Update() {
|
||||||
//
|
//TODO
|
||||||
}
|
}
|
||||||
@@ -26,31 +26,67 @@
|
|||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
class RegionPager {
|
class RegionPagerBase {
|
||||||
public:
|
public:
|
||||||
RegionPager() = delete;
|
RegionPagerBase() = delete;
|
||||||
RegionPager(int regionWidth, int regionHeight, int regionDepth);
|
RegionPagerBase(int regionWidth, int regionHeight, int regionDepth);
|
||||||
~RegionPager();
|
~RegionPagerBase();
|
||||||
|
|
||||||
int SetTile(int x, int y, int z, int v);
|
int SetTile(int x, int y, int z, int v);
|
||||||
int GetTile(int x, int y, int z);
|
int GetTile(int x, int y, int z);
|
||||||
|
|
||||||
|
void Update();
|
||||||
|
|
||||||
Region* GetRegion(int x, int y);
|
Region* GetRegion(int x, int y);
|
||||||
|
|
||||||
void LoadRegion(int x, int y);
|
//interface
|
||||||
void SaveRegion(int x, int y);
|
virtual Region* LoadRegion(int x, int y) = 0;
|
||||||
void CreateRegion(int x, int y);
|
virtual Region* SaveRegion(int x, int y) = 0;
|
||||||
void UnloadRegion(int x, int y);
|
virtual Region* CreateRegion(int x, int y) = 0;
|
||||||
|
virtual void UnloadRegion(int x, int y) = 0;
|
||||||
|
|
||||||
//accessors
|
//accessors
|
||||||
int GetRegionWidth() { return regionWidth; }
|
int GetRegionWidth() { return regionWidth; }
|
||||||
int GetRegionHeight() { return regionHeight; }
|
int GetRegionHeight() { return regionHeight; }
|
||||||
int GetRegionDepth() { return regionDepth; }
|
int GetRegionDepth() { return regionDepth; }
|
||||||
private:
|
protected:
|
||||||
const int regionWidth;
|
const int regionWidth;
|
||||||
const int regionHeight;
|
const int regionHeight;
|
||||||
const int regionDepth;
|
const int regionDepth;
|
||||||
std::list<Region> regionList;
|
std::list<Region> regionList;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename MapGenerator, typename MapFileFormat>
|
||||||
|
class RegionPager : public RegionPagerBase {
|
||||||
|
public:
|
||||||
|
Region* LoadRegion(int x, int y) {
|
||||||
|
//TODO
|
||||||
|
//if there's no region to load, return null
|
||||||
|
}
|
||||||
|
|
||||||
|
Region* SaveRegion(int x, int y) {
|
||||||
|
//TODO
|
||||||
|
//save the region using the functor
|
||||||
|
}
|
||||||
|
|
||||||
|
Region* CreateRegion(int x, int y) {
|
||||||
|
//TODO
|
||||||
|
//create the region
|
||||||
|
//DON'T call this on a non-zero region,
|
||||||
|
//or if there's a region saved to the disk
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnloadRegion(int x, int y) {
|
||||||
|
//TODO
|
||||||
|
//free the region, possibly saving it
|
||||||
|
}
|
||||||
|
|
||||||
|
//accessors
|
||||||
|
MapGenerator* GetGenerator() { return &generator; }
|
||||||
|
MapFileFormat* GetFormat() { return &format; }
|
||||||
|
protected:
|
||||||
|
MapGenerator generator;
|
||||||
|
MapFileFormat format;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user