游戏update机制
游戏的update用于在每帧切换时更改数据。
void Engine::stepFrame()
{
if (_updateDesignSize)
{
Renderer::getInstance()->resetProjection();
_updateDesignSize = false;
}
Scheduler::getInstance()->update(_deltaTime);
drawScene();
}
/********************************************************************
Copyright(C), 2012-2013,
FileName:Scheduler.h
Description:
Author:cloud
Created:2014/10/23
history:
23:10:2014 10:36 by
*********************************************************************/
#pragma once
#include "Singleton.h"
#include "vector"
#include "SchedulerDelegate.h"
namespace cloud
{
class Scheduler :public Singleton<Scheduler>
{
public:
DECLARE_SINGLETON_CREATE_DESTROY
Scheduler();
~Scheduler();
void update(unsigned int dt);
void scheduleUpdateWithPriority(SchedulerDelegate* target);
void unscheduleUpdate(SchedulerDelegate* target);
void sortAllChildren();
protected:
std::vector<SchedulerDelegate*> _children;
bool _reorderChildDirty;
};
}
/********************************************************************
Copyright(C), 2012-2013,
FileName:Scheduler.cpp
Description:
Author:cloud
Created:2014/10/23
history:
23:10:2014 10:36 by
*********************************************************************/
#include "Scheduler.h"
#include <algorithm>
namespace cloud
{
IMPLEMENT_SINGLETON_ALL(Scheduler);
bool schedulerComparisonLess(SchedulerDelegate* n1, SchedulerDelegate* n2)
{
return( n1->getPriority() > n2->getPriority() ||
( n1->getPriority() == n2->getPriority()));
}
Scheduler::Scheduler()
{
}
Scheduler::~Scheduler()
{
}
void Scheduler::update(unsigned int dt)
{
float delta = dt;
//us to s
delta /= 1000000;
int i = 0;
if(!_children.empty())
{
sortAllChildren();
for(auto it=_children.cbegin()+i; it != _children.cend(); ++it)
(*it)->update(delta);
}
}
void Scheduler::scheduleUpdateWithPriority(SchedulerDelegate* target)
{
_children.push_back(target);
_reorderChildDirty = true;
}
void Scheduler::unscheduleUpdate(SchedulerDelegate* target)
{
std::vector<SchedulerDelegate*>::iterator it = std::find(std::begin(_children), std::end(_children), target);
if( it != _children.end())
{
_children.erase(it);
}
}
void Scheduler::sortAllChildren()
{
if( _reorderChildDirty ) {
std::sort( std::begin(_children), std::end(_children), schedulerComparisonLess );
_reorderChildDirty = false;
}
}
}
/********************************************************************
Copyright(C), 2012-2013,
FileName:Scheduler.h
Description:
Author:cloud
Created:2014/10/23
history:
23:10:2014 10:36 by
*********************************************************************/
#pragma once
namespace cloud
{
class SchedulerDelegate
{
public:
void scheduleUpdate();
void scheduleUpdateWithPriority(int priority);
void unscheduleUpdate();
virtual void update(float dt);
int getPriority();
protected:
int _priority;
};
}
/********************************************************************
Copyright(C), 2012-2013,
FileName:Scheduler.cpp
Description:
Author:cloud
Created:2014/10/23
history:
23:10:2014 10:36 by
*********************************************************************/
#include "Scheduler.h"
#include "SchedulerDelegate.h"
namespace cloud
{
void SchedulerDelegate::scheduleUpdate()
{
scheduleUpdateWithPriority(0);
}
void SchedulerDelegate::scheduleUpdateWithPriority(int priority)
{
_priority = priority;
Scheduler::getInstance()->scheduleUpdateWithPriority(this);
}
void SchedulerDelegate::unscheduleUpdate()
{
Scheduler::getInstance()->unscheduleUpdate(this);
}
int SchedulerDelegate::getPriority()
{
return _priority;
}
void SchedulerDelegate::update(float dt)
{
}
}
class Scene:public SchedulerDelegate
class Node:public SchedulerDelegate
scheduler就是更新管理器。每帧切换调用相应的update.