bada 2D游戏编程之五——一个基于定时器的游戏循环
来源:互联网 发布:测试电池容量的软件 编辑:程序博客网 时间:2024/05/22 05:33
bada 2D游戏编程之五——一个基于定时器的游戏循环
在上篇《bada 2D游戏编程之四——设计游戏循环》中对比较常见的几种设计游戏循环的理论知识进行了阐述,下面按照bada平台的编程知识来实现一种游戏循环。实现“时间驱动”的游戏循环通常采用2种方式,一种是基于定时器的游戏循环,还有一种是基于线程的游戏循环。在本篇文章中给大家介绍如何在bada平台上实现一个基于定时器的游戏循环。
1,定时器使用方法
bada平台提供了Osp::Base::Runtime::Timer来作为系统的定时器,这是Timer的主要函数:
函数
功能描述
Construct(const ITimerEventListener& listener)
初始化函数,传入监听器
Start(int timeout)
开始计时
Cancel(void)
取消计时
同时还有一个Osp::Base::Runtime::ITimerEventListener接口类来配合它一起使用,ITimerEventListener类的主要函数:
函数
功能描述
OnTimerExpired(Timer& timer)
定时器到时时被回调到
这样当Timer设定的时间到达后,ITimerEventListener中的事件处理函数OnTimerExpired(Timer& timer)就会被回调到,在这里面进行事件处理就可以了。
2,实现的思路
实现的思路主要是将游戏的循环和游戏(事件处理、逻辑更新、渲染绘制)进行分离,从而可以将游戏循环模块和游戏模块分离开来,降低相互之间的依赖程度。通过加入一个接口类将HandleEvent(),UpdateLogic()和Draw()封装起来,然后在游戏循环中调用这个接口类的函数来通知游戏模块进行处理,从而实现了相互之间的独立。
在写这个博客系列的过程中,希望能够实现一个简单的游戏引擎,并将这个游戏引擎的缩写定为TG,一是表示为二维游戏(Two-Dimensional Game)的意思,再是现在网上有传言要将bada和Tizen进行合并,到时这个基于bada的游戏引擎应该是可以运行在Tizen上的,所以也可以表示为Tizen Game的缩写。这样设计的属于游戏引擎的类都会加入TG做为标识。
3,类图
下图是对游戏循环涉及到的各类之间的关系。
4,相关的类和接口
下面对实现游戏循环的一些基本的接口和类进行介绍:
(1)ITGStateListener类,I表示是一个接口类(Interface)。这个类封装了游戏的三种状态,分别是处理事件、更新逻辑和渲染绘制。游戏模块只需要实现这个接口,进行注册后就可以接到来自游戏循环的通知,在各个处理函数中进行相应的处理就可以了,从而驱动游戏运行。
classITGStateListener{
public:
virtual~ITGStateListener(){};
virtualvoidHandleEvent() = 0;
virtualvoidUpdateLogic(int frameInterval) = 0;
virtualvoidDraw() = 0;
};
(2)TGLoopBase类,这是游戏循环的基类,实现各种游戏循环都可以通过继承这个类来实现循环,它封装了游戏循环的一些基本方法和成员。这个类包含一些纯虚函数,所以是不能被实例化的。
classTGLoopBase {
public:
TGLoopBase();
virtual~TGLoopBase();
virtualresultConstruct(void) = 0;
public:
virtualvoidSetFrameInterval(int interval);
virtualvoidSetStateListener(ITGStateListener* pListener);
virtualvoidStart() = 0;
virtualvoidPause() = 0;
virtualvoidStop() = 0;
protected:
int__frameInterval;
ITGStateListener*__pStatusListener;
};
(3)TGTimerLoop类,这是游戏循环对应的一个具体的类,它继承了TGLoopBase,并使用Osp::Base::Runtime::Timer来实现循环功能。
classTGTimerLoop :publicTGLoopBase,
public Osp::Base::Runtime::ITimerEventListener
{
public:
TGTimerLoop();
virtual~TGTimerLoop();
resultConstruct(void);
public:
virtualvoidOnTimerExpired(Osp::Base::Runtime::Timer& timer);
public:
voidStart();
voidPause();
voidStop();
private:
Osp::Base::Runtime::Timer*__pTimer;
};
5,循环实现
游戏循环是在TGTimerLoop中实现的,主要在OnTimerExpired()函数中完成循环逻辑,其它的像Start(),Pause(),Stop()等函数对循环进行控制。
TGTimerLoop::TGTimerLoop() :__pTimer(NULL)
{
}
TGTimerLoop::~TGTimerLoop()
{
if(__pTimer)
{
delete __pTimer
__pTimer = NULL
}
}
result
TGTimerLoop::Construct(void)
{
result r = E_SUCCESS;
__pTimer =newTimer();
r = __pTimer->Construct(*this);
return r;
}
void
TGTimerLoop::OnTimerExpired(Osp::Base::Runtime::Timer& timer)
{
longlong startTime = 0;
Osp::System::SystemTime::GetTicks(startTime);
if(__pStatusListener)
{
__pStatusListener->HandleEvent();
__pStatusListener->UpdateLogic(__frameInterval);
__pStatusListener->Draw();
}
longlong endTime = 0;
Osp::System::SystemTime::GetTicks(endTime);
longlong deltaTime = endTime - startTime;
AppLog("deltaTime %ls",LongLong::ToString(deltaTime).GetPointer());
int leftTime =__frameInterval - deltaTime;
if(leftTime > 0)
{
__pTimer->Start(leftTime);
}
else
{
__pTimer->Start(1);
}
}
void
TGTimerLoop::Start()
{
if(__pTimer)
{
__pTimer->Cancel();
__pTimer->Start(__frameInterval);
}
}
void
TGTimerLoop::Pause()
{
if(__pTimer)
{
__pTimer->Cancel();
}
}
void
TGTimerLoop::Stop()
{
if(__pTimer)
{
__pTimer->Cancel();
}
}
其中的OnTimerExpired()函数中的代码就是游戏循环的关键代码,从代码中可以看出这个实现的是上篇文章提到的“基于时间的固定间隔游戏循环”。
- bada 2D游戏编程之五——一个基于定时器的游戏循环
- bada 2D游戏编程之六——一个基于线程的游戏循环
- bada 2D游戏编程之四——设计游戏循环
- bada 2D游戏编程之三——游戏的基本结构
- bada 2D游戏编程——开篇说明
- bada 2D游戏编程之一——图形绘制
- bada 2D游戏编程之二——图像绘制
- bada 2D游戏编程之八——逐帧动画
- bada 2D游戏编程之十——关键帧动画原理
- <MFC_8>2D游戏效果之五:一个跑酷游戏的小Demo
- <MFC_8>2D游戏效果之五:一个跑酷游戏的小Demo
- 基于Unity3D的2d拾宝游戏(五)
- 3D游戏编程(五)
- 基于三星 bada 手机操作系统 的打泡泡游戏
- win32一个好用的游戏循环定时器
- D3D之2D游戏编程(二)——游戏主窗口
- 【VC++游戏开发#五】2D篇 —— 游戏之二:看看你能坚持多少秒
- 2D游戏编程
- Linux系统修改环境变量PATH路径---终结篇 vi /etc/environment
- 跟我一起写 Makefile(一)
- Android 之 Window、WindowManager 与窗口管理
- Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook
- .9图片的制作(draw9patch.bat工具的使用)
- bada 2D游戏编程之五——一个基于定时器的游戏循环
- camera1
- 如何将excel中的通讯录导入outlook2010
- perl基本语法
- asp.net mvc model 汇总
- poj 1860 Currency Exchange (Bellman_Ford)
- Playing with ptrace, Part II
- Andriod 使用MediaPlayer播放音频文件
- linux蓝牙驱动代码阅读笔记