查看: 14796|回复: 17

[RMVA发布] 【行走图动画扩展】八方向|奔跑|待机(2018-12-12更新)

[复制链接]

无限の剣制

梦石
0
星屑
10445
在线时间
5019 小时
注册时间
2013-2-28
回帖
4942

开拓者贵宾

发表于 2016-11-6 10:11:19 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 VIPArcher 于 2018-12-21 00:49 编辑

@congwsbn 按葱兔的建议变回了以前那种多个文件用后缀名区别行走图状态的形式 -- 2018/12/12
更新了一个范例,免费提供了一套三头身规格行走图模板(包括八方向、奔跑图、眨眼的待机图)
DASH.gif                GIF.gif
VA真·八方向移动,奔跑,待机[pre lang="ruby"]#===============================================================================
# ■ 八向移动待机行走图动画扩展
# by :VIPArcher [email: VIPArcher@sina.com]
#  -- https://viparcher.github.io/Hexo/2018/12/12/dir8_anime/
#  -- Project1 论坛:https://rpg.blue/ 使用或转载请保留以上信息。
#==============================================================================
# ■ 使用说明:
#   行走图素材文件名最前面添加 '@' 符号视为该角色/事件使用八方向行走图
#   需为其配置对应的其他形态的行走图文件,文件名后缀规则请看设定部分
#     例如  $@Actor1.png / @Actor1.png
#   文件名中带上 [f帧数#默认帧] 来控制行走图动画的帧数和停下时使用的帧
#     例如  $@Actor[f8#4].png / @Actor1[f8#4].png
#   事件也要使用待机动画需要在事件页(当前页)中备注上 <idle_anime>
#   事件的移动速度超过 5 则使用奔跑行走图
#==============================================================================
$VIPArcherScript ||= {};$VIPArcherScript[:dir8_anime] = 20181212
#==============================================================================
# ★ 设定部分 ★
#==============================================================================
module VIPArcher end
module VIPArcher::DIR8_ANIME
  # 配置开始
  DIR8_OFF_SW   = 0  # 控制关闭八方向行走的开关
  IDLE_ANIME_SW = 0  # 控制关闭待机动画的开关
  DASH_ANIME_SW = 0  # 控制关闭奔跑动画的开关
  IDLE_TIME   = 120  # 静止后进入待机动画的时间(帧)
  RIDLE_TIME  = 120  # 待机等待时间浮动值(上下浮动该值一半)默认即 60 - 180 帧
  ANIME_TIME  = 1    # 待机动画循环次数
  GAP_TIME    = 120  # 两次待机动画之间的时间间隔
  IDLE_NOTE   = '<idle_anime>' # 事件使用待机动画的备注
  DASH4_AFFIX = '_DASH'    # 奔跑普通行走图后缀
  IDLE4_AFFIX = '_IDLE'    # 待机普通行走图后缀
  DIRE8_AFFIX = '_8D'      # 普通斜向行走图后缀
  DASH8_AFFIX = '_DASH_8D' # 奔跑斜向行走图后缀(此条仅参考命名,没有实际作用)
  IDLE8_AFFIX = '_IDLE_8D' # 待机斜向行走图后缀(此条仅参考命名,没有实际作用)
  # 配置结束
  #--------------------------------------------------------------------------
  # ● 判断是否多帧
  #--------------------------------------------------------------------------
  def is_multi_frames?
    character_name =~ /\[f\d+#?\d*\]/i
  end
  #--------------------------------------------------------------------------
  # ● 获取帧数
  #--------------------------------------------------------------------------
  def get_frame(character_name)
    character_name =~ /\[f(\d+)#?\d*\]/i ? $1.to_i : 4
  end
  #--------------------------------------------------------------------------
  # ● 获取原图案(静止时矫正帧)
  #--------------------------------------------------------------------------
  def get_halt_name(character_name)
    character_name =~ /\[f\d+#(\d+)\]/i ? $1.to_i : 1
  end
end
#==============================================================================
# ■ Game_Player
#==============================================================================
class Game_Player
  include VIPArcher::DIR8_ANIME
  #--------------------------------------------------------------------------
  # ● 由方向键移动
  #--------------------------------------------------------------------------
  def move_by_input
    return if !movable? || $game_map.interpreter.running?
    if [1, 3, 7, 9].include?(Input.dir8)
      case Input.dir8
      when 1 then move_diagonal(4, 2)
      when 3 then move_diagonal(6, 2)
      when 7 then move_diagonal(4, 8)
      when 9 then move_diagonal(6, 8)
      end; return if @move_succeed
    end unless $game_switches[DIR8_OFF_SW]
    move_straight(Input.dir4) if Input.dir4 > 0
  end
  #--------------------------------------------------------------------------
  # ● 是否奔跑中
  #--------------------------------------------------------------------------
  def is_dash?
    dash? && @stop_count.zero?
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  alias set_frame_refresh refresh
  def refresh
    set_frame_refresh
    @frame = get_frame(@character_name)
    @original_pattern = get_halt_name(@character_name)
  end
end
class Game_Follower
  #--------------------------------------------------------------------------
  # ● 是否奔跑中
  #--------------------------------------------------------------------------
  def is_dash?
    $game_player.is_dash?
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  alias set_frame_refresh refresh
  def refresh
    set_frame_refresh
    @frame = get_frame(@character_name)
    @original_pattern = get_halt_name(@character_name)
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  # * 使队员待机动画不同步,没用alias,如有冲突,请把该脚本放置被冲突脚本上面
  #--------------------------------------------------------------------------
  def update
    @move_speed     = $game_player.real_move_speed
    @transparent    = $game_player.transparent
    @walk_anime     = $game_player.walk_anime
    @step_anime     = @step_anime  #踏步属性不继承队伍
    @direction_fix  = $game_player.direction_fix
    @opacity        = $game_player.opacity
    @blend_type     = $game_player.blend_type
    super
  end
end
class Game_Event
  #--------------------------------------------------------------------------
  # ● 是否奔跑中
  #--------------------------------------------------------------------------
  def is_dash?
    !@locked && @move_speed >= 5 && @stop_count.zero?
  end
  #--------------------------------------------------------------------------
  # ● 是否待机动画
  #--------------------------------------------------------------------------
  def idle_anime?
    @idle_note && @idle_anime
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  alias set_frame_refresh refresh
  def refresh
    set_frame_refresh
    @frame = get_frame(@character_name)
    @original_pattern = get_halt_name(@character_name)
    @list.each do |command|
      if [108, 408].include?(command.code)
        return @idle_note = true if command.parameters.any? do |line|
          line =~ /#{IDLE_NOTE}/i
        end
      end
    end if @list
  end
end
#==============================================================================
# ■ Game_CharacterBase
#==============================================================================
class Game_CharacterBase
  include VIPArcher::DIR8_ANIME
  attr_reader :frame
  attr_reader :static_anime
  attr_accessor :idle_anime
  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  alias dir8_update update
  def update
    dir8_update
    return if $game_switches[IDLE_ANIME_SW]
    return unless idle_anime?
    @step_anime = update_static_anime
  end
  #--------------------------------------------------------------------------
  # ● 更新待机动画
  #--------------------------------------------------------------------------
  def update_static_anime
    case @stop_count
    when static_anime_idle_time...(static_anime_idle_time + idle_anime_time)
      @static_anime = true
    when static_anime_idle_time + idle_anime_time
      @stop_count = static_anime_idle_time - GAP_TIME
      @pattern = @original_pattern
      @static_anime = false
    else @static_anime = false end
  end
  #--------------------------------------------------------------------------
  # ● 进入待机前等待时间获取
  #--------------------------------------------------------------------------
  def static_anime_idle_time
    @anime_idle_time ||= (IDLE_TIME - RIDLE_TIME / 2 + rand(RIDLE_TIME)).to_i
  end
  #--------------------------------------------------------------------------
  # ● 待机总帧数获取
  #--------------------------------------------------------------------------
  def idle_anime_time
    ANIME_TIME * @frame * animation_wait
  end
  #--------------------------------------------------------------------------
  # ● 是否待机动画
  #--------------------------------------------------------------------------
  def idle_anime?; @idle_anime end
  #--------------------------------------------------------------------------
  # ● 是否奔跑
  #--------------------------------------------------------------------------
  def is_dash?; false end
  #--------------------------------------------------------------------------
  # ● 初始化私有成员变量
  #--------------------------------------------------------------------------
  alias set_frame_init_private_members init_private_members
  def init_private_members
    set_frame_init_private_members
    @frame = 4
  end
  #--------------------------------------------------------------------------
  # ● 更新步行/踏步动画
  #--------------------------------------------------------------------------
  def update_animation
    update_anime_count
    if @anime_count > animation_wait
      update_anime_pattern
      @anime_count = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 移动时两帧之间等待时间
  #--------------------------------------------------------------------------
  def animation_wait
    [(9 - real_move_speed) * 3, 2].max
  end
  #--------------------------------------------------------------------------
  # ● 矫正姿势
  #--------------------------------------------------------------------------
  def straighten
    @pattern = @original_pattern if @walk_anime || @step_anime
    @anime_count = 0
  end
  #--------------------------------------------------------------------------
  # ● 更新动画图案
  #--------------------------------------------------------------------------
  def update_anime_pattern
    if !@step_anime && @stop_count > 0
      @pattern = @original_pattern
    else
      @pattern = (@pattern + 1) % @frame
    end
  end
  #--------------------------------------------------------------------------
  # ● 更改图像
  #--------------------------------------------------------------------------
  alias set_frame_set_graphic set_graphic
  def set_graphic(character_name, character_index)
    set_frame_set_graphic(character_name, character_index)
    @frame = get_frame(character_name)
    @original_pattern = get_halt_name(character_name)
  end
  #--------------------------------------------------------------------------
  # ● 斜向移动
  #--------------------------------------------------------------------------
  alias dir8_move_diagonal move_diagonal
  def move_diagonal(horz, vert)
    return @move_succeed = false if !passable?(@x, @y, horz) && !passable?(@x, @y, vert)
    return move_straight(horz) if passable?(@x, @y, horz) && !passable?(@x, @y, vert)
    return move_straight(vert) if passable?(@x, @y, vert) && !passable?(@x, @y, horz)
    dir8_move_diagonal(horz, vert)
    case [horz,vert]
    when [4,2] then set_direction(1)
    when [4,8] then set_direction(7)
    when [6,2] then set_direction(3)
    when [6,8] then set_direction(9)
    end
  end
end
#==============================================================================
# ■ Sprite_Character
#==============================================================================
class Sprite_Character < Sprite_Base
  include VIPArcher::DIR8_ANIME
  #--------------------------------------------------------------------------
  # ● 是否是八方向素材
  #--------------------------------------------------------------------------
  def is_dir8?
    return false if @character_name =~ /#{DIRE8_AFFIX}/
    return @character_name =~ /^(\@|\!\@|\$@|\!\$\@).+/
  end
  #--------------------------------------------------------------------------
  # ● 设置角色的位图
  #--------------------------------------------------------------------------
  alias dir8_move_set_character_bitmap set_character_bitmap
  def set_character_bitmap
    dir8_move_set_character_bitmap
    return unless is_dir8?
    @character_dir8 = {}
    set_character_dir8("", "")
    set_character_dir8(DASH4_AFFIX, DASH4_AFFIX)
    set_character_dir8(IDLE4_AFFIX, IDLE4_AFFIX)
    set_character_dir8(DIRE8_AFFIX, DIRE8_AFFIX)
    set_character_dir8(DASH8_AFFIX, DASH8_AFFIX, DIRE8_AFFIX)
    set_character_dir8(IDLE8_AFFIX, IDLE8_AFFIX, DIRE8_AFFIX)
    frame = @character.is_multi_frames? ? @character.frame : 3
    sign = @character_name[/^[\@\!\$]../]
    @cw = bitmap.width / frame
    @cw /= 4 unless sign && sign.include?('$')
    self.ox = @cw / 2
  end
  #--------------------------------------------------------------------------
  # ● 设置角色的各状态图
  #--------------------------------------------------------------------------
  def set_character_dir8(string, affix, default = "")
    begin
      @character_dir8[string.to_sym] = Cache.character(@character_name + affix)
      @character.idle_anime = true if string.include?(IDLE4_AFFIX)
    rescue
      @character_dir8[string.to_sym] = @character_dir8[default.to_sym]
      @character.idle_anime = false if string.include?(IDLE4_AFFIX)
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新源矩形
  #--------------------------------------------------------------------------
  def update_src_rect
    return if @tile_id != 0
    index = @character.character_index
    frame = @character.is_multi_frames? ? @character.frame : 3
    first = @character.is_multi_frames? ? 0 : 1
    pattern = @character.pattern < frame ? @character.pattern : first
    if (anime_symbol = "#{
      @character.is_dash? && !$game_switches[DASH_ANIME_SW] ?
      DASH4_AFFIX : @character.static_anime ? IDLE4_AFFIX : ''
    }#{@character.direction.odd? ? DIRE8_AFFIX : ''}".to_sym) != @anime_symbol
      @anime_symbol = anime_symbol
      self.bitmap = @character_dir8[anime_symbol]
    end if is_dir8?
    sx = (index % 4 * frame + pattern) * @cw
    if (dir = @character.direction).odd?
      dir = [3, 7].include?(dir) && !is_dir8? ? 10 - dir : dir
      sy = (index / 4 * 4 + (dir + 1) / 3) * @ch
    else
      sy = (index / 4 * 4 + (dir - 2) / 2) * @ch
    end
    self.src_rect.set(sx, sy, @cw, @ch)
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  alias dir8_dispose dispose
  def dispose
    dir8_dispose
    @character_dir8.each_value do |v|
      v.dispose unless v.disposed?
    end if @character_dir8
  end
end[/pre]

行走图模板素材(共6张)
在这个帖子里查看吧


八方向行走-Demo.zip (1.77 MB, 下载次数: 627, 售价: 5 星屑)

评分

参与人数 4星屑 +45 赞 +3 收起 理由
Uirel + 1
sdgn + 1
congwsbn + 1 塞糖
Vortur + 45 沙发在下坐了

查看全部评分

无限の剣制

梦石
0
星屑
10445
在线时间
5019 小时
注册时间
2013-2-28
回帖
4942

开拓者贵宾

 楼主| 发表于 2018-12-23 00:41:34 | 显示全部楼层
本帖最后由 VIPArcher 于 2018-12-23 00:44 编辑

补充一个使用多帧素材后菜单中绘制行走图的补丁。(例如存档界面等地方绘制的行走图)
[pre lang="ruby"]class Window_Base < Window
  include VIPArcher::DIR8_ANIME
  #--------------------------------------------------------------------------
  # ● 绘制人物行走图
  #--------------------------------------------------------------------------
  def draw_character(character_name, character_index, x, y)
    return unless character_name
    bitmap = Cache.character(character_name)
    if character_name =~ /\[f\d+#?\d*\]/i
      frame = get_frame(character_name)
      first = get_halt_name(character_name)
    else
      frame,first = 3,1
    end
    sign = character_name[/^[\@\!\$]../]
    if sign && sign.include?('$')
      cw = bitmap.width / frame
      ch = bitmap.height / 4
    else
      cw = bitmap.width / (frame * 4)
      ch = bitmap.height / 8
    end
    n = character_index
    src_rect = Rect.new((n%4*3+first)*cw, (n/4*4)*ch, cw, ch)
    contents.blt(x - cw / 2, y - ch, bitmap, src_rect)
  end
end[/pre]
回复

使用道具 举报

梦石
0
星屑
1297
在线时间
995 小时
注册时间
2014-12-14
回帖
2939

开拓者

发表于 2017-8-22 23:22:34 | 显示全部楼层
本帖最后由 Vortur 于 2017-8-22 05:30 编辑

很棒的脚本!~❤

这里是14年的版本:https://rpg.blue/thread-373225-1-1.html


  TAT...可是不能跟【Layy Meta Engine】兼容...
【RMVA教程】
---------------------
欲买桂花同载酒,终不似,少年游.
回复

使用道具 举报

无限の剣制

梦石
0
星屑
10445
在线时间
5019 小时
注册时间
2013-2-28
回帖
4942

开拓者贵宾

 楼主| 发表于 2018-12-21 00:11:02 | 显示全部楼层
结束了一趟极其难熬的出差,回来更新了一下这个脚本。
加了一整套三头身女体裸模素材做参考及便于绘制对应行走图
另外加了一个范例,如果还有问题请回帖反馈

未来如果有空的话,可能也会更新一下MV的这个脚本(大概,咕咕咕)

点评

三头身裸女vip酱【雾  发表于 2018-12-21 15:02
回复

使用道具 举报

葱

梦石
26
星屑
13748
在线时间
2230 小时
注册时间
2012-12-12
回帖
567

极短28获奖

发表于 2018-12-21 16:36:41 | 显示全部楼层
是醋VIP,最喜欢的八方向,用爆!

▶ 葱兔の游戏列表 (´・ω・`)
回复 1 0

使用道具 举报

梦石
0
星屑
5217
在线时间
494 小时
注册时间
2018-6-18
回帖
598

超评测参与

发表于 2019-1-13 07:19:04 | 显示全部楼层
谢谢分享这么好的东西!
回复 0 1

使用道具 举报

梦石
0
星屑
75
在线时间
4 小时
注册时间
2019-9-15
回帖
3
发表于 2019-9-16 20:24:06 | 显示全部楼层
感谢,这个怎么使用呢

点评

看脚本说明,帖子里还有个范例,你也可以先看看范例?  发表于 2019-9-17 01:06
冰蓝色的秋天
回复

使用道具 举报

梦石
0
星屑
110
在线时间
12 小时
注册时间
2019-7-11
回帖
7
发表于 2020-1-12 20:28:46 | 显示全部楼层
转为JS文件后,放去MV里,MV测不出来,描述什么都没有,使用后没效果呢。反倒是老板本那个所有帧推一个图的那个就可以,MV里能看到描述也能用,不知为什么,是我哪操作错呢?

点评

凭什么认为为VA写的脚本你转一下JS就能给MV用还完全没问题?  发表于 2020-1-12 23:44
回复 1 0

使用道具 举报

梦石
0
星屑
110
在线时间
12 小时
注册时间
2019-7-11
回帖
7
发表于 2020-1-14 17:17:40 | 显示全部楼层
afeijun 发表于 2020-1-12 20:28
转为JS文件后,放去MV里,MV测不出来,描述什么都没有,使用后没效果呢。反倒是老板本那个所有帧推一个图的 ...

谢谢大佬的提醒,在贴子里翻来翻去,下了好几个,终于新版的015版在MV上可以用了
因为我是菜鸟一名,又不懂编程,大佬们的信息都很简练,看贴都看晕了。之前忘了在哪看到说代码直接保存JS后缀就可用了,就这个劲一个一个下,一个个试,下到了这个015版,带以下这段描述----------------------------------------------------------------
       Normal      |    Normal      |     Normal      |
       4-dir       |    4-dir       |     4-dir       |
       walking     |    running     |     standby     |     EMPTY
       image       |    image       |     image       |
     ----------------------------------------------------------------
       Extra       |    Extra       |     Extra       |
       8-dir       |    8-dir       |     8-dir       |
       walking     |    running     |     standby     |    EMPTY
       image       |    image       |     image       |
     ----------------------------------------------------------------

我才明白,之前试不成功是因为图片格式不对,下载的素材可能是老板本的。总结一下给跟我一样的菜的菜的菜的听(大佬们路过就好了。),

八方向015版,
图素材格式分两行(默认是三帧一个动作,文件名要%开头)

第一行是正四方向的走,跑,待,空
第二行是斜四方向的走,跑,待,空

如果是多帧做一个动作的话,比如6帧动作文件名1111,这样的格式%1111#6,0.png
格式意思就是%+素材名+#动作帧数+,暂停帧.png(+号直接去掉就可以)
文件名最后的0是暂停帧,是松开方向后与待机动画开始之间的那一帧

还有素材格式(3帧)例图。最后说下一,在本站内找到自动寻路8方向配合用,绝了!!

顺便说一下,8方向代码在本站下了有十几个,才试出三四个好用的,自动寻路三个,只有一个好用的,其它的应该是我看不懂所以用不好,大佬们别见怪。

%8v015.png
回复 2 0

使用道具 举报

头像被屏蔽
梦石
0
星屑
40
在线时间
12 小时
注册时间
2020-2-8
回帖
3
发表于 2020-2-11 14:36:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部