之前用Flash做点小游戏,帧的概念很明确,是一个弹性的机制,EnterFrame中并没有返回什么参数,如24帧,最终执行的帧数可能是<=24帧,耗时的操作回导致帧数下降,以前做的时候记得在EnterFrame开始的时候,获取系统时间,在结束的时候再获取一次,来简单的计算下时间查,只是都是一些小游戏,没有用。之后用cocos2dx,update函数带有一帧时间差参数,看了cocos2dx的引擎主循环,发现这个时间是准确的,包括了代码和渲染的时间。假如写一个子弹从y=0,移动到-100,fps 60,60帧移动2个单位,那就直接在update方法中写上
void Bullet::update(float dt){
CCPoint position = this->getPosition();
position.y -= 2/60;
setPosition(position);
}
这样的结果就是,游戏一帧移动2/60个单位,但是相同时间内跑帧次数可能不同,就导致子弹一秒移动的距离不固定,当帧率降低时候,速度就变小了
void Bullet::update(float dt){
CCPoint position = this->getPosition();
position.y -= 2*dt;
setPosition(position);
}
程序这样写的话,2*dt,2表示的是子弹一秒移动多少,速度就是2/s,dt表示帧之间的时间差,2*dt,就是子弹的位移差,这样,每次update刷新游戏的时候,就让子弹显示在他应该在的位置,这样就保证了子弹以时间来做移动。这样的结果就是当帧率降低的时候,子弹跳帧。单整体还是比第一种要好的多,保证游戏的整体速度
这几种方法在帧率相同的时候,移动的速度是一样的,如1秒内,update都60次,(2/60)x60 = 2(dt1+dt2...dt60) = 2;
在线游戏第二中方法就格外重要