如何控制精灵移动的速度
比如一些游戏(2d)场景中一些精灵吃了物定的物品后移动速度加快。并且不出现跳跃感。 问题点数:0、回复次数:13Top
1 楼mgphuang(tony)回复于 2004-08-01 22:34:20 得分 0
精灵动图的时间间隔:StepCount
精灵上一帧动画开始时间:OldTimeTick
在每一次游戏主循环里检测
if (GetTimeTick()-OldTimeTic > StepCount)
{
//下一帧啊.
}
如果吃了东西,则把StepCount的值变小就可以了.
Top
2 楼DarthVader(mm咋就那么白呢 唉 还是当黑炭吧)回复于 2004-08-01 23:06:35 得分 0
精灵类应该有速度成员变量的 吃了奖励之后提高速度值就可以了 关键是你说的平滑 如果按上面的思路 每帧改变物体位置 速度大幅度提高之后 必然会有一定的跳跃现象
看一下另一种思路:你可以设置一个计数器 用来控制物体的运动 每次当这个计数器增加到一定门限值 比如说是8 才让物体按照速度移动一下 要提高物体的运动速度 只要把门限值改小 比如4 那么物体每当计数器增加到4的时候就会移动 你可以试试效果Top
3 楼mgphuang(tony)回复于 2004-08-02 09:09:16 得分 0
补充一下,在提高精灵的每帧间隔后,这里的动画的帧数应该密集一些,这样才会比较平滑.Top
4 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2004-08-03 15:19:53 得分 0
老问题了
给精灵定义一个移动方向和移动速度
每次都使用
新位置 = 老位置 + 移动方向×移动速度×帧时间
这个公式来计算新位置,然后在新位置绘制精灵
而不要采取
新位置 = 老位置 + 移动方向 × 固定量
这种方式
通过速度和帧速度来控制运动距离可以有效避免系统配置的问题和跳跃的问题。
Top
5 楼DarthVader(mm咋就那么白呢 唉 还是当黑炭吧)回复于 2004-08-03 15:57:16 得分 0
hehe happy__888([顾问团]寻开心) 提到的办法在Windows游戏编程大师里面就有讲解 的确如此 用了第一个公式之后 不管机器 相同时间间隔中 相同的速度总能运动相同的距离 而如果用第二个公式每帧改变位置的话 fps一变 物体的运动频率也变了
Top
6 楼kofightas(追求代码的优雅)回复于 2004-08-05 11:29:18 得分 0
只要固定帧数到30以上,移动较快也不会有跳跃感
新位置 = 老位置 + 移动方向 × 固定量
的方法在一般2D游戏中是适用的。如果你的移动速度非常之快确实有跳跃感,可以尝试把游戏的最高帧数固定在60,fps=60的时候就不可能有跳跃感了。happy__888([顾问团]寻开心)和mgphuang(tony)的方法是不使用固定帧数时用的.现在看来2D游戏使帧数固定效果好些。
新位置 = 老位置 + 移动方向×移动速度×帧时间
这个用在3D游戏中,因为3D游戏一般不是帧驱动而是时间驱动的.
Top
7 楼kofightas(追求代码的优雅)回复于 2004-08-05 11:35:41 得分 0
补充一下,关于两种方法
(限制帧数)新位置 = 老位置 + 移动方向 × 固定量 (1)
(不限制帧数)新位置 = 老位置 + 移动方向×移动速度×帧时间 (2)
在机器速度足够的时候都能正常工作,而在机器效能不足的情况下,(1)的游戏速度会变慢,(2)的游戏速度不变,但出现大量丢帧.Top
8 楼wy99sinacom(道)回复于 2004-09-26 18:08:18 得分 0
应该采取第2种方式,第一中方式不易扩展,
第一种方式只要把帧时间设为固定量就可以在不用修改程序的基础上变成第一中方式Top
9 楼wy99sinacom(道)回复于 2004-09-26 18:09:25 得分 0
上面写错了
应该采取第2种方式,第一中方式不易扩展,
第二种方式只要把帧时间设为固定量就可以在不用修改程序的基础上变成第一中方式
Top
10 楼lhylhy(梁海鹰)回复于 2004-09-26 20:59:28 得分 0
只要帧数高就没关系Top
11 楼Researcher(游戏人)回复于 2004-09-27 11:33:26 得分 0
(不限制帧数)新位置 = 老位置 + 移动方向×移动速度×帧时间
这种方法虽然可以恒速,但也有问题,那就是如果帧时间太长会出现碰撞检测失败之类的问题,因为精灵运动跨度太大.我还是不太赞成.Top
12 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2004-09-27 15:30:39 得分 0
是这样的,完整的计算方案是
len = 移动速度×帧时间
if ( len > MAX_LIMIT ) len = MAX_LIMIT
新位置 = 老位置 + 移动方向×LEN;
移动跨度大的可能只发生在帧时间超常的情况下,这种情况在系统当中是很少出现的
当你完成一个程序的时候,客户的计算机配置使得运行速度往往差异几倍甚至几十倍
这就导致,你在自己电脑上调制的固定距离移动方法在不同电脑上差异非常的大
而速度×帧时间的方法,是保障在不同配置的电脑上运行速度一致的方法
固定帧率的办法在2d游戏当中比较常用,因为可以保障大多数电脑都满足2d游戏的配置需求
在3d环境当中差异就会很大,保证帧率是很难做到的一件事情,而且限制了高性能电脑的平滑效果了Top
13 楼asklxf(xuefeng)回复于 2004-09-27 19:26:09 得分 0
使用timer来触发帧事件是不行的,你看看游戏编程精髓有篇文章讲了如何写游戏中的clockTop




