设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 9355|回复: 30
打印 上一主题 下一主题

关于RMXP滑步现象的讨论和解决建议[源]

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

苹果梨

梦石
0
星屑
43
在线时间
6 小时
注册时间
2007-2-14
帖子
720
跳转到指定楼层
1
发表于 2007-2-20 21:41:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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 进行了编辑]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

苹果梨

梦石
0
星屑
43
在线时间
6 小时
注册时间
2007-2-14
帖子
720
2
 楼主| 发表于 2007-2-20 21:41:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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 进行了编辑]

Lv1.梦旅人

匿·蹤

梦石
0
星屑
65
在线时间
99 小时
注册时间
2006-3-19
帖子
456
3
发表于 2007-2-21 03:05:06 | 只看该作者
嗯,先ORZ下……

有空在看吧……

应该可以改善视觉效果才对……
卐忍 → 解忍 → 元忍 → 隐忍 → 卍忍 → 匿踪(最终)
完全退步到了卐忍阶段
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

苹果梨

梦石
0
星屑
43
在线时间
6 小时
注册时间
2007-2-14
帖子
720
4
 楼主| 发表于 2007-2-21 04:11:32 | 只看该作者
汗,是不是大家对长篇的技术文章没有兴趣啊?……
这里的人难道只喜欢直接用做好的脚本吗?晕……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

翔于天壤之人<

梦石
0
星屑
50
在线时间
1 小时
注册时间
2006-10-10
帖子
708
5
发表于 2007-2-21 05:23:30 | 只看该作者
划步现象可否使用提高贞播放速度的方法来解决?
就是说人物行走图的播放速度提升一定速率...好像和楼主说的一样...
一般我遮盖这个问题的方法都是提高角色的移动速度,这样一般玩家很难察觉吧..很偷懒的方法..
回复 支持 反对

使用道具 举报

Lv2.观梦者


  • 更新完成啦

梦石
0
星屑
769
在线时间
6267 小时
注册时间
2006-6-7
帖子
8462
6
发表于 2007-2-21 05:25:47 | 只看该作者
这样做的话虽然视觉效果也许会有点尴尬{/gg}
还是看了下 受教了

不过
以下引用gpra8764于2007-2-20 20:11:32的发言:
这里的人难道只喜欢直接用做好的脚本吗?晕……

这句话是可以否认的
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2006-3-20
帖子
19
7
发表于 2007-2-21 05:28:25 | 只看该作者
用了楼主的脚本,{/qiang}{/qiang}{/qiang},不过看了一知半解的,只能感谢分享了...

这样改了以后移动速度有点慢,能不能加快一倍啊
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

苹果梨

梦石
0
星屑
43
在线时间
6 小时
注册时间
2007-2-14
帖子
720
8
 楼主| 发表于 2007-2-21 07:20:34 | 只看该作者
以下引用传说VS天涯于2007-2-20 21:25:47的发言:

这样做的话虽然视觉效果也许会有点尴尬
还是看了下 受教了

不过

以下引用gpra8764于2007-2-20 20:11:32的发言:
这里的人难道只喜欢直接用做好的脚本吗?晕……


这句话是可以否认的

嘿嘿,随便说说你也当真啊?
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

苹果梨

梦石
0
星屑
43
在线时间
6 小时
注册时间
2007-2-14
帖子
720
9
 楼主| 发表于 2007-2-21 07:24:14 | 只看该作者
以下引用DQRPG于2007-2-20 21:28:25的发言:

用了楼主的脚本,,不过看了一知半解的,只能感谢分享了...

这样改了以后移动速度有点慢,能不能加快一倍啊


[本贴由作者于 2007-2-20 21:34:05 最后编辑]

可以不将distance=2 ** @move_speed替换为distance=2 ** (@move_speed-1),走路速度为原来2倍,但是不建议。
我提倡的方法就是在Game_Character 1脚本块里将角色默认移动速度@move_speed = 4(在初始化部分里)改成5。
这个因为我将游戏默认FPS改成30了,所以感觉还好。希望大家机器吃得消……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

逃兵

10
发表于 2007-2-22 05:58:47 | 只看该作者
LZ强悍~
此帖值得一看
加精

鉴定完毕
「If you judge people, you have no time to love them.」—— Mother Teresa
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-15 13:11

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表