4.帧循环(游戏循环),schedule
1
概述
游戏乃至图形界面的本质是不断地画图,然而画图并非任意的,不论什么游戏都须要遵循一定的规则来呈现出来,这些规则就体现为游戏逻辑。游戏逻辑会控制游戏内容,使其依据用户输入和时间流逝而改变。因此。游戏能够抽象为不断地反复。
2
下面动作:
A
处理用户输入
B
处理定时事件
C
画图
游戏主循环就是这种一个循环,它会重复运行以上动作,保持游戏进行下去。直到玩家退出游戏。
CCDirector::mainLoop()方法,这种方法负责调动定时器,画图,发送全局通知,并处理内存回收池。该方法按帧调用,每帧调用一次。而帧间间隔取决于两个因素,一个是预设的帧率,默觉得60帧每秒:还有一个是每帧的计算大小。
当逻辑处理与画图计算过大时,设备无法完毕每秒60次绘制,此时帧率就会减少。
3
实现
mainLoop()方法是定义在CCDirector中的抽象方法。它的实现位于同一个文件里的CCDisplayLinkDirector类。代码例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
上述代码主要包括例如以下3个步骤。
推断是否须要释放CCDirector,假设须要,则删除CCDirector占用的资源,通常。游戏结束时才会运行这个步骤。
调用drawScene()发方法,绘制当前场景并进行其它必要的处理。
弹出自己主动回收池,使得这一帧被放入自己主动回收池的对象所有释放。
在主循环中drawScene(),主要进行3个操作:
调用了定时调度器的update方法,引发定时器事件。
假设场景须要被切换,则调用setNextStage方法。在显示场景前切换场景。
调用当前场景的visit方法,绘制当前场景。
4
定时器
|
Schedule.h |
|
#ifndef #define #include USING_NS_CC; class public: static CREATE_FUNC(Schedule); bool void void }; #endif |
|
Schedule.cpp |
|
#include #include CCScene *Schedule::scene() { CCScene * Schedule * scene->addChild(layer); return } bool { CCLayer::init(); //scheduleUpdate(); //unscheduleUpdate(); //scheduleOnce(schedule_selector(Schedule::mySchedule), 2); schedule(schedule_selector(Schedule::mySchedule)); //功能等同scheduleUpdate();回调函数能够自己定义 //schedule(schedule_selector(Schedule::mySchedule), 3); //CCNode::schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay); //schedule(schedule_selector(Schedule::mySchedule),1,10,4); //4s以后。每隔1s运行一次回调。共运行10次 CCSprite * spr->setPosition(ccp(100,winSize.height addChild(spr); spr->setTag(100); //CCMoveBy * by = CCMoveBy::create(2, ccp(300, 0)); //CCMoveBy * by1 = (CCMoveBy *)by->reverse(); //CCSequence *seq = CCSequence::create(by, by1, NULL); //spr->runAction(CCRepeatForever::create(seq)); return } void { CCLOG("dt static i++; if (i { //结束定时器 unscheduleUpdate(); CCLog("schedule } } void CCSprite * float static count++; static if (flag) { if ((spr->getPositionX() { spr->setPositionX(spr->getPositionX() } else { flag = !flag; } } if (!flag) { if ((spr->getPositionX() { spr->setPositionX(spr->getPositionX() } else { flag = !flag; } } if (count { unschedule(schedule_selector(Schedule::mySchedule)); } } |
|
执行结果: |
5 定时器Schedule
A 帧循环定时器
|
scheduleUpdate();//帧循环定时器。每一帧都会被调动,对实时性要求很高的,比方碰撞检測 void update(float delta); unscheduleUpdate();//关闭定时器 |
B 一次性定时器
參数解析:
|
scheduleOnce(SEL_SCHEDULE selector, float delay) //第一个參数表示要回调的函数。第二个參数表示延时 |
|
typedef void (CCObject::*SEL_SCHEDULE)(float); #define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR); |
|
scheduleOnce (schedule_selector(Schedule::updateOnce),2); void updateOnce(float delta); |
C 自己定义定时器
自己定义定时器有3个重载函数。底层都默认调用了scheduleSelector,它的几个參数分别表示,scheduleSelector回调函数,interval时间间隔,repeat反复次数,delay延时运行。
|
void CCNode::schedule(SEL_SCHEDULE selector) { this->schedule(selector, 0.0f, kCCRepeatForever, 0.0f); } /本质同scheduleUpdate void CCNode::schedule(SEL_SCHEDULE selector, float interval) { this->schedule(selector, interval, kCCRepeatForever, 0.0f); } void CCNode::schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay){ m_pScheduler->scheduleSelector(selector, this, interval , repeat,delay, !m_bRunning); } |
D 定时器停止
|
void CCNode::unschedule(SEL_SCHEDULE selector); void CCNode::unscheduleAllSelectors(); |
注意:多个定时器,可并存。可彼此開始与停止。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
4.帧循环(游戏循环),schedule的更多相关文章
- cocos2d-x游戏循环与调度
每一个游戏程序都有一个循环在不断运行,它是有导演对象来管理很维护.如果需要场景中的精灵运动起来,我们可以在游戏循环中使用定时器(Scheduler)对精灵等对象的运行进行调度.因为Node类封装了Sc ...
- cocos2d-x游戏循环和日程安排
每场比赛有一个程序执行周期继续.这是导演对象来管理非常维修.在运动假设需要的场景精神,我们可以使用计时器在游戏圈(Scheduler)精灵和其他对象进行调度. 由于Node类封装了Scheduler类 ...
- Win2D 中的游戏循环:CanvasAnimatedControl
Win2D 是 DirectX 的一个高层封装,提供了极大 DirectX 性能的同时,又具有很好用的 API 设计. 用 Win2D 除了能做出高性能的视觉效果之外,还可以轻而易举地搭建一个游戏循环 ...
- 【Visual C++】游戏编程学习笔记之三:游戏循环的使用
本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44208419 作者:Zee ...
- C#游戏开发中快速的游戏循环
C#游戏开发中快速的游戏循环的实现.参考<精通C#游戏编程>一书. using System; using System.Collections.Generic; using System ...
- Python:pyglet学习(3):游戏循环
在我们编游戏时,经常会用到一个无限循环,这就叫游戏循环. 先用@win.event试试 import pyglet as p win=p.window.Window(800,600) @win.eve ...
- 3.pygame快速入门-游戏循环及动画实现
游戏循环的开始,意味着游戏的正式开始,游戏循环的作用如下 1.保证游戏不会直接退出 2.变化图像的位置--动画效果 3.检测用户交互--按键.鼠标等 游戏时钟 pyagame提供了一个pyga ...
- Python基础之if判断,while循环,循环嵌套
if判断 判断的定义 如果条件满足,就做一件事:条件不满足,就做另一件事: 判断语句又被称为分支语句,有判断,才有分支: if判断语句基本语法 if语句格式: if 判断的条件: 条件成立后做的事 . ...
- 控制流程之while循环, for循环
条件循环:while,语法如下 while 条件: # 循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件... # 如果条件为假,那么循环体不执行,循环终止死循环 基本使用 ...
- python 循环、循环设计、循环对象
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 1.循环 循环用于重复执行一些程序块.从上一讲的选择结构,我们已经看到了如何用缩进 ...
随机推荐
- UVA 10404 Bachet's Game(dp + 博弈?)
Problem B: Bachet's Game Bachet's game is probably known to all but probably not by this name. Initi ...
- poj3176--Cow Bowling(dp:数塔问题)
Cow Bowling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14028 Accepted: 9302 Desc ...
- Cocos2d-x学习笔记(1)
Cocos2d-x原型Cocos2d,基于Cocos2d-iPhone,跨平台. Hello Workd分析: 1."resource"目录 该目录主要用于存放游戏中须要的图片.音 ...
- Windows Phone开发(34):路径标记语法
原文:Windows Phone开发(34):路径标记语法 如果你觉得前面所讨论的绘制各种几何图形的方法过于复杂,那么,今天我们也来一次"减负"吧.当然,我们是很轻松的,本教程是不 ...
- C该程序生成一个唯一的序列号
在实际的软件开发项目,通常,它包括产生一唯一的序列号.在本文中,一个切实可行的方案,例如,它引入了一个唯一的序列号生成过程. 本文生成的序列号的样式为:MMDDHHMINSS_XXXXXX. 程序例如 ...
- Linux下一个php+mysql+nginx构建编译(三)
在此之前一直是一个关键构建webserver.但一个关键的建筑环境都比较旧的.假定使用一个相对较新的环境,尤其是正式的server.您必须手动编译自己建(基于以下的结构linux centos6.5 ...
- quick 2.23 它们的定义c++代码lua与总结的一些细节
它们的定义c++代码lua与总结的一些细节 参考:点击打开链接 1.自己定义 XXX.cpp .XXX.h 2.D:\quick\quick-cocos2d-x-2.2.3-rc\lib\cocos2 ...
- uva 1393 - Highways(容斥原理)
题目连接:uva 1393 - Highways 题目大意:给定一个m∗n的矩阵,将矩阵上的点两两相连,问有多少条直线至少经过两点. 解题思路:头一次做这样的题目,卡了一晚上. dp[i][j]即为i ...
- Spring Assert主张 (参议院检测工具的方法-主张)
Web 收到申请表格提交的数据后都需要对其进行合法性检查,假设表单数据是不合法的,该请求将被拒绝.分类似的,当我们写的类方法,该方法还经常需要组合成参 法国检查.假设参议院不符合要求,方法通过抛出异常 ...
- 玩转Web之easyui(三)-----easy ui dataGird 重新指定url以获取不同数据源信息
如果已经写了一个dataGird并且已经通过url绑定数据源,能不能在其他地方改变url使其从不同数据源获取信息,从而实现查询等操作?答案当然是肯定的,而且仅需要几行代码 $('#btnq').bin ...