[Add] Z-level to layers.

This commit is contained in:
Tamir Atias 2012-05-02 03:15:20 +03:00
parent 1c37fb6344
commit aba7285659
5 changed files with 59 additions and 69 deletions

View File

@ -28,47 +28,28 @@
<image source="../Img/OpenArt/Woodland_village_x2.png" width="512" height="64"/> <image source="../Img/OpenArt/Woodland_village_x2.png" width="512" height="64"/>
</tileset> </tileset>
<layer name="Ground" width="50" height="50"> <layer name="Ground" width="50" height="50">
<data encoding="base64" compression="zlib"> <data encoding="base64" compression="gzip">
eJztlF1uwjAQhK1wmKJyjVLoK7SBvhYSCneAngA4Ae1VuxKJZLnZdTY/tRHz8PklJszMziYxxiQAgLvjkRhFoCNWkM/tgtkhpxgJnfeejoPFVxI+kyYc6ThZnOGjd7KBMTmxIT6JLbEbXJ9d6Pi2+AnkI/R+gfgJ0RH0EkigH8g7NMgE2dwjT8RYwXMEmqt4Jd4UpBFkXpXlLfkotVZpaOtDyqhr1kRG5BUaVozeWfEbF/cdUkZ1e9J2N6VZpML/2e/jMtL0pG2n6/pw73W1I135KLP09ce958temp/9jOu0xoe7nxNiquBFkbM027Y+3P1cEEsF7wF8fJi/u+7u53/5kLpsM/fMhOvPg9LH0PAd43zU6aTPb1540OptMhvuu1Bnlj768qDRxd3XfGP68uB2TIK736c2AABowi8gBhQk H4sIAAAAAAAAC+2ZwQ2DMBAET1AM6SAtQAWQCkBK//+YR5QfnMwZr6N5zBOzw9o6IXdm1gkzJxYHtXOesSa2xLNxD28vtfPh0abHfk6OzkjtfFGd1M6GR77Hu897f+5z9KENHlrgoQUeWpT2iJhznjXoQws8tMBDCzx+RP0LXVmHPrTAQws8tMBDi1Y8zmZkKY+oGf9vfeBhNgnki/B4NOTiuUsv6XLH/ceXl8D3jvDY99cozuDwAABQ5wMVAhDqECcAAA==
</data> </data>
</layer> </layer>
<layer name="Above" width="50" height="50"> <layer name="Middle" width="50" height="50">
<data encoding="base64" compression="zlib"> <data encoding="base64" compression="gzip">
eJztWLluFEEQbe0Q73plYrsd8AfmDrkh5SYGc2SLJSAjMAh+CsQX8CEmdIAcUS2m5Nqiqrq6Z3uWwE8qzdVd5+uangnhBDthGRvBBxwXnePXhS1yHgfqmmWuc1iQ87nwPPbHbXbPWxMEH2/NX/Q2tpTnnB+S37XguiWUxl6CjYwPOf+myv0LXQgXQS6BXAa5AnK1+5vnbWWOhZTzRXZUHWiM1Ma5To+Dw1oHFl+8+hFvDV2a7fMsjutd+Ih2sH7v4fyDYddCSZ40Hzkkzt8AfTdBboHcBrkPcdyF4z1i5wucf+2v6XrWbNAxmKeUH28cWs+I5Jzz/QHoewjyCOQxyBOQpyDPKvPPgXlK+Ul5ugNC80RzO2NHhKeez+H6BcgeyEuQTbj3Go5v2Dieey+Hh+aplpebhu/7GZsSb3meXnVynjQQXhbFsQvS9XJG8Q3heQ9Z0PJCeUV4GSReSr5Epi/VxoqjtN6zsFzvBG1NI4bwMvZHbpNiFby1gL3ew8uoajmxifmahuX3iPDeUeOgNeVx8Hojp2iv575Q7PRzrPdwmns4CeHX5F/dwntH5C33mceh7ZUkXxIO+mM0xvK+Tdc8XfsJFm+PJ3l/sA7c5kGQIfnCxQPsB+gH5+2es5/SekyD3vOwTtHpnwWJj8kPzCHuN0v6L42j9PuLQpub63+SHznQtYXrsGS+hNx32FwZw/djGk+vKfe5nHX4SnNN88t7277gH53nrU0NEu/njWzU8NSak+ulnm/0nI4an2PFHAncf++7g/PJ6ivSPsqKOTrs57gj7f09emvt8n8GJTX15nwMWP9MvDGV/nfR1hDnFNVL58RCe17QurT8N9YaQ765/oe409oq7ZFWzLFwvOd5a9BvH44he7NW4N/pvB/HkfyoQc1/41O0xW/hXss96pj43B+PBuqRcjRkXMK6+x5C8/nnqF748Kmx/pL6rQI5Xr5boa7asWPhm/GsdB+P41v2sR8NdSccsaP2fB1ItnEtWmtm7PWU8H0NNktQ6l9rnrXGGPWwekftHE/eW8bWQnepzlbx1dTrFDb+AMmMcBk= H4sIAAAAAAAAC+2YOQ7DMBADDfhNOXs7R5/D6Z04/v8DzCJdGkHggjLEAVguuNWOoKYxxtTKvv1P5FwEG3Rvkd1vjwNyTNgndy6KDt09ckLOyAW5JuyTOxfFDd135IE8kQF5JeyTOxfFiO438kEm5IvMCfvkzhljyoLhObUrGZ4rwZUMz5XgSobnSnAlw3N2pVk7rPuu9ATrvqs9wbrvak+w7rvaE6z7bk8YY1SOZPaqHMnuVTmS3atyJLtX5cga3az+02GgfquzUL/VWajf6ixqvAfGGGPWzQIWTLt4ECcAAA==
</data> </data>
</layer> </layer>
<layer name="Trees" width="50" height="50"> <layer name="Top 1" width="50" height="50">
<data encoding="base64" compression="zlib"> <data encoding="base64" compression="gzip">
eJzt1jsOwjAMBuCEcgOYmVhYmFhYee48d57XgBvADeAEvR8TrmhUFDVq08hpVP2fFEWgysZO0iAEQHPcpBB3WfevcPegGp4NqONFNbwbUEcIFtTHJUMvZxRz7nGNdpRrn5Nv4Bh3QzG3Huu4UK4rjU/r9zlO57Fj3BPFPDP0x1aHKa5rf8ro04jSMWXKMUrjtwueczlfXGtQhel8ldmXIdVhOl/JvlRn2SSkOlxUqaMXFT/DdUeZVKljqNWRt39NdxSXbs53tr1M9m+s7V91R9XJtpehnTG1DqqXZd/nHHVMKO9UZrMNfR18/1/6t6K8a5nNNvQ9bXqf+3CgvEeZzQAAAAAAAAAAAAAQpi/3hxwT H4sIAAAAAAAAC+3YMQqAMBAEwIDP8QP+/2VWooWFhNWTYwauDLk0u5AxgBnbcs4X595w3eWY9cFes+cA6C/Rc9Vdmei5Ll159w6AWaksqcykVL536QkA/qWqI5P3VnWkboaMDv8H8gAAoIcd3uX5NRAnAAA=
</data> </data>
</layer> </layer>
<layer name="Trees 2" width="50" height="50"> <layer name="Top 2" width="50" height="50">
<data encoding="base64" compression="zlib"> <data encoding="base64" compression="gzip">
eJzt17ERgCAMBVBYTTfQDXT/HaShofDO0wuo7zUp4eeSIikxqimnNOfev7hvKRnWD+TYSob9AzkAAIB/cFM+p/ayrVeMcFPWXrb1bWov29pDxJ5FvBExCxFvRMzCCLsMAAAAwLkD/HwNtA== H4sIAAAAAAAAC+2WywmCQQyEl9+yLMESrE8twPfZ91lF7cY5eBJ0IUx2IuaDYU9h9pQvpSS/wqgrZYxMujZzbKbonyFzZIEskRWyrvzLOufFBr1bZIfskQNyRE6V/1jnvDij94JcX/03vHfkUfmPda41/V7bOS8Gxv9Y57wYGv9jnUv+C4bnlK5keC6CKxmei+BKhuciu5LhuQiuZHgugisZnktXfoe131WeYO13tSdY+13tCdZ+j+oJ1n5Xe4K139WeYO339ETijcqRrF6VI9m9Kkeye1WObNWrciS7V+XIT73WfaBy5Huv+lZnob7VWUS91Vmob3UW6ludRd7qSZIkSeLLE+dNPmEQJwAA
</data>
</layer>
<layer name="Roofs and Windows" width="50" height="50">
<data encoding="base64" compression="zlib">
eJzt1TsOwkAMRVErrILP9oEFBEio+YUaELAbXpE0iAZkmyi6R3pK55lYtsYMQzMvzBbKsvj3TX5T6t4rZa1slEqpla3z/0T3aae6e+WgHJWT0ihnp/Oy+nRRvatya+ve9X0oT6dzovv0bjqKqevVp77t7+TLfmXNZbTsuYwSvb+d7LmdOe8xc9svWXObZRz07gAAAAAAAAAAAAD47AVEdEaX
</data> </data>
</layer> </layer>
<layer name="Collision" width="50" height="50"> <layer name="Collision" width="50" height="50">
<data encoding="base64" compression="zlib"> <data encoding="base64" compression="gzip">
eJztl8ESwyAIRJP//+leemA6oIC7BhvejIemlV0QNb2upir3d2TnZeYyyHi5lYHWYsaWc5ha2TpFNFZ0Inn86jCY5SGf7exbK8bMm/xs/darZ3lA1yGSR0ZzpI/cvzvy8PiIxNR8ovaaxxsrDxSM+LP9dSnfIzQ1ndWY6L70ajLy0OqP0rHOCkadGHW3YiPvHQZe/dH6R+Iw8Xiovh5VPEiifrS9m723VkF4qNDj/5AHsi+eXgvpRT47ich6sOu9Yz13vEecmAdDI3IXN03TNE3zHqz3z9GoSOa/cUVOywPVJ5m5qJ5k9XamBitarF5YzaPK+RLVP+n8a5rmnXwA7bUBUA== H4sIAAAAAAAAC+2YMRLAIAjA9P+f7tTNwSKWtCZ3TiKYQfRsjU2v3kAiuvDQg0fEpQ/GznWzuSNr9OB4ENGDhR4s9BjnWu2rKz09Cz3Wc3g+WOjB4lSPrLd39htej297UNGDhR4s9NhHpCdneOy4C/R4t242xPMRQY9YrYr/9mzHKo+Z+ae1qjxmY6o5yeOOIw8RkT9wASZ+pOYQJwAA
</data> </data>
</layer> </layer>
<objectgroup name="Events" width="50" height="50">
<object name="NPC!!!" type="NPC" x="544" y="320" width="32" height="32">
<properties>
<property name="image" value="Player"/>
</properties>
</object>
<object name="Warp to house" type="warp" x="605" y="188" width="34" height="59">
<properties>
<property name="map" value="../Data/Map/house.tmx"/>
<property name="x" value="7"/>
<property name="y" value="13"/>
</properties>
</object>
</objectgroup>
</map> </map>

View File

@ -28,11 +28,12 @@ Level::Level(Game* game) {
_tileHeight = 0; _tileHeight = 0;
_bgm = NULL; _bgm = NULL;
_collisions = NULL; _collisions = NULL;
_middleLayer = -1;
} }
Level::~Level() { Level::~Level() {
for(std::list<Layer*>::iterator i = _layers.begin(); i != _layers.end(); ++i) { for(int i = 0; i < _layers.size(); i++) {
delete (*i); delete _layers.at(i);
} }
_layers.clear(); _layers.clear();
@ -41,8 +42,8 @@ Level::~Level() {
} }
_tilesets.clear(); _tilesets.clear();
for(std::list<NPC*>::iterator i = _npcs.begin(); i != _npcs.end(); ++i) { for(int i = 0; i < _npcs.size(); i++) {
delete (*i); delete _npcs.at(i);
} }
_npcs.clear(); _npcs.clear();
@ -52,8 +53,8 @@ Level::~Level() {
_warps.clear(); _warps.clear();
if(_collisions) { if(_collisions) {
delete[] _collisions; delete[] _collisions;
_collisions = NULL; _collisions = NULL;
} }
if(_bgm) { if(_bgm) {
@ -106,6 +107,9 @@ bool Level::Load(const std::string& filename) {
} }
continue; continue;
} }
else if(!strcasecmp(tmxLayer->GetName().c_str(), "middle")) {
_middleLayer = i;
}
Layer* layer = new Layer( Layer* layer = new Layer(
tmxLayer->GetWidth(), tmxLayer->GetHeight(), tmxLayer->GetWidth(), tmxLayer->GetHeight(),
@ -132,6 +136,10 @@ bool Level::Load(const std::string& filename) {
_layers.push_back(layer); _layers.push_back(layer);
} }
if(_middleLayer == -1) {
_middleLayer = int(std::floor(float(_layers.size()) / 2.0f)); // <-- nasty
}
for(int i = 0; i < map.GetNumObjectGroups(); i++) { for(int i = 0; i < map.GetNumObjectGroups(); i++) {
const Tmx::ObjectGroup* tmxGroup = map.GetObjectGroup(i); const Tmx::ObjectGroup* tmxGroup = map.GetObjectGroup(i);
for(int j = 0; j < tmxGroup->GetNumObjects(); j++) { for(int j = 0; j < tmxGroup->GetNumObjects(); j++) {
@ -171,20 +179,33 @@ void Level::PlayBGM() {
} }
void Level::Update(float dt) { void Level::Update(float dt) {
for(std::list<Layer*>::iterator i = _layers.begin(); i != _layers.end(); ++i) { for(int i = 0; i < _layers.size(); i++) {
(*i)->Update(dt); _layers.at(i)->Update(dt);
} }
for(std::list<NPC*>::iterator i = _npcs.begin(); i != _npcs.end(); ++i) { for(int i = 0; i < _npcs.size(); i++) {
(*i)->Update(dt); _npcs.at(i)->Update(dt);
} }
} }
void Level::Draw(int xOffset, int yOffset) { void Level::DrawBackground(int xOffset, int yOffset, float playerY) {
for(std::list<Layer*>::iterator i = _layers.begin(); i != _layers.end(); ++i) { for(int i = 0; i < (_middleLayer + 1); i++) {
(*i)->Draw(xOffset, yOffset); _layers.at(i)->Draw(xOffset, yOffset);
} }
for(std::list<NPC*>::iterator i = _npcs.begin(); i != _npcs.end(); ++i) { for(int i = 0; i < _npcs.size(); i++) {
(*i)->Render(); NPC* npc = _npcs.at(i);
if(npc->GetY() <= playerY)
npc->Render();
}
}
void Level::DrawForeground(int xOffset, int yOffset, float playerY) {
for(int i = (_middleLayer + 1); i < _layers.size(); i++) {
_layers.at(i)->Draw(xOffset, yOffset);
}
for(int i = 0; i < _npcs.size(); i++) {
NPC* npc = _npcs.at(i);
if(npc->GetY() > playerY)
npc->Render();
} }
} }

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <string> #include <string>
#include <vector>
#include <list> #include <list>
class Game; class Game;
@ -20,7 +21,8 @@ public:
void PlayBGM(void); void PlayBGM(void);
void Update(float dt); void Update(float dt);
void Draw(int xOffset, int yOffset); void DrawBackground(int xOffset, int yOffset, float playerY);
void DrawForeground(int xOffset, int yOffset, float playerY);
Game* GetGame() { return _game; } Game* GetGame() { return _game; }
@ -38,10 +40,11 @@ private:
int _height; int _height;
int _tileWidth; int _tileWidth;
int _tileHeight; int _tileHeight;
std::list<Layer*> _layers; std::vector<Layer*> _layers;
std::list<Tileset*> _tilesets; std::list<Tileset*> _tilesets;
std::list<NPC*> _npcs; std::vector<NPC*> _npcs;
std::list<Warp*> _warps; std::list<Warp*> _warps;
Music* _bgm; Music* _bgm;
bool* _collisions; bool* _collisions;
int _middleLayer;
}; };

View File

@ -40,15 +40,9 @@ Game::~Game(void) {
} }
bool Game::Init(void) { bool Game::Init(void) {
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1f);
// Return success. // Return success.
return true; return true;
} }
@ -58,7 +52,7 @@ void Game::Prepare(float dt) {
} }
void Game::Render(void) { void Game::Render(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
if(_inTitleScreen) { if(_inTitleScreen) {
RenderTitle(); RenderTitle();
} else { } else {
@ -165,12 +159,6 @@ void Game::RenderTitle(void) {
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
_titleScreen->Render(); _titleScreen->Render();
} }
@ -209,8 +197,9 @@ void Game::RenderGame(void) {
} }
// Render our shit.. // Render our shit..
_level->Draw(xOffset, yOffset); _level->DrawBackground(xOffset, yOffset, _player->GetY());
_player->Render(); _player->Render();
_level->DrawForeground(xOffset, yOffset, _player->GetY());
_testFont->SetColor(0.0f, 1.0f, 1.0f, 1.0f); _testFont->SetColor(0.0f, 1.0f, 1.0f, 1.0f);
_testFont->RenderText( _testFont->RenderText(
_player->GetX() - 5, _player->GetX() - 5,
@ -221,14 +210,11 @@ void Game::RenderGame(void) {
_player->GetY() - _testFont->GetLineSkip() - 20, _player->GetY() - _testFont->GetLineSkip() - 20,
"<Misteress of Magic>"); "<Misteress of Magic>");
glLoadIdentity();
glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
RenderHUD(); RenderHUD();
} }
void Game::RenderHUD(void) { void Game::RenderHUD(void) {
glLoadIdentity();
if(_inGameMenuShown) { if(_inGameMenuShown) {
_inGameMenu->Render(); _inGameMenu->Render();
} }

View File

@ -56,7 +56,6 @@ int main(int argc, char** argv) {
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
flags = SDL_OPENGL | SDL_HWSURFACE | SDL_RESIZABLE; flags = SDL_OPENGL | SDL_HWSURFACE | SDL_RESIZABLE;