multiple levels in ./data/levels/ are played through

main
Martin Felis (berta) 2010-04-18 11:41:29 +02:00
parent ca21f8c63a
commit 53220eb0ee
5 changed files with 111 additions and 9 deletions

View File

@ -6,6 +6,7 @@ BEGIN_ENUM(Event)
{ {
DECL_ENUM_ELEMENT(EventAccelerateStart), DECL_ENUM_ELEMENT(EventAccelerateStart),
DECL_ENUM_ELEMENT(EventAccelerateStop), DECL_ENUM_ELEMENT(EventAccelerateStop),
DECL_ENUM_ELEMENT(EventLevelComplete),
DECL_ENUM_ELEMENT(EventShipExplode) DECL_ENUM_ELEMENT(EventShipExplode)
} }
END_ENUM(Event) END_ENUM(Event)

View File

@ -153,8 +153,18 @@ void MenuOverlay::DrawPlayerDied () {
void MenuOverlay::DrawGameOverScreen() { void MenuOverlay::DrawGameOverScreen() {
std::ostringstream topbar_stream; std::ostringstream topbar_stream;
topbar_stream << "That was pathetic! ";
Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8, topbar_stream.str().c_str ()); Engine::DrawGLString ( right * 0.5 - 60, bottom * 0.5 - 8 - 64, "G a m e O v e r");
if (mModel->GetPlayerLives() == 0) {
topbar_stream << "That was pathetic! ";
Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8, topbar_stream.str().c_str ());
} else {
Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 32, "You earned yourself the");
Engine::DrawGLString ( right * 0.5 - 60, bottom * 0.5 + 0, "You Rock(TM) award.");
Engine::DrawGLString ( right * 0.5 - 70, bottom * 0.5 + 32, "Go tell your friends.");
}
} }
void MenuOverlay::DrawGameMenu() { void MenuOverlay::DrawGameMenu() {

View File

@ -1,11 +1,14 @@
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <algorithm>
#include <boost/filesystem.hpp>
#include "Model.h" #include "Model.h"
#include "Physics.h" #include "Physics.h"
#include "PhysicsBase.h" #include "PhysicsBase.h"
#include "EntityFactory.h" #include "EntityFactory.h"
#include "AsteroidsEvents.h"
#include <assert.h> #include <assert.h>
@ -24,6 +27,15 @@ int Model::OnInit (int argc, char* argv[]) {
mGameState = GameStateMainMenu; mGameState = GameStateMainMenu;
mLastGameState = GameStateMainMenu; mLastGameState = GameStateMainMenu;
/// \TODO use <optional> or similar for initialization of mCurrentLevelIndex
mCurrentLevelIndex = 99999;
if (InitLevelList() == 0)
Engine::LogError ("No levels found!");
mLevelCompleteEventHandler = new LevelCompleteEventHandler (this);
Engine::RegisterListener (mLevelCompleteEventHandler, EventLevelComplete);
Engine::LogMessage ("Model Initialization!"); Engine::LogMessage ("Model Initialization!");
return result; return result;
@ -43,8 +55,8 @@ void Model::Process () {
if (mLastGameState == GameStateMainMenu && mGameState == GameStateRunning) { if (mLastGameState == GameStateMainMenu && mGameState == GameStateRunning) {
mPlayerLives = 3; mPlayerLives = 3;
mLevel = 1; mCurrentLevelIndex = 0;
DoLoadLevel ("./data/levels/default.txt"); DoLoadLevel (mLevelList[mCurrentLevelIndex].c_str());
} }
else if (mLastGameState == GameStateRunning && mGameState == GameStatePlayerDied) { else if (mLastGameState == GameStateRunning && mGameState == GameStatePlayerDied) {
mPlayerLives --; mPlayerLives --;
@ -54,10 +66,17 @@ void Model::Process () {
if (mPlayerLives == 0) if (mPlayerLives == 0)
mGameState = GameStateGameOver; mGameState = GameStateGameOver;
} }
else if (mLastGameState == GameStateLevelComplete && mGameState == GameStateRunning) else if (mLastGameState == GameStateLevelComplete && mGameState == GameStateRunning) {
DoLoadLevel ("./data/levels/default.txt"); mCurrentLevelIndex++;
if (mCurrentLevelIndex == mLevelList.size()) {
SetGameState(GameStateGameOver);
} else {
DoLoadLevel(mLevelList[mCurrentLevelIndex].c_str());
}
}
else if (mLastGameState == GameStatePlayerDied && mGameState == GameStateRunning) else if (mLastGameState == GameStatePlayerDied && mGameState == GameStateRunning)
DoLoadLevel ("./data/levels/default.txt"); // DoLoadLevel (mLevelPath);
assert (0);
else if (mLastGameState == GameStateRunning && mGameState == GameStateGameOver) else if (mLastGameState == GameStateRunning && mGameState == GameStateGameOver)
ClearEntities(); ClearEntities();
@ -67,6 +86,41 @@ void Model::Process () {
mLastGameState = mGameState; mLastGameState = mGameState;
} }
void DoLoadLevel (unsigned int level_index) {
}
unsigned int Model::InitLevelList () {
const char* level_dir_name = "./data/levels/";
Engine::LogDebug ("Searching for levels in %s", level_dir_name);
mLevelList.clear();
boost::filesystem::path level_dir(level_dir_name);
if (!boost::filesystem::exists(level_dir)) {
Engine::LogError ("Could not init level list: %s does not exist!");
}
if (!boost::filesystem::is_directory(level_dir)) {
Engine::LogError ("Could not init level list: %s is not a directory!");
}
boost::filesystem::directory_iterator end_iter;
for (boost::filesystem::directory_iterator dir_iter(level_dir);
dir_iter != end_iter;
++dir_iter) {
if (boost::filesystem::is_regular_file (dir_iter->status())) {
mLevelList.push_back (std::string(level_dir_name) + dir_iter->path().filename());
Engine::LogDebug ("Found level %s", mLevelList[mLevelList.size()-1].c_str());
}
}
std::sort(mLevelList.begin(), mLevelList.end());
return mLevelList.size();
}
int Model::DoLoadLevel (const char* filename) { int Model::DoLoadLevel (const char* filename) {
Engine::LogMessage ("Loading level from %s", filename); Engine::LogMessage ("Loading level from %s", filename);
std::fstream level_file (filename, std::ios::in); std::fstream level_file (filename, std::ios::in);
@ -171,6 +225,16 @@ int Model::DoSaveLevel (const char* filename) {
return 0; return 0;
} }
bool Model::OnLevelComplete() {
Engine::LogMessage ("Level complete!");
if (mCurrentLevelIndex + 1== mLevelList.size()) {
SetGameState(GameStateGameOver);
} else {
SetGameState (GameStateLevelComplete);
}
}
void Model::OnCreateEntity (const int type, const unsigned int id) { void Model::OnCreateEntity (const int type, const unsigned int id) {
GameEntityType entity_type = (GameEntityType) type; GameEntityType entity_type = (GameEntityType) type;
@ -194,7 +258,10 @@ void Model::OnKillEntity (const Engine::EntityBase *entity) {
} }
if (mAsteroids.size() == 0) { if (mAsteroids.size() == 0) {
SetGameState (GameStateLevelComplete); Engine::EventBasePtr level_complete_event (new Engine::EventBase());
level_complete_event->mEventType = EventLevelComplete;
TriggerEvent (level_complete_event);
// SetGameState (GameStateLevelComplete);
} }
} }
} }

View File

@ -12,6 +12,7 @@ class Model : public Engine::ModelBase {
virtual void Process(); virtual void Process();
int DoLoadLevel (const char* filename); int DoLoadLevel (const char* filename);
int DoSaveLevel (const char* filename); int DoSaveLevel (const char* filename);
bool OnLevelComplete();
void SetGameState (const GameState &state) { void SetGameState (const GameState &state) {
mLastGameState = mGameState; mLastGameState = mGameState;
@ -30,6 +31,7 @@ class Model : public Engine::ModelBase {
virtual void OnDestroy() { virtual void OnDestroy() {
Engine::ModelBase::OnDestroy(); Engine::ModelBase::OnDestroy();
mAsteroids.clear(); mAsteroids.clear();
delete mLevelCompleteEventHandler;
}; };
virtual void OnRegisterCommands (); virtual void OnRegisterCommands ();
@ -37,6 +39,8 @@ class Model : public Engine::ModelBase {
virtual void OnKillEntity (const Engine::EntityBase *entity); virtual void OnKillEntity (const Engine::EntityBase *entity);
private: private:
unsigned int InitLevelList ();
/** \brief Keeps a list of all asteroids */ /** \brief Keeps a list of all asteroids */
std::vector<unsigned int> mAsteroids; std::vector<unsigned int> mAsteroids;
@ -44,7 +48,23 @@ class Model : public Engine::ModelBase {
GameState mLastGameState; GameState mLastGameState;
int mPlayerLives; int mPlayerLives;
int mLevel; std::vector<std::string> mLevelList;
unsigned int mCurrentLevelIndex;
/* event handler class definitions */
class LevelCompleteEventHandler : public Engine::EventListenerBase {
public:
explicit LevelCompleteEventHandler (Model *view) : mModel (view) {};
virtual bool HandleEvent (const Engine::EventBasePtr &event) const {
return mModel->OnLevelComplete();
}
private:
LevelCompleteEventHandler() {};
Model *mModel;
};
/* event handler member variables */
LevelCompleteEventHandler *mLevelCompleteEventHandler;
friend class View; friend class View;
}; };

View File

@ -6,6 +6,9 @@ FIND_PACKAGE (SDL REQUIRED)
FIND_PACKAGE (OpenGL REQUIRED) FIND_PACKAGE (OpenGL REQUIRED)
FIND_PACKAGE (PNG REQUIRED) FIND_PACKAGE (PNG REQUIRED)
FIND_PACKAGE (FreeType2 REQUIRED) FIND_PACKAGE (FreeType2 REQUIRED)
FIND_PACKAGE (Boost COMPONENTS filesystem REQUIRED)
INCLUDE_DIRECTORIES (${Boost_INCLUDE_DIRS} )
ADD_SUBDIRECTORY ( libraries ) ADD_SUBDIRECTORY ( libraries )
@ -52,6 +55,7 @@ TARGET_LINK_LIBRARIES ( Engine
${SDL_LIBRARY} ${SDL_LIBRARY}
${OPENGL_LIBRARIES} ${OPENGL_LIBRARIES}
${PNG_LIBRARIES} ${PNG_LIBRARIES}
${Boost_LIBRARIES}
mathlib mathlib
oglft oglft
coll2d coll2d