|
第一个是限制fps,如固定为60fps。这样每次游戏循环可以通过一int计数来控制动画效果。当实际运行fps不能达到期望的fps时,游戏世界时间比现实时间运行慢。
方法无非是:
a.用flip()来同步垂直刷新(需设置刷新率,如果用户使用了刷新率超频的话,游戏速度会与预期有差别)
b.用while(1)+计时,很占用cpu时间,但速度控制很好。
c.用waitabletimer的event方式,等待时针信号时线程会挂起,cpu消耗较小。缺点是精度比较低,只能到1/60左右.这里是以前写的东西,可以参考一下。http://www.csdn.net/Develop/read_article.asp?id=10590
第二个是不限制fps,用每次循环消耗的现实时间来做计算。这样可以做到游戏运行速度固定,与fps无关。缺点是如果fps较低的话,游戏很难控制。
典型的fps都是用这种方式运行的(如q3/ut)
写点代码解释: 假设一个横版射击游戏,设控制的obj移动速度为30pixel/s
游戏主循环:
clock_t t1,t2;
t1=clock();
while(1){
clock_t t3=clock();
t2=t3-t1;
t1=t3;
LPBYTE in=getinput();
if(in[KEY_LEFT])
obj.x-=30*t3/1000;
......
drawobj();
};
再某些情况下,如果t3太高(fps太低)可能游戏运行会有我们不希望的结果。
设想如果有个子弹移动速度为100pixel/s,obj大小为40.那么在t3=1000时很可能出现
在t=t0 和t=t0+t3的时间点,子弹都不穿过obj,而在t= t0+ tx(0<tx<t3)时相交。
这样就造成了本来会被打掉的东西其实未计算到伤害。(因为实际游戏运行都是时间点,而不可能是连续的线)
|
|