LibD/src/Level/Level.cpp
Tamir Atias ac0b5785a3 [Add] Some stones to the tileset made by Moosader.
[Fix] Empty tiles causing game to crash.
2012-04-12 20:36:13 +03:00

117 lines
2.8 KiB
C++

#include <map>
#include <algorithm>
#include "Level.h"
#include "Layer.h"
#include "Tileset.h"
#include "../Sound/Music.h"
#include "../System/Debug.h"
#include "../TMXParser/Tmx.h"
Level::Level() {
_width = 0;
_height = 0;
_tileWidth = 0;
_tileHeight = 0;
_bgm = NULL;
}
Level::~Level() {
for(std::list<Layer*>::iterator i = _layers.begin(); i != _layers.end(); ++i) {
delete (*i);
}
_layers.clear();
for(std::list<Tileset*>::iterator i = _tilesets.begin(); i != _tilesets.end(); ++i) {
delete (*i);
}
_tilesets.clear();
if(_bgm) {
musicManager.Destroy(_bgm);
_bgm = NULL;
}
}
bool Level::Load(const std::string& filename) {
Tmx::Map map;
map.ParseFile(filename);
if(map.HasError()) {
Debug::logger->message("Error while loading level %s: %s\n", filename.c_str(), map.GetErrorText().c_str());
return false;
}
_width = map.GetWidth();
_height = map.GetHeight();
_tileWidth = map.GetTileWidth();
_tileHeight = map.GetTileHeight();
std::map<const Tmx::Tileset*, Tileset*> tilesetMap;
for(int i = 0; i < map.GetNumTilesets(); i++) {
const Tmx::Tileset* tmxTileset = map.GetTileset(i);
Tileset* tileset = new Tileset(_tileWidth, _tileHeight);
tileset->LoadImage(map.GetFilepath() + tmxTileset->GetImage()->GetSource());
_tilesets.push_back(tileset);
tilesetMap.insert(std::pair<const Tmx::Tileset*, Tileset*>(tmxTileset, tileset));
}
for(int i = 0; i < map.GetNumLayers(); i++) {
const Tmx::Layer* tmxLayer = map.GetLayer(i);
Layer* layer = new Layer(
tmxLayer->GetWidth(), tmxLayer->GetHeight(),
_tileWidth, _tileHeight);
for(int x = 0; x < layer->GetWidth(); x++) {
for(int y = 0; y < layer->GetHeight(); y++) {
Tmx::MapTile tmxTile = tmxLayer->GetTile(x, y);
const Tmx::Tileset* tmxTileset = map.FindTileset(tmxTile.gid);
MapTile tile;
if(tmxTile.gid != 0) {
tile.id = tmxTile.gid - tmxTileset->GetFirstGid();
tile.tileset = tilesetMap.find(tmxTileset)->second;
} else {
tile.id = 0;
tile.tileset = NULL;
}
layer->SetTile(x, y, tile);
}
}
_layers.push_back(layer);
}
std::map<std::string, std::string> mapProps = map.GetProperties().GetList();
for(std::map<std::string, std::string>::iterator i = mapProps.begin(); i != mapProps.end(); ++i) {
if(i->first == "BGM") {
_bgm = musicManager.Load(i->second);
}
}
return true;
}
void Level::PlayBGM() {
if(_bgm) {
Music::Play(_bgm, -1);
}
}
void Level::Update(float dt) {
for(std::list<Layer*>::iterator i = _layers.begin(); i != _layers.end(); ++i) {
(*i)->Update(dt);
}
}
void Level::Draw(int xOffset, int yOffset) {
for(std::list<Layer*>::iterator i = _layers.begin(); i != _layers.end(); ++i) {
(*i)->Draw(xOffset, yOffset);
}
}