Project1

标题: 能够修改RM对行走图的设置吗? [打印本页]

作者: myaa475    时间: 2018-5-2 19:26
标题: 能够修改RM对行走图的设置吗?
  我们都知道,RM的行走图是由(见图1)构成的.

  但问题来了:计算一下就会发现角色走路的动画只有4帧!这是什么概念?你玩过帧率在4左右的打枪游戏吗?不熟悉RM的玩家肯定会说:这什么辣鸡游戏啊?走起路来就TM跟便秘一样咳咳.

  所以,如果规格能从4x4变为4x8,玩家们肯定会说:WOW!我从未见过如此厚颜无耻...噢不是行走如此流畅的游戏!赶紧给个好评!

  不过呢,这恐怕就要去修改RM这个软件了 到时候就会引起一大堆版权问题啦!官方肯定会这样说:死啦死啦的!八嘎亚路的中国人!八嘎!

  所以能够修改RM对行走图的设置吗?

  

233.PNG (6.12 KB, 下载次数: 26)

233.PNG

作者: 芯☆淡茹水    时间: 2018-5-2 20:31
目标很远大,想法很好。
RM本来就是相当于轻量级的回合游戏制作工具,4帧动态对于这个已经很合适了。
增加帧数,无非就是几个数字改一下而已。帧数改大了,累美工,再不是就是增加素材制作的难度。
这和RM的 容易做游戏 的初衷背道而驰的。

你可以根据你的需求,提出哪有增加行走动态帧的脚本;而不是一上来就先贬一通。
作者: 芯☆淡茹水    时间: 2018-5-2 20:59
要说改,那倒简单。 但XP的脚本结构真的蛋疼,就仅仅修改了 2 个数字,结果脚本一大堆。

使用下面的脚本, 把角色行走图名字命名为  名字_帧数 ,比如图片名 Actor ,共  8 帧:Actor_8  ,
最小帧数 1, 最大不限。不在后面加 _帧数 的,默认为 4 帧。
  1. #==============================================================================
  2. class Game_Character
  3.   #--------------------------------------------------------------------------
  4.   def max_frame
  5.     return [@character_name.split("_")[1].to_i || 4, 1].max
  6.   end
  7.   #--------------------------------------------------------------------------
  8.   def update
  9.     # 跳跃中、移动中、停止中的分支
  10.     if jumping?
  11.       update_jump
  12.     elsif moving?
  13.       update_move
  14.     else
  15.       update_stop
  16.     end
  17.     # 动画计数超过最大值的情况下
  18.     # ※最大值等于基本值减去移动速度 * 1 的值
  19.     if @anime_count > 18 - @move_speed * 2
  20.       # 停止动画为 OFF 并且在停止中的情况下
  21.       if not @step_anime and @stop_count > 0
  22.         # 还原为原来的图形
  23.         @pattern = @original_pattern
  24.       # 停止动画为 ON 并且在移动中的情况下
  25.       else
  26.         # 更新图形
  27.         @pattern = (@pattern + 1) % max_frame
  28.       end
  29.       # 清除动画计数
  30.       @anime_count = 0
  31.     end
  32.     # 等待中的情况下
  33.     if @wait_count > 0
  34.       # 减少等待计数
  35.       @wait_count -= 1
  36.       return
  37.     end
  38.     # 强制移动路线的场合
  39.     if @move_route_forcing
  40.       # 自定义移动
  41.       move_type_custom
  42.       return
  43.     end
  44.     # 事件执行待机中并且为锁定状态的情况下
  45.     if @starting or lock?
  46.       # 不做规则移动
  47.       return
  48.     end
  49.     # 如果停止计数超过了一定的值(由移动频度算出)
  50.     if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
  51.       # 移动类型分支
  52.       case @move_type
  53.       when 1  # 随机
  54.         move_type_random
  55.       when 2  # 接近
  56.         move_type_toward_player
  57.       when 3  # 自定义
  58.         move_type_custom
  59.       end
  60.     end
  61.   end
  62. end
  63. #==============================================================================
  64. class Sprite_Character < RPG::Sprite
  65.   #--------------------------------------------------------------------------
  66.   def update
  67.     super
  68.     # 元件 ID、文件名、色相与现在的情况存在差异的情况下
  69.     if @tile_id != @character.tile_id or
  70.        @character_name != @character.character_name or
  71.        @character_hue != @character.character_hue
  72.       # 记忆元件 ID 与文件名、色相
  73.       @tile_id = @character.tile_id
  74.       @character_name = @character.character_name
  75.       @character_hue = @character.character_hue
  76.       # 元件 ID 为有效值的情况下
  77.       if @tile_id >= 384
  78.         self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  79.           @tile_id, @character.character_hue)
  80.         self.src_rect.set(0, 0, 32, 32)
  81.         self.ox = 16
  82.         self.oy = 32
  83.       # 元件 ID 为无效值的情况下
  84.       else
  85.         self.bitmap = RPG::Cache.character(@character.character_name,
  86.           @character.character_hue)
  87.         @cw = bitmap.width / @character.max_frame
  88.         @ch = bitmap.height / 4
  89.         self.ox = @cw / 2
  90.         self.oy = @ch
  91.       end
  92.     end
  93.     # 设置可视状态
  94.     self.visible = (not @character.transparent)
  95.     # 图形是角色的情况下
  96.     if @tile_id == 0
  97.       # 设置传送目标的矩形
  98.       sx = @character.pattern * @cw
  99.       sy = (@character.direction - 2) / 2 * @ch
  100.       self.src_rect.set(sx, sy, @cw, @ch)
  101.     end
  102.     # 设置脚本的坐标
  103.     self.x = @character.screen_x
  104.     self.y = @character.screen_y
  105.     self.z = @character.screen_z(@ch)
  106.     # 设置不透明度、合成方式、茂密
  107.     self.opacity = @character.opacity
  108.     self.blend_type = @character.blend_type
  109.     self.bush_depth = @character.bush_depth
  110.     # 动画
  111.     if @character.animation_id != 0
  112.       animation = $data_animations[@character.animation_id]
  113.       animation(animation, true)
  114.       @character.animation_id = 0
  115.     end
  116.   end
  117. end
  118. #==============================================================================
复制代码

作者: chd114    时间: 2018-5-2 21:05
你要做8方向?首先最好解决一下素材问题···8方向行走的脚本不难改

现成的例子(真8方向移动脚本,需要自己准备范例中指定规格的额外行走图素材):
XP:好像失效了的rm天干宝典,我没有,坐等版主补充···
VA:https://rpg.blue/forum.php?mod=viewthread&tid=397209(应该不能直接在RMXP上用)
作者: 89444640    时间: 2018-5-3 01:21
本帖最后由 89444640 于 2018-5-3 01:32 编辑

楼主你在贬低默认素材以前,画个流畅的8帧行走图让我学习一下吧。
问题是不错,正好芯大的脚本我感觉能用上,回头试试效果去。

8帧程序实现很容易,8朝向都很容易,素材你不用商业的没有制作组能画的完?
不说别的,把npc行走图,默认百十来个,包括敌人,挨个给补4个过度帧看看用多长时间。

作者: 89444640    时间: 2018-5-4 11:02
芯☆淡茹水 发表于 2018-5-2 20:59
要说改,那倒简单。 但XP的脚本结构真的蛋疼,就仅仅修改了 2 个数字,结果脚本一大堆。

使用下面的脚本, ...

那个,测试了一下,发现个问题,麻烦芯大修改一下脚本,
使用脚本后,
会造成原先的4帧无法正常使用,如图……

会显示全部的图像

超过4帧的,按照命名方式,显示时正常。
试了一下 模拟效果,爽滑无比、

还请抽空调一下4帧的,使其能正常显示、谢谢。
作者: 芯☆淡茹水    时间: 2018-5-4 11:26
89444640 发表于 2018-5-4 11:02
那个,测试了一下,发现个问题,麻烦芯大修改一下脚本,
使用脚本后,
会造成原先的4帧无法正常使用,如 ...
  1. #==============================================================================
  2. class Game_Character
  3.   #--------------------------------------------------------------------------
  4.   def max_frame
  5.     frame = @character_name.split("_")[1]
  6.     return frame ? [frame.to_i, 1].max : 4
  7.   end
  8.   #--------------------------------------------------------------------------
  9.   def update
  10.     # 跳跃中、移动中、停止中的分支
  11.     if jumping?
  12.       update_jump
  13.     elsif moving?
  14.       update_move
  15.     else
  16.       update_stop
  17.     end
  18.     # 动画计数超过最大值的情况下
  19.     # ※最大值等于基本值减去移动速度 * 1 的值
  20.     if @anime_count > 18 - @move_speed * 2
  21.       # 停止动画为 OFF 并且在停止中的情况下
  22.       if not @step_anime and @stop_count > 0
  23.         # 还原为原来的图形
  24.         @pattern = @original_pattern
  25.       # 停止动画为 ON 并且在移动中的情况下
  26.       else
  27.         # 更新图形
  28.         @pattern = (@pattern + 1) % max_frame
  29.       end
  30.       # 清除动画计数
  31.       @anime_count = 0
  32.     end
  33.     # 等待中的情况下
  34.     if @wait_count > 0
  35.       # 减少等待计数
  36.       @wait_count -= 1
  37.       return
  38.     end
  39.     # 强制移动路线的场合
  40.     if @move_route_forcing
  41.       # 自定义移动
  42.       move_type_custom
  43.       return
  44.     end
  45.     # 事件执行待机中并且为锁定状态的情况下
  46.     if @starting or lock?
  47.       # 不做规则移动
  48.       return
  49.     end
  50.     # 如果停止计数超过了一定的值(由移动频度算出)
  51.     if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
  52.       # 移动类型分支
  53.       case @move_type
  54.       when 1  # 随机
  55.         move_type_random
  56.       when 2  # 接近
  57.         move_type_toward_player
  58.       when 3  # 自定义
  59.         move_type_custom
  60.       end
  61.     end
  62.   end
  63. end
  64. #==============================================================================
  65. class Sprite_Character < RPG::Sprite
  66.   #--------------------------------------------------------------------------
  67.   def update
  68.     super
  69.     # 元件 ID、文件名、色相与现在的情况存在差异的情况下
  70.     if @tile_id != @character.tile_id or
  71.        @character_name != @character.character_name or
  72.        @character_hue != @character.character_hue
  73.       # 记忆元件 ID 与文件名、色相
  74.       @tile_id = @character.tile_id
  75.       @character_name = @character.character_name
  76.       @character_hue = @character.character_hue
  77.       # 元件 ID 为有效值的情况下
  78.       if @tile_id >= 384
  79.         self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  80.           @tile_id, @character.character_hue)
  81.         self.src_rect.set(0, 0, 32, 32)
  82.         self.ox = 16
  83.         self.oy = 32
  84.       # 元件 ID 为无效值的情况下
  85.       else
  86.         self.bitmap = RPG::Cache.character(@character.character_name,
  87.           @character.character_hue)
  88.         @cw = bitmap.width / @character.max_frame
  89.         @ch = bitmap.height / 4
  90.         self.ox = @cw / 2
  91.         self.oy = @ch
  92.       end
  93.     end
  94.     # 设置可视状态
  95.     self.visible = (not @character.transparent)
  96.     # 图形是角色的情况下
  97.     if @tile_id == 0
  98.       # 设置传送目标的矩形
  99.       sx = @character.pattern * @cw
  100.       sy = (@character.direction - 2) / 2 * @ch
  101.       self.src_rect.set(sx, sy, @cw, @ch)
  102.     end
  103.     # 设置脚本的坐标
  104.     self.x = @character.screen_x
  105.     self.y = @character.screen_y
  106.     self.z = @character.screen_z(@ch)
  107.     # 设置不透明度、合成方式、茂密
  108.     self.opacity = @character.opacity
  109.     self.blend_type = @character.blend_type
  110.     self.bush_depth = @character.bush_depth
  111.     # 动画
  112.     if @character.animation_id != 0
  113.       animation = $data_animations[@character.animation_id]
  114.       animation(animation, true)
  115.       @character.animation_id = 0
  116.     end
  117.   end
  118. end
  119. #==============================================================================
复制代码

作者: 89444640    时间: 2018-5-4 15:15
本帖最后由 89444640 于 2018-5-4 15:38 编辑
芯☆淡茹水 发表于 2018-5-4 11:26


补充个测试时候出现的问题,这个跟文件名有关。
有一些很久很久以前导入的文件和外网的免费素材,比如这只猫,文件名tori_neko_a 为了尊重人家原名我没改,结果

有不少这样带   _   的
到游戏中也会回认成这样
红框所示
能不能让明明检测更加严格一些必须是    _后紧跟数字0~9的,才认为是用多帧显示的。


下面两张图没用,图片高度算错了,浏览器似乎没法删

存盘点_8.png (2 KB, 下载次数: 26)

存盘点_8.png

03.png (25 KB, 下载次数: 32)

03.png

作者: soulsaga    时间: 2018-5-4 15:39
本帖最后由 soulsaga 于 2018-5-4 15:45 编辑
89444640 发表于 2018-5-4 15:15
补充个测试时候出现的问题,这个跟文件名有关。
有一些很久很久以前导入的文件和外网的免费素材,比如这 ...


RUBY 代码复制
  1. def max_frame
  2.     frame = @character_name.split("_")[1]
  3.     return frame ? [frame.to_i, 1].max : 4
  4.   end


可以换成其他字符..
作者: 芯☆淡茹水    时间: 2018-5-4 18:48
89444640 发表于 2018-5-4 15:15
补充个测试时候出现的问题,这个跟文件名有关。
有一些很久很久以前导入的文件和外网的免费素材,比如这 ...

  1.   def max_frame
  2.     return @character_name.match(/_(\d+)/) ? [$1.to_i, 1].max : 4
  3.   end
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1