moved event handling into Modules instead of having seperate event listener objects
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
#include "Controller.h"
|
||||
#include "Model.h"
|
||||
#include "EntityBase.h"
|
||||
#include "EventsBase.h"
|
||||
#include "EventBase.h"
|
||||
|
||||
#include "Controller.h"
|
||||
#include "ShipEntity.h"
|
||||
|
||||
+21
-5
@@ -57,17 +57,33 @@ int Model::OnInit (int argc, char* argv[]) {
|
||||
}
|
||||
|
||||
// initialize event handlers and register them
|
||||
mLevelCompleteEventHandler = new LevelCompleteEventHandler (this);
|
||||
Engine::RegisterListener (mLevelCompleteEventHandler, EventLevelComplete);
|
||||
|
||||
mGameOverEventHandler = new GameOverEventHandler (this);
|
||||
Engine::RegisterListener (mGameOverEventHandler, EventGameOver);
|
||||
Engine::RegisterListener (this, EventLevelComplete);
|
||||
Engine::RegisterListener (this, EventGameOver);
|
||||
|
||||
mPlayerName = "Player";
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool Model::OnReceiveEvent (const Engine::EventBasePtr &event) {
|
||||
switch (event->mEventType) {
|
||||
case EventLevelComplete:
|
||||
return OnLevelComplete();
|
||||
break;
|
||||
case EventGameOver:
|
||||
return OnGameOver();
|
||||
break;
|
||||
|
||||
default: Engine::LogWarning ("Received Event with type %d but don't know what to do with it!", event->mEventType);
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Module specific functions
|
||||
*/
|
||||
void Model::Process () {
|
||||
if (mLastGameState == mGameState) {
|
||||
if (mGameState == GameStateRunning) {
|
||||
|
||||
+1
-28
@@ -50,8 +50,6 @@ class Model : public Engine::ModelBase {
|
||||
mAsteroids.clear();
|
||||
mLevelList.clear();
|
||||
SaveHighscoreList();
|
||||
delete mLevelCompleteEventHandler;
|
||||
delete mGameOverEventHandler;
|
||||
};
|
||||
virtual void OnRegisterCommands ();
|
||||
|
||||
@@ -70,32 +68,7 @@ class Model : public Engine::ModelBase {
|
||||
std::string mPlayerName;
|
||||
std::vector<std::string> mLevelList;
|
||||
|
||||
/* 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;
|
||||
};
|
||||
|
||||
class GameOverEventHandler : public Engine::EventListenerBase {
|
||||
public:
|
||||
explicit GameOverEventHandler (Model *view) : mModel (view) {};
|
||||
virtual bool HandleEvent (const Engine::EventBasePtr &event) const {
|
||||
return mModel->OnGameOver();
|
||||
}
|
||||
private:
|
||||
GameOverEventHandler() {};
|
||||
Model *mModel;
|
||||
};
|
||||
|
||||
/* event handler member variables */
|
||||
LevelCompleteEventHandler *mLevelCompleteEventHandler;
|
||||
GameOverEventHandler *mGameOverEventHandler;
|
||||
virtual bool OnReceiveEvent (const Engine::EventBasePtr &event);
|
||||
|
||||
friend class View;
|
||||
};
|
||||
|
||||
+41
-38
@@ -6,7 +6,7 @@
|
||||
#include "Engine.h"
|
||||
#include "Physics.h"
|
||||
#include "Model.h"
|
||||
#include "EventsBase.h"
|
||||
#include "EventBase.h"
|
||||
|
||||
#include "ShipEntity.h"
|
||||
#include "AsteroidEntity.h"
|
||||
@@ -78,61 +78,64 @@ int View::OnInit (int argc, char* argv[]) {
|
||||
mShipPartsSprite.LoadFromPNG ("./data/textures/ship_parts.png");
|
||||
mShipPartsSprite.SetSubSpriteCount (10);
|
||||
|
||||
mAccelerateEventHandler = new AccelerateEventHandler (this);
|
||||
Engine::RegisterListener (mAccelerateEventHandler, EventAccelerateStart);
|
||||
Engine::RegisterListener (mAccelerateEventHandler, EventAccelerateStop);
|
||||
|
||||
mShipExplodeEventHandler = new ShipExplodeEventHandler (this);
|
||||
Engine::RegisterListener (mShipExplodeEventHandler, EventShipExplode);
|
||||
Engine::RegisterListener (this, EventAccelerateStart);
|
||||
Engine::RegisterListener (this, EventAccelerateStop);
|
||||
Engine::RegisterListener (this, EventShipExplode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void View::OnDestroy() {
|
||||
delete mAccelerateEventHandler;
|
||||
delete mShipExplodeEventHandler;
|
||||
|
||||
mBackgroundStars.clear();
|
||||
mShipPartsEntityIds.clear();
|
||||
|
||||
Engine::ViewBase::OnDestroy();
|
||||
}
|
||||
|
||||
/*
|
||||
* Event Handlers
|
||||
*/
|
||||
bool View::AccelerateEventHandler::HandleEvent (const Engine::EventBasePtr &event) const {
|
||||
if (event->mEventType == EventAccelerateStart)
|
||||
mView->mShipThrustSprite.ResetAnimation();
|
||||
bool View::OnReceiveEvent (const Engine::EventBasePtr &event) {
|
||||
switch (event->mEventType) {
|
||||
case EventAccelerateStart:
|
||||
case EventAccelerateStop:
|
||||
if (event->mEventType == EventAccelerateStart)
|
||||
mShipThrustSprite.ResetAnimation();
|
||||
|
||||
Engine::LogDebug ("Received Acceleration Event: %d", event->mEventType);
|
||||
return true;
|
||||
}
|
||||
Engine::LogDebug ("Received Acceleration Event: %d", event->mEventType);
|
||||
return true;
|
||||
|
||||
bool View::ShipExplodeEventHandler::HandleEvent (const Engine::EventBasePtr &event) const {
|
||||
if (event->mEventType == EventShipExplode) {
|
||||
Engine::EntityBase *ship_entity = Engine::GetEntity (event->mEventUnsignedInt);
|
||||
vector3d position = ship_entity->mPhysicState->mPosition;
|
||||
vector3d orientation = ship_entity->mPhysicState->mOrientation;
|
||||
vector3d velocity = ship_entity->mPhysicState->mVelocity;
|
||||
break;
|
||||
case EventShipExplode:
|
||||
if (event->mEventType == EventShipExplode) {
|
||||
Engine::EntityBase *ship_entity = Engine::GetEntity (event->mEventUnsignedInt);
|
||||
vector3d position = ship_entity->mPhysicState->mPosition;
|
||||
vector3d orientation = ship_entity->mPhysicState->mOrientation;
|
||||
vector3d velocity = ship_entity->mPhysicState->mVelocity;
|
||||
|
||||
unsigned int i;
|
||||
mView->mShipPartsEntityIds.clear();
|
||||
unsigned int i;
|
||||
mShipPartsEntityIds.clear();
|
||||
|
||||
for (i = 0; i < mView->mShipPartsSprite.GetSubSpriteCount(); i++) {
|
||||
Engine::EntityBase* part_sprite_particle = Engine::CreateEntity (GameEntityTypeShipPart);
|
||||
part_sprite_particle->mPhysicState->mPosition = position;
|
||||
part_sprite_particle->mPhysicState->mOrientation = orientation;
|
||||
part_sprite_particle->mPhysicState->mVelocity = velocity;
|
||||
part_sprite_particle->mPhysicState->mVelocity = vector3d (velocity[0] * (rand()/float(RAND_MAX)) * 1.7, 0., velocity[2] * (rand()/float(RAND_MAX)) * 1.5);
|
||||
part_sprite_particle->mPhysicState->mAngleVelocity = (rand()/float(RAND_MAX) - 0.5 ) * 100.;
|
||||
for (i = 0; i < mShipPartsSprite.GetSubSpriteCount(); i++) {
|
||||
Engine::EntityBase* part_sprite_particle = Engine::CreateEntity (GameEntityTypeShipPart);
|
||||
part_sprite_particle->mPhysicState->mPosition = position;
|
||||
part_sprite_particle->mPhysicState->mOrientation = orientation;
|
||||
part_sprite_particle->mPhysicState->mVelocity = velocity;
|
||||
part_sprite_particle->mPhysicState->mVelocity = vector3d (velocity[0] * (rand()/float(RAND_MAX)) * 1.7, 0., velocity[2] * (rand()/float(RAND_MAX)) * 1.5);
|
||||
part_sprite_particle->mPhysicState->mAngleVelocity = (rand()/float(RAND_MAX) - 0.5 ) * 100.;
|
||||
|
||||
mView->mShipPartsEntityIds.push_back(part_sprite_particle->mId);
|
||||
}
|
||||
mShipPartsEntityIds.push_back(part_sprite_particle->mId);
|
||||
}
|
||||
}
|
||||
|
||||
Engine::LogDebug ("Received Ship Explode Event: %d", event->mEventType);
|
||||
return true;
|
||||
|
||||
|
||||
break;
|
||||
|
||||
default: Engine::LogWarning ("Received Event with type %d but don't know what to do with it!", event->mEventType);
|
||||
break;
|
||||
}
|
||||
|
||||
Engine::LogDebug ("Received Ship Explode Event: %d", event->mEventType);
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+1
-20
@@ -54,26 +54,7 @@ class View : public Engine::ViewBase {
|
||||
Engine::Sprite mShipThrustSprite;
|
||||
Engine::Sprite mShipPartsSprite;
|
||||
|
||||
class AccelerateEventHandler : public Engine::EventListenerBase {
|
||||
public:
|
||||
explicit AccelerateEventHandler (View *view) : mView (view) {};
|
||||
virtual bool HandleEvent (const Engine::EventBasePtr &event) const;
|
||||
private:
|
||||
View *mView;
|
||||
};
|
||||
|
||||
class ShipExplodeEventHandler : public Engine::EventListenerBase {
|
||||
public:
|
||||
explicit ShipExplodeEventHandler (View *view) : mView (view) {};
|
||||
virtual bool HandleEvent (const Engine::EventBasePtr &event) const;
|
||||
private:
|
||||
View *mView;
|
||||
};
|
||||
|
||||
AccelerateEventHandler *mAccelerateEventHandler;
|
||||
ShipExplodeEventHandler *mShipExplodeEventHandler;
|
||||
|
||||
friend class AccelerateEventHandler;
|
||||
virtual bool OnReceiveEvent (const Engine::EventBasePtr &event);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user