Project1

标题: 角色停止时动画 [打印本页]

作者: 黑米馒头    时间: 2014-9-3 09:11
标题: 角色停止时动画
下面这段脚本放在Game_Character里的话,角色的图形会自动变化,效果就像事件里NPC的【停止时动画】的效果一样。
  1. alias add_update_xdrs update
  2.   def update
  3.       @step_anime = true
  4.       add_update_xdrs
  5.    end
复制代码
现在想把他放到Scene_Menu里,但是就出现alias add_update_xdrs update这句错误。有办法解决吗。
作者: 无双sxa    时间: 2014-9-3 18:39
需要实现角色停止时动画的话,可以使用设置移动路线。
作者: 紫英晓狼1130    时间: 2014-9-3 22:07
一般我都会使用变量和矩形描绘的方法
变量小于四加一,如果等于五,带入值为一
描绘时高除四,宽也除四同时乘该变量
当然都是在update里
通俗的不能再通俗了呢
作者: chd114    时间: 2014-9-4 06:22
Menu里面显示的好像是战斗图你用一个行走图才有效果的停止时动画做什么
作者: 黑米馒头    时间: 2014-9-4 06:44
chd114 发表于 2014-9-4 06:22
Menu里面显示的好像是战斗图你用一个行走图才有效果的停止时动画做什么 ...

请看图。。。。。。。。。。。。。。

未标题-1.jpg (261.93 KB, 下载次数: 5)

未标题-1.jpg

作者: cinderelmini    时间: 2014-9-4 13:10
本帖最后由 cinderelmini 于 2014-9-4 14:38 编辑

原理参考Scene_Map,
在Scene_Menu里建立了一个地图活动块,
(其实如果你用的是同个方式在Scene_Menu里显示地图的话那就是一样的了。)
然后update它,需要注意的事,update的时候,

  1. $game_map.update
  2. $game_player.update
  3. $game_system.update
  4. $game_screen.update
复制代码
这些变量都是要更新的,不然是没有动态效果的。

在Game_Character里加入了你上面那个让主角踏步的脚本后,
在Main前insert下面这段脚本,就能在菜单主界面Scene_menu里让地图的所有元素都动起来了。
但需要注意的是,即使菜单打开,角色还是可以操作的,
在这个过程中触发的NPC事件会在退出菜单后执行。
  1. class Scene_Menu
  2.   # ☆ 建立地图活动块
  3.   def create_screen
  4.     @screen = Spriteset_Map.new
  5.   end
  6.   # ☆ 释放地图
  7.   def dispose_screen
  8.     @screen.dispose
  9.   end
  10.   # ☆ 主处理
  11.   alias main_old main
  12.   def main
  13.     create_screen
  14.     main_old
  15.     dispose_screen
  16.   end
  17.   # ☆ 更新地图活动块
  18.   def update_screen
  19.     # 地图和角色等更新
  20.     $game_map.update
  21.     $game_player.update
  22.     # 系统 (计时器)、画面刷新
  23.     $game_system.update
  24.     $game_screen.update
  25.     @screen.update
  26.   end
  27.   # ☆ 画面更新
  28.   alias :org_update :update
  29.   def update
  30.     update_screen
  31.     org_update
  32.   end
  33. end
复制代码
如果你已经建立了地图活动块,
那么请参照自己建立的那个地图活动块变量名,在下面这段里修改变量名。
  1. class Scene_Menu
  2.   # ☆ 更新地图活动块
  3.   def update_screen
  4.     # 地图和角色等更新
  5.     $game_map.update
  6.     $game_player.update
  7.     # 系统 (计时器)、画面刷新
  8.     $game_system.update
  9.     $game_screen.update
  10.     @你已经建立的地图活动块名字.update
  11.   end
  12.   # ☆ 画面更新
  13.   alias :org_update :update
  14.   def update
  15.     update_screen
  16.     org_update
  17.   end
  18. end
复制代码
其他的Scene同理。




分割线



要不移动的话,稍微有点麻烦~
首先找到
  1. Game_Player
复制代码
脚本,
然后在里面找到
  1. def update
  2.     # 本地变量记录移动信息
  3.     last_moving = moving?
  4.     # 移动中、事件执行中、强制移动路线中、
  5.     # 信息窗口一个也不显示的时候
  6.     unless moving? or $game_system.map_interpreter.running? or
  7.            @move_route_forcing or $game_temp.message_window_showing
  8.       # 如果方向键被按下、主角就朝那个方向移动
  9.       case Input.dir4
  10.       when 2
  11.         move_down
  12.       when 4
  13.         move_left
  14.       when 6
  15.         move_right
  16.       when 8
  17.         move_up
  18.       end
  19.     end
复制代码
这里,需要在移动的操作中加上Scene的当前状态的判定,
比如在条件里加上Scene处于菜单Scene的情况的话,就是:
  1.    # 移动中、事件执行中、强制移动路线中、
  2.     # 信息窗口一个也不显示的时候
  3.     unless moving? or $game_system.map_interpreter.running? or
  4.            @move_route_forcing or $game_temp.message_window_showing or $scene.is_a?(Scene_Menu)
复制代码
注意最后一个“or”后面的内容,需要添加其他Scene的话就自行在后面再加or,
句式语法是一样的。



分割线


刚想了一下,发现菜单中触发事件的情况也可以避免,
先在
  1. Game_Player
复制代码
里找到:

  1.     # 不在移动中的情况下
  2.     unless moving?
  3.       # 上次主角移动中的情况
  4.       if last_moving
  5.         # 与同位置的事件接触就判定为事件启动
  6.         result = check_event_trigger_here([1,2])
  7.         # 没有可以启动的事件的情况下
  8.         if result == false
  9.           # 调试模式为 ON 并且按下 CTRL 键的情况下除外
  10.           unless $DEBUG and Input.press?(Input::CTRL)
  11.             # 遇敌计数下降
  12.             if @encounter_count > 0
  13.               @encounter_count -= 1
  14.             end
  15.           end
  16.         end
  17.       end
  18.       # 按下 C 键的情况下
  19.       if Input.trigger?(Input::C)
  20.         # 判定为同位置以及正面的事件启动
  21.         check_event_trigger_here([0])
  22.         check_event_trigger_there([0,1,2])
  23.       end
  24.     end
复制代码
在这前面一行,插入一句
  1. return unless $scene.is_a?(Scene_Map)
复制代码
就能成功避免触发了事件返回地图时执行事件了。




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