From 89d50ea8fba56fb400f322be56ee76daf5219efe Mon Sep 17 00:00:00 2001 From: Tamir Atias Date: Thu, 12 Apr 2012 03:07:45 +0300 Subject: [PATCH] [Add] Level loading! --- Bin/VC10/VC10.vcxproj | 2 + Bin/VC10/VC10.vcxproj.filters | 6 +++ Data/Img/AwesomeTileset.png | Bin 23444 -> 23444 bytes LibDQt/LibDQt.pro | 47 +++++++++++++++++-- src/Level/Layer.cpp | 32 +++++++++++++ src/Level/Layer.h | 27 +++++++++++ src/Level/Level.cpp | 85 ++++++++++++++++++++++++++++++++++ src/Level/Level.h | 29 ++++++++++++ src/Level/MapTile.h | 8 ++++ src/Level/Tileset.cpp | 41 ++++++++++++++++ src/Level/Tileset.h | 22 +++++++++ src/Main/Game.cpp | 14 +++++- src/Sprite/Sprite.cpp | 2 +- 13 files changed, 309 insertions(+), 6 deletions(-) create mode 100644 src/Level/Layer.cpp create mode 100644 src/Level/Layer.h create mode 100644 src/Level/Level.cpp create mode 100644 src/Level/Level.h create mode 100644 src/Level/MapTile.h create mode 100644 src/Level/Tileset.cpp create mode 100644 src/Level/Tileset.h diff --git a/Bin/VC10/VC10.vcxproj b/Bin/VC10/VC10.vcxproj index 4046f56..c0ff780 100644 --- a/Bin/VC10/VC10.vcxproj +++ b/Bin/VC10/VC10.vcxproj @@ -93,6 +93,7 @@ + @@ -127,6 +128,7 @@ + diff --git a/Bin/VC10/VC10.vcxproj.filters b/Bin/VC10/VC10.vcxproj.filters index 39acd67..88db6ab 100644 --- a/Bin/VC10/VC10.vcxproj.filters +++ b/Bin/VC10/VC10.vcxproj.filters @@ -147,6 +147,9 @@ System + + Level + @@ -230,5 +233,8 @@ Level + + Level + \ No newline at end of file diff --git a/Data/Img/AwesomeTileset.png b/Data/Img/AwesomeTileset.png index f8d3761c2d080e9696f4607601addc59063cc89b..41bbe3a08080ef46c483cfe1b48a2d6a090aed82 100644 GIT binary patch delta 23 fcmbQTopH)`#tAlD0t^h?0*q^w_m*yS^NR)mSMmov delta 23 fcmbQTopH)`#tAlDLJSPtLX4O0*8SP&<`)eBUx^54 diff --git a/LibDQt/LibDQt.pro b/LibDQt/LibDQt.pro index f69212b..c57aeed 100644 --- a/LibDQt/LibDQt.pro +++ b/LibDQt/LibDQt.pro @@ -5,7 +5,9 @@ LIBS += -lGL \ -lSDL_image \ -lSDL_gfx \ -ltinyxml \ - -lGLU + -lGLU \ + -lz \ + -ltinyxml HEADERS += ../src/Actor/Player.h \ ../src/Global/Globals.h \ ../src/IO/Input.h \ @@ -20,7 +22,28 @@ HEADERS += ../src/Actor/Player.h \ ../src/System/ResourceManager.h \ ../src/Texture/Texture.h \ ../src/Global/Constants.h \ - ../src/Collision/AABB.h + ../src/Collision/AABB.h \ + ../src/Level/Level.h \ + ../src/Level/MapTile.h \ + ../src/Level/Map.h \ + ../src/Level/Layer.h \ + ../src/Level/Tileset.h \ + ../src/Level/Layer.h \ + ../src/TMXParser/base64.h \ + ../src/TMXParser/Tmx.h \ + ../src/TMXParser/TmxImage.h \ + ../src/TMXParser/TmxLayer.h \ + ../src/TMXParser/TmxMap.h \ + ../src/TMXParser/TmxMapTile.h \ + ../src/TMXParser/TmxObject.h \ + ../src/TMXParser/TmxObjectGroup.h \ + ../src/TMXParser/TmxPoint.h \ + ../src/TMXParser/TmxPolygon.h \ + ../src/TMXParser/TmxPolyline.h \ + ../src/TMXParser/TmxPropertySet.h \ + ../src/TMXParser/TmxTile.h \ + ../src/TMXParser/TmxTileset.h \ + ../src/TMXParser/TmxUtil.h SOURCES += ../src/Actor/Player.cpp \ ../src/Global/Globals.cpp \ ../src/IO/Input.cpp \ @@ -33,5 +56,23 @@ SOURCES += ../src/Actor/Player.cpp \ ../src/Sprite/Sprite.cpp \ ../src/System/Debug.cpp \ ../src/Texture/Texture.cpp \ - ../src/Collision/AABB.cpp + ../src/Collision/AABB.cpp \ + ../src/Level/Level.h \ + ../src/Level/MapTile.h \ + ../src/Level/Map.h \ + ../src/Level/Layer.h \ + ../src/Level/Tileset.h \ + ../src/Level/Layer.h \ + ../src/TMXParser/base64.cpp \ + ../src/TMXParser/TmxImage.cpp \ + ../src/TMXParser/TmxLayer.cpp \ + ../src/TMXParser/TmxMap.cpp \ + ../src/TMXParser/TmxObject.cpp \ + ../src/TMXParser/TmxObjectGroup.cpp \ + ../src/TMXParser/TmxPolygon.cpp \ + ../src/TMXParser/TmxPolyline.cpp \ + ../src/TMXParser/TmxPropertySet.cpp \ + ../src/TMXParser/TmxTile.cpp \ + ../src/TMXParser/TmxTileset.cpp \ + ../src/TMXParser/TmxUtil.cpp OTHER_FILES += diff --git a/src/Level/Layer.cpp b/src/Level/Layer.cpp new file mode 100644 index 0000000..30eaa9d --- /dev/null +++ b/src/Level/Layer.cpp @@ -0,0 +1,32 @@ +#include "Layer.h" +#include "Tileset.h" + +Layer::Layer(int width, int height, int tileWidth, int tileHeight) { + _width = width; + _height = height; + _tileWidth = tileWidth; + _tileHeight = tileHeight; + _tileMap = new MapTile[width * height]; +} + +Layer::~Layer() { + delete[] _tileMap; +} + +void Layer::Update(float dt) { + for(int x = 0; x < _width; x++) { + for(int y = 0; y < _height; y++) { + } + } +} + +void Layer::Draw() { + for(int x = 0; x < _width; x++) { + for(int y = 0; y < _height; y++) { + MapTile& tile = GetTile(x, y); + tile.tileset->DrawTile(tile.id, Vec2((float)x * _tileWidth, (float)y * _tileHeight)); + } + } +} + + diff --git a/src/Level/Layer.h b/src/Level/Layer.h new file mode 100644 index 0000000..1b13508 --- /dev/null +++ b/src/Level/Layer.h @@ -0,0 +1,27 @@ +#pragma once + +#include "MapTile.h" + +class Layer { +public: + Layer(int width, int height, int tileWidth, int tileHeight); + ~Layer(); + + void Update(float dt); + void Draw(); + + int GetWidth() const { return _width; } + int GetHeight() const { return _height; } + int GetTileWidth() const { return _tileWidth; } + int GetTileHeight() const { return _tileHeight; } + + MapTile& GetTile(int x, int y) { return _tileMap[y * _width + x]; } + void SetTile(int x, int y, const MapTile& tile) { _tileMap[y * _width + x] = tile; } + +private: + int _width; + int _height; + int _tileWidth; + int _tileHeight; + MapTile* _tileMap; +}; \ No newline at end of file diff --git a/src/Level/Level.cpp b/src/Level/Level.cpp new file mode 100644 index 0000000..fc72fec --- /dev/null +++ b/src/Level/Level.cpp @@ -0,0 +1,85 @@ +#include +#include "Level.h" +#include "Layer.h" +#include "Tileset.h" +#include "../System/Debug.h" +#include "../TMXParser/Tmx.h" + +Level::Level() { + _width = 0; + _height = 0; + _tileWidth = 0; + _tileHeight = 0; +} + +Level::~Level() { + for(std::list::iterator i = _layers.begin(); i != _layers.end(); ++i) { + delete (*i); + } + _layers.clear(); + + for(std::list::iterator i = _tilesets.begin(); i != _tilesets.end(); ++i) { + delete (*i); + } + _tilesets.clear(); +} + +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 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(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; + tile.id = tmxTile.gid - tmxTileset->GetFirstGid(); + tile.tileset = tilesetMap.find(tmxTileset)->second; + + layer->SetTile(x, y, tile); + } + } + + _layers.push_back(layer); + } + + return true; +} + +void Level::Draw() { + for(std::list::iterator i = _layers.begin(); i != _layers.end(); ++i) { + (*i)->Draw(); + } +} diff --git a/src/Level/Level.h b/src/Level/Level.h new file mode 100644 index 0000000..07c33e4 --- /dev/null +++ b/src/Level/Level.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +class Layer; +class Tileset; + +class Level { +public: + Level(); + ~Level(); + + bool Load(const std::string& filename); + + void Update(float dt); + void Draw(); + + int GetWidth() const { return _width; } + int GetHeight() const { return _height; } + +private: + int _width; + int _height; + int _tileWidth; + int _tileHeight; + std::list _layers; + std::list _tilesets; +}; diff --git a/src/Level/MapTile.h b/src/Level/MapTile.h new file mode 100644 index 0000000..8a6f278 --- /dev/null +++ b/src/Level/MapTile.h @@ -0,0 +1,8 @@ +#pragma once + +class Tileset; + +struct MapTile { + Tileset* tileset; + int id; +}; \ No newline at end of file diff --git a/src/Level/Tileset.cpp b/src/Level/Tileset.cpp new file mode 100644 index 0000000..5d9c518 --- /dev/null +++ b/src/Level/Tileset.cpp @@ -0,0 +1,41 @@ +#include "Tileset.h" +#include "../Sprite/Sprite.h" + +Tileset::Tileset(int tileWidth, int tileHeight) { + _tileWidth = tileWidth; + _tileHeight = tileHeight; + _sprite = NULL; + _widthInTiles = 0; +} + +Tileset::~Tileset() { +} + +bool Tileset::LoadImage(const std::string& filename) { + if(_sprite) { + delete _sprite; + } + + _sprite = new Sprite(); + + if (!_sprite->LoadSprite(filename)) { + delete _sprite; + return false; + } + + _widthInTiles = (int)_sprite->GetWidth() / _tileWidth; + + return true; +} + +void Tileset::DrawTile(int id, const Vec2& position) { + _sprite->SetPosition(position); + + Rect sourceRect( + float(id % _widthInTiles) * _tileWidth, + float(id / _widthInTiles) * _tileHeight, + (float)_tileWidth, + (float)_tileHeight); + + _sprite->DrawRegion(sourceRect); +} diff --git a/src/Level/Tileset.h b/src/Level/Tileset.h new file mode 100644 index 0000000..9a0242e --- /dev/null +++ b/src/Level/Tileset.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include "../Math/Vec2.h" + +class Sprite; + +class Tileset { +public: + Tileset(int tileWidth, int tileHeight); + ~Tileset(); + + bool LoadImage(const std::string& filename); + + void DrawTile(int id, const Vec2& position); + +private: + int _tileWidth; + int _tileHeight; + Sprite* _sprite; + int _widthInTiles; +}; \ No newline at end of file diff --git a/src/Main/Game.cpp b/src/Main/Game.cpp index 8b4e012..87a70c9 100644 --- a/src/Main/Game.cpp +++ b/src/Main/Game.cpp @@ -9,23 +9,31 @@ #include "../System/Debug.h" #include "../Sprite/Sprite.h" #include "../Texture/Texture.h" -//#include "../Level/Level.h" +#include "../Level/Level.h" #include "Game.h" Game::Game(void) { _player = new Player(); + _level = new Level(); //_rotationAngle = 0.0f; } Game::~Game(void) { - } bool Game::Init(void) { glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.1f); + + _level->Load("../Data/Map/Ugly.tmx"); _player->Prepare(); + // Return success. return true; } @@ -45,12 +53,14 @@ void Game::Render(void) { glLoadIdentity(); // Render our shit.. + _level->Draw(); _player->Render(); } void Game::Shutdown(void) { Debug::logger->message("\n ----- Cleaning Engine -----"); delete _player; + delete _level; } void Game::ProcessEvents(void) { diff --git a/src/Sprite/Sprite.cpp b/src/Sprite/Sprite.cpp index 35a711a..2f7c881 100644 --- a/src/Sprite/Sprite.cpp +++ b/src/Sprite/Sprite.cpp @@ -36,7 +36,7 @@ void Sprite::DrawRegion(const Rect& src) const { // . . // 3---------2 - Vec2 scaledSize(size.x*scale.x, size.y*scale.y); + Vec2 scaledSize(src.w*scale.x, src.h*scale.y); Vec2 vertices[4] = { Vec2(0.0f, 0.0f),