The map paging is functional

This commit is contained in:
Kayne Ruse
2014-04-07 02:56:48 +10:00
parent c8a58ab515
commit 0453f6becf
3 changed files with 31 additions and 21 deletions
+27 -17
View File
@@ -90,7 +90,7 @@ InWorld::InWorld(ConfigUtility* const argConfig, UDPNetworkUtility* const argNet
network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE);
//debug //debug
RequestRegion(0, 0); // RequestRegion(0, 0);
} }
InWorld::~InWorld() { InWorld::~InWorld() {
@@ -143,9 +143,9 @@ void InWorld::RenderFrame() {
void InWorld::Render(SDL_Surface* const screen) { void InWorld::Render(SDL_Surface* const screen) {
//draw the map //draw the map
ForNearbyRegions([&](Region* const region) { for (auto it = mapPager.GetContainer()->begin(); it != mapPager.GetContainer()->end(); it++) {
tileSheet.DrawRegionTo(screen, region, camera.x, camera.y); tileSheet.DrawRegionTo(screen, *it, camera.x, camera.y);
}); }
//draw characters //draw characters
for (auto& it : playerCharacters) { for (auto& it : playerCharacters) {
@@ -469,21 +469,31 @@ int InWorld::CheckBufferDistance(Region* const region) {
} }
void InWorld::UpdateMap() { void InWorld::UpdateMap() {
//TODO //prune distant regions
for (auto it = mapPager.GetContainer()->begin(); it != mapPager.GetContainer()->end(); /* EMPTY */) {
if (CheckBufferDistance(*it) > 2) {
//debugging
cout << "unloading: " << (*it)->GetX() << ", " << (*it)->GetY() << endl;
mapPager.UnloadRegion((*it)->GetX(), (*it)->GetY());
//reset
it = mapPager.GetContainer()->begin();
continue;
}
++it;
} }
void InWorld::ForNearbyRegions(std::function<void (Region* const)> func) { //TODO: make the region units official
//TODO: switch this to "is nearby" int regionUnitX = mapPager.GetRegionWidth() * tileSheet.GetTileW();
//this is ugly int regionUnitY = mapPager.GetRegionHeight() * tileSheet.GetTileH();
for (int i = snapToBase(mapPager.GetRegionWidth() * tileSheet.GetTileW(), camera.x);
i < camera.x + camera.width; //request empty regions, including buffers (-1 & +1 region unit)
i += mapPager.GetRegionWidth() * tileSheet.GetTileW() for (int i = snapToBase(regionUnitX, camera.x - regionUnitX); i <= snapToBase(regionUnitX, camera.x + camera.width + regionUnitX); i += regionUnitX) {
) { for (int j = snapToBase(regionUnitY, camera.y - regionUnitY); j <= snapToBase(regionUnitY, camera.y + camera.height + regionUnitY); j += regionUnitY) {
for (int j = snapToBase(mapPager.GetRegionHeight() * tileSheet.GetTileH(), camera.y); if (!mapPager.FindRegion(i, j)) {
j < camera.y + camera.height; RequestRegion(i, j);
j += mapPager.GetRegionHeight() * tileSheet.GetTileH() }
) {
func(mapPager.GetRegion(i, j));
} }
} }
} }
-2
View File
@@ -47,7 +47,6 @@
#include "player_character.hpp" #include "player_character.hpp"
//STL //STL
#include <functional>
#include <map> #include <map>
class InWorld : public BaseScene { class InWorld : public BaseScene {
@@ -89,7 +88,6 @@ protected:
//utilities //utilities
int CheckBufferDistance(Region* const); int CheckBufferDistance(Region* const);
void UpdateMap(); void UpdateMap();
void ForNearbyRegions(std::function<void (Region* const)> func);
//globals //globals
ConfigUtility& config; ConfigUtility& config;
+2
View File
@@ -58,6 +58,8 @@ public:
int GetRegionWidth() const { return regionWidth; } int GetRegionWidth() const { return regionWidth; }
int GetRegionHeight() const { return regionHeight; } int GetRegionHeight() const { return regionHeight; }
int GetRegionDepth() const { return regionDepth; } int GetRegionDepth() const { return regionDepth; }
std::list<Region*>* GetContainer() { return &regionList; }
protected: protected:
int regionWidth; int regionWidth;
int regionHeight; int regionHeight;