游戏update机制

游戏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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值