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
__Schedule_H__

#define
__Schedule_H__

#include
"cocos2d.h"

USING_NS_CC;

class
Schedule :public
CCLayer {

public:

static
CCScene *
scene();

CREATE_FUNC(Schedule);

bool
init();

void
update(float)
override;

void
mySchedule(float
dt);

};

#endif

Schedule.cpp

#include
"Schedule.h"

#include
"AppMacros.h"

CCScene *Schedule::scene()

{

CCScene *
scene =
CCScene::create();

Schedule *
layer =
Schedule::create();

scene->addChild(layer);

return
scene;

}

bool
Schedule::init()

{

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 =
CCSprite::create("p_2_01.png");

spr->setPosition(ccp(100,winSize.height
/ 2));

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
true;

}

void
Schedule::update(float
dt)

{

CCLOG("dt
= %g",dt);

static
int
i = 0;

i++;

if (i
== 120)

{

//结束定时器

unscheduleUpdate();

CCLog("schedule
is over");

}

}

void
Schedule::mySchedule(float
dt) {

CCSprite *
spr = (CCSprite
*)getChildByTag(100);

float
v = 300 / 2;

static
int
count = 0;

count++;

static
bool
flag =
true;

if (flag)

{

if ((spr->getPositionX()
+ v*dt)
< 400)

{

spr->setPositionX(spr->getPositionX()
+ v*dt);

}

else

{

flag = !flag;

}

}

if (!flag)

{

if ((spr->getPositionX()
- v*dt)
> 100)

{

spr->setPositionX(spr->getPositionX()
- v*dt);

}

else

{

flag = !flag;

}

}

if (count
== 1000)

{

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的更多相关文章

  1. cocos2d-x游戏循环与调度

    每一个游戏程序都有一个循环在不断运行,它是有导演对象来管理很维护.如果需要场景中的精灵运动起来,我们可以在游戏循环中使用定时器(Scheduler)对精灵等对象的运行进行调度.因为Node类封装了Sc ...

  2. cocos2d-x游戏循环和日程安排

    每场比赛有一个程序执行周期继续.这是导演对象来管理非常维修.在运动假设需要的场景精神,我们可以使用计时器在游戏圈(Scheduler)精灵和其他对象进行调度. 由于Node类封装了Scheduler类 ...

  3. Win2D 中的游戏循环:CanvasAnimatedControl

    Win2D 是 DirectX 的一个高层封装,提供了极大 DirectX 性能的同时,又具有很好用的 API 设计. 用 Win2D 除了能做出高性能的视觉效果之外,还可以轻而易举地搭建一个游戏循环 ...

  4. 【Visual C++】游戏编程学习笔记之三:游戏循环的使用

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44208419 作者:Zee ...

  5. C#游戏开发中快速的游戏循环

    C#游戏开发中快速的游戏循环的实现.参考<精通C#游戏编程>一书. using System; using System.Collections.Generic; using System ...

  6. Python:pyglet学习(3):游戏循环

    在我们编游戏时,经常会用到一个无限循环,这就叫游戏循环. 先用@win.event试试 import pyglet as p win=p.window.Window(800,600) @win.eve ...

  7. 3.pygame快速入门-游戏循环及动画实现

    游戏循环的开始,意味着游戏的正式开始,游戏循环的作用如下 1.保证游戏不会直接退出 2.变化图像的位置--动画效果 3.检测用户交互--按键.鼠标等     游戏时钟 pyagame提供了一个pyga ...

  8. Python基础之if判断,while循环,循环嵌套

    if判断 判断的定义 如果条件满足,就做一件事:条件不满足,就做另一件事: 判断语句又被称为分支语句,有判断,才有分支: if判断语句基本语法 if语句格式: if 判断的条件: 条件成立后做的事 . ...

  9. 控制流程之while循环, for循环

    条件循环:while,语法如下 while 条件: # 循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件... # 如果条件为假,那么循环体不执行,循环终止死循环 基本使用 ...

  10. python 循环、循环设计、循环对象

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 1.循环 循环用于重复执行一些程序块.从上一讲的选择结构,我们已经看到了如何用缩进 ...

随机推荐

  1. 关于SVN配置文件的一个小例子

    1   背景假设 厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计.销售,并在北京.上海各设立了一个办事处.对于工作日志,原先采用邮件方式发给经理,但是这种方式 ...

  2. Difference between datacontract and messagecontract in wcf

    在WCF中有两种契约各自是DataContract和MessageContract,这篇博客来讲一下两者的差别.先看一下两者定义契约实体的方式有和不同. 1.数据契约 <span style=& ...

  3. JDBC与反射

    什么是JDBC Java定义了一套关于连接使用数据库的规范(接口)叫做JDBC,许多数据库厂商实现了这个规范,所以我们可以通过Java提供的接口编程,使得我们更换数据库的时候不用修改原来的代码,只需要 ...

  4. Quartz时间配置

    格式: [秒] [分] [小时] [日] [月] [周] [年]  序号 说明  是否必填  允许填写的值 允许的通配符  1  秒  是  0-59    , - * /  2  分  是  0-5 ...

  5. 对于Hadoop的MapReduce编程makefile

    根据近期需要hadoop的MapReduce程序集成到一个大的应用C/C++书面框架.在需求make当自己主动MapReduce编译和打包的应用. 在这里,一个简单的WordCount1一个例子详细的 ...

  6. 《深入Java虚拟机》笔记:指令集 (转)

    <深入Java虚拟机>笔记:指令集   指令 含义 iconst_m1 把int型常量-1压入栈中 iconst_0 把int型常量压入栈中 fconst_1 把float型常量1压入栈中 ...

  7. 在小发现SQL字符串比较是不是他们的大写和小写敏感

    声明:select  petName from dbo.T_pet order by petName desc 成绩:    petName    An admin A的ascii码小于a,按理说应该 ...

  8. cgo 随笔(golang)

    结构体应用 //结构体定义如下 // test.h struct test { int a; int b; int c; } 在golang中的调用如下: package name import &q ...

  9. Java二叉排序树(转)

    一.二叉排序树定义 1.二叉排序树的定义 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree).其定义为:二叉排序树或者是空树,或者是满足如下性 ...

  10. 在Linux上安装Hadoop

    先决条件: Hadoop是用JAVA写的,所以首先要安装Java.在Ubuntu上安装JDK见:http://blog.csdn.net/microfhu/article/details/766739 ...