赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 0 |
经验 | 95705 |
最后登录 | 2011-10-23 |
在线时间 | 6 小时 |
Lv1.梦旅人 (禁止发言) 苹果梨
- 梦石
- 0
- 星屑
- 43
- 在线时间
- 6 小时
- 注册时间
- 2007-2-14
- 帖子
- 720
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
此文章没有任何针对性,不是说RMXP垃圾的,只是讨论一个程序的问题,希望大家不要扔臭鸡蛋。
首先我们需要了解什么是滑步现象,以下内容摘自 www.gameres.com 【作者:云风(http://www.codingnow.com)】,我添加修改了部分。
<--------------------------------
角色移动的步长、步速与滑步现象:
滑步只跟步长有关,就是一轮人物行走(或跑步)实际移动的像素。
当然国产游戏大多做的不好。大多数根本不去认真做人物行走的播放程序,简单一帧帧播放动画,并随意移动小人在地图上的位置了事。
防止滑步又可以随意改变人物移动速度的方法是这样的:
将走路的程序用步长和步速两个量来控制。步长必须定死(人每步走的距离总差不多吧?),按做出来的图片中小人一组动画下来,移动的像素为准。
步速是任意的,可以用游戏每X帧或每 X/100 秒,人物移动的像素数来表示(可以是小数,比如每帧刷新移动 1.2 个像素)。
简化讲解,我以横版水平移动走路举例:(斜视角可以类推)
假设步长为 step(pixel),步速为 speed(pixel/frame),人物行走动画帧数为 n(frame)。
注: 其中 step 和 speed 可以是小数; n 是整数。 以下运算全部是浮点运算,真实游戏酌情考虑用整数。
现在要把人物从坐标 0 移动到 100。
我们可以算出,这个过程是需要 100/speed 帧(指人物刷新了多少帧画面不是游戏)来完成的。
那么第 i 帧画面,人物在的位置:
pos=i*speed
这个时候,需要画第几帧图象呢?
首先我们需要知道第 i 帧画面,也就是 pos 这个位置,人物已经走了t=(int)(pos/step)步 (t 取整了);
我们的小人正在走在第 t+1 步的 m=(pos-t*step) * 100% 时刻m 是一个 0~1 之间的数字。
f=|n*m| 就是我们在此时刻需要画的行走图片帧了。
加快行走速度,无非是加快了频率,不可能导致滑步的,因为一步迈出的距离根本不会变。
ps. 对于跑步、有腾空,轻微滑步是允许的,所以可以适当加大步长是允许的。
-------------------------------->
我对人物走路移动的一些见解:
首先,RPG MAKER XP完全没有固定人物移动步长,这点你研究过Game_Character 2脚本块的应该可以发现,因为人物每帧移动的距离step=speed/n(针对固定步长来说)和n不成反比!有谁会认为speed/n*n != speed是正确的呢?这点你创建一个行走速度为Fast以上的NPC可能表现的步明显,但是你创建一个行走速度在Slow以下的人物时,可以明显的看到,人物走路和滑冰一样(腿没有动人却在前进……),这就是滑步现象。实际上RMXP中滑步现象控制的不算太差,因为我不在这里提出,估计很多人都没有认真去观察,可能都没有发现……
解决滑步现象最好的办法是增加人物移动是动画帧数!有用PSXMC提取过PS游戏资源的人发现《圣剑传说》的BMP图片资源可以完全提取出来,人物移动帧数都是7帧的,静止1帧,迈左右脚各3帧,人物走路已经完全看不出滑步现象了。
但是我们的RMXP一般行走都是4帧图象,而且双脚并立就占了2帧……我们必须从程序代码(这里是脚本)上去改变这个现象!所以我将判断人物移动状态刷新的条件
@anime_count > 18 - @move_speed * 2
替换为了
@anime_count > 2 ** ( 7 - @move_speed )
来使人物的行走步长固定
(游戏中步速speed=distance=2 ** @move_speed)
[2 ** ( 7 - @move_speed )]*[2 ** @move_speed]总是固定值了吧……
另外实际上我把步速换成2 ** (@move_speed-1)了,没有人物需要跑到64象素一帧的……
这样很直接的解决了滑步现象,但是现在走路我觉得还存在一点问题。看到《圣剑传说》了吧,里面人物走动时,双脚并立的时间仅仅时双脚迈出去时间的2/6。学过物理,记得单摆的(就是钟摆)的人,应该都了解单摆在最低处速度最快!人在走路的时候,双脚重合的时间也很短,只有在双脚前后着地的时候会停一下(你可以用数码相机连拍功能来证明~)。所以我给代码又进行一点小的改正,让其在双脚并立时快速的再迈出一只脚(处理后双脚并立重合的时间约为迈出脚的时间1/2,离上面的1/3稍微差点)。就是这样了,代码如下公布,处理人物走路是2~6的速度都没什么问题,1是留给乌龟爬的……当然代码一定仍旧有相当多的问题,希望大家不要鄙视我就是。
建议将原脚本以下内容:
# 动画计数超过最大值的情况下
# ※最大值等于基本值减去移动速度 * 1 的值
if @anime_count > 18 - @move_speed * 2
# 停止动画为 OFF 并且在停止中的情况下
if not @step_anime and @stop_count > 0
# 还原为原来的图形
@pattern = @original_pattern
# 停止动画为 ON 并且在移动中的情况下
else
# 更新图形
@pattern = (@pattern + 1) % 4
end
# 清除动画计数
@anime_count = 0
end
替换为以下内容:
# 对现在的行走状态进行判断
case @pattern
# 改进,双脚并立的时间缩短
when 0,2
# 动画计数超过最大值的情况下
if @anime_count > 2 ** (3 - @move_speed / 2)
# 停止动画为 OFF 并且在停止中的情况下
if not @step_anime and @stop_count > 0
# 还原为原来的图形
@pattern = @original_pattern
# 停止动画为 ON 并且在移动中的情况下
else
# 更新图形
@pattern = @pattern + 1
end
# 清除动画计数
@anime_count = 0
end
# 改进,双脚前后站立的画面保留帧数与移动速度成反比
else
# 动画计数超过最大值的情况下
if @anime_count > 2 ** ( 7 - @move_speed )
# 停止动画为 OFF 并且在停止中的情况下
if not @step_anime and @stop_count > 0
# 还原为原来的图形
@pattern = @original_pattern
# 停止动画为 ON 并且在移动中的情况下
else
# 更新图形
@pattern = (@pattern + 1) % 4
end
# 清除动画计数
@anime_count = 0
end
end
另外distance=2 ** @move_speed替换为distance=2 ** (@move_speed-1)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2月22新加入内容:
对于这个贴,我想增加一些修改,就是因为每次计算
2**(7-@move_speed)
还有
2**(3-@move_speed/2)
必定消耗大量CPU资源,所以建议在“角色类1:Game_Character 2”添加新变量
@count1和@count2
在@move_speed后面增加两句
@count1=2**(3-@move_speed/2)
@count2=2**(7-@move_speed)
然后搜索所有的修改@move_speed的地方,在后面都添加以下两句
最后在条件判断时用@count1和@count2就可以了,效果会好很多,至少不会导致CPU卡
[本贴由 叶舞枫 于 2007-6-28 14:29:58 进行了编辑] |
|