| 赞 | 0 |
| VIP | |
| 好人卡 | |
| 积分 | 42 |
| 经验 | |
| 最后登录 | 2026-5-16 |
| 在线时间 | 553 小时 |
- 梦石
- 0
- 星屑
- 4248
- 在线时间
- 553 小时
- 注册时间
- 2016-8-11
- 回帖
- 5
|
发表于 2025-6-22 23:27:15
|
显示全部楼层
本帖最后由 瓦第四十 于 2025-6-23 00:01 编辑
大概是这种效果的我倒是有一个。
论坛只能上传2mb的gif所以帧数很低。
原理是给带有指定状态的单位持续检测周围的动画精灵,如果有人的战斗精灵或者动画精灵接近带有该状态的单位,则立即暂停敌人,并且执行公共事件和播放动画(公共事件里面的强制战斗行动只会在别人行动结束之后才能执行,没法中途插入,所以我单独写了一个简单的播放动画的类来增加对抗演出)。要修改播放的动画可以全局搜索(按ctrl+alt+f):#v1.3 播放额外的动画 ,修改id来指定播放的动画。
该状态的备注栏里面写<招架动画 冷却帧数 持续帧数 公共事件ID>,冷却帧数是为了防止在同一个动画里面反复触发导致游戏卡死的,持续帧数是暂停的帧数。
还有,这个gif演示的效果是我魔改后知后觉的横版实现的,里面有很多其他脚本,我也不太记得用到哪几个了,你看看我发的这部分有没有参考价值。
下面这段是全局获取敌人的脚本。
[fold=三精合一(角色获取精灵,精灵获取角色,全局获取精灵)]# 用于存储战斗中所有的精灵(角色和敌人)
- class Spriteset_Battle
- #---------------------------------------------------------------------------
- # ● 获取敌人和角色的精灵并存入全局变量
- #---------------------------------------------------------------------------
- alias battler_sprites_WDSS battler_sprites
- def battler_sprites
- battler_sprites_WDSS
- $battler_sprites = @enemy_sprites + @actor_sprites
- end
- end
- #---------------------------------------------------------------------------
- # 用于获取精灵关联的单位(角色或敌人)
- class Sprite_Battler < Sprite_Base
- # 获取与该精灵关联的战斗单位(角色或敌人)
- def JNMB_WDSS
- return [url=home.php?mod=space&uid=133701]@battler[/url] if @battler
- #return nil # 没有对应的 battler,返回 nil
- end
- end
- #---------------------------------------------------------------------------
- # 获取指定角色或敌人精灵
- class Game_Battler < Game_BattlerBase
- def get_battler_sprite
- # 通过单位的类型(角色或敌人)来找到对应的精灵
- $battler_sprites.find { |sprite| sprite.JNMB_WDSS == @battler }
- end
- end
复制代码
[/fold]
下面这段是招架动画的核心脚本
[fold=└招架动画1.3]- [fold=└招架动画1.3]=begin
- 招架动画脚本
- 其实功能很复合,为每个动画精灵添加了标识符,并且可以正确获取,
- 目前还有个问题,动画精灵的坐标是错误的,和人物坐标的计算方式不一样。
- 作者 by 瓦第四十
- v1.0 2025012801:52
- 需要三精合一的脚本支持
- v1.1 2025013020:38
- 修复严重BUG,会导致存档被删除。
- 禁用修改默认精灵类,会导致存档无法保存和载入,并且会删除存档。
- v1.2 2025052501:46
- 修复了原本修改sprite会导致无法存档的问题,
- 改为修改sprite_base。
- 添加了招架动画的暂停动画精灵功能,
- 现在使用<招架动画 冷却帧数 持续帧数 公共事件ID>来释放招架动画,
- 例如<招架动画 600 120 77>,
- 招架间隔为600个脚本帧,招架期间暂停动画120帧,唤起77号公共事件。
- ※冷却帧数最好设置的大于持续帧数,不然你就可以无限卡死了。
- v1.3 2025062222:20
- 增加强制使触发招架的单位行动。好像没什么用,这个功能取消了。
- 修复多次播放animation动画导致卡顿的问题。
- 播放额外的动画。
- =end
- # 判断角色是否有"招架"状态
- class Game_Battler < Game_BattlerBase
- attr_accessor :parry_cooldown #招架CD(单位:帧数)
- attr_accessor :parry_ZJSJ #招架持续时间(单位:帧数)
- attr_accessor :parry_GGSJ #公共事件ID
- def has_parry_state?
- resulte = false
- states.any? { |state| resulte = true if state.note =~ /<招架动画 (\d+) (\d+) (\d+)>/i }
- @parry_cooldown = $1.to_i
- @parry_ZJSJ = $2.to_i
- @parry_GGSJ = $3.to_i
- return resulte
- end
-
- def move_battler_sprite(x, y)
- sprite.x += x
- sprite.y += y
- end
-
- attr_accessor :last_skill_id # 存储上一次技能 ID
- alias wdss_use_item_20250127 use_item
- def use_item(item)
- if item.is_a?(RPG::Skill)
- @last_skill_id = item.id
- end
- wdss_use_item_20250127(item)
- end
- def current_skill_id
- return @last_skill_id || 0
- end
- end
- # 战斗角色精灵类
- class Sprite_Battler < Sprite_Base
- alias original_initialize initialize
- def initialize(viewport, battler = nil)
- original_initialize(viewport, battler)
- @animation_manager = AnimationManager.new # 初始化动画管理器
- @parry_cooldown = 0 #冷却时间(CD)
- @parry_ZJSJ = 0 #招架持续时间
- end
- # 检查是否触发招架动画
- def check_parry_trigger
- return unless @battler && @battler.has_parry_state? # 确保角色有"招架"状态
-
- # 设置检测范围
- parry_range = {
- x_min: x - 32,
- x_max: x + width + 32,
- y_min: y - 32,
- y_max: y + height + 32
- }
-
- # 检查所有战斗精灵和动画精灵
- ($battler_sprites + $all_animation_sprites).each do |target_sprite|
- #p target_sprite.is_battler_sprite if target_sprite.instance_variable_defined?(:@is_battler_sprite)
- next if target_sprite.disposed? || target_sprite == self # 排除自身和已销毁的精灵
- #next if target_sprite.x == 0 && target_sprite.y ==0 #&& target_sprite.skill_id == @battler.current_skill_id #&& target_sprite.instance_variable_defined?(:@is_battler_sprite)
- #~ p parry_range[:y_min]
- #~ p target_sprite.y
- #~ p parry_range[:y_max]
- #~ p "========================"
- #~ p parry_range[:x_min]
- #~ p target_sprite.x
- #~ p parry_range[:x_max]
- if target_sprite.x.between?(parry_range[:x_min], parry_range[:x_max]) &&
- target_sprite.y.between?(parry_range[:y_min], parry_range[:y_max])
- @parry_cooldown = @battler.parry_cooldown
- @parry_ZJSJ = @battler.parry_ZJSJ
- trigger_parry_animation(target_sprite ,@battler.parry_GGSJ) if @is_zhaojiazhong_zantingdonghua != true# 触发招架动画 #v1.3
- else
- next
- end
- end
-
- end
- # 触发招架动画
- def trigger_parry_animation(target_sprite ,gonggongshijian = nil)
- @is_zhaojiazhong_zantingdonghua = true
- @zhaojiaduixiang = target_sprite
- # 增强版触发方式
- if gonggongshijian
- # 方法1:直接插入到事件队列
- $game_map.interpreter.setup($data_common_events[gonggongshijian].list, gonggongshijian)
- $game_map.interpreter.update
- #@battler.force_action(11, self.JNMB_WDSS.index)
- #BattleManager.force_action(@battler)#v1.3
- #v1.3 播放额外的动画
- parry_sprite = AnimationSprite.new(target_sprite.viewport)
- parry_sprite.play_parry_animation(169, target_sprite.x, target_sprite.y)
- @animation_manager.add_animation(parry_sprite, $data_animations[169])
- parry_sprite1 = AnimationSprite.new(self.viewport)
- parry_sprite1.play_parry_animation(133, self.x, self.y)
- @animation_manager.add_animation(parry_sprite1, $data_animations[168])
- #v1.3
- # 调试输出
- p "强制触发公共事件 成功!坐标:#{self.x},#{self.y}"
- else
- p "错误:数据库中没有 号公共事件!"
- end
- end
- alias original_update update
- def update
- original_update
- @animation_manager.update if @animation_manager # 更新动画管理器
- @parry_cooldown -= 1 if @parry_cooldown > 0 #CD倒计时-1
- @parry_ZJSJ -= 1 if @parry_ZJSJ > 0 #招架持续时间-1
- if @parry_cooldown <= 0
- check_parry_trigger # 检查是否触发招架动画
- end
- #p 114 if @parry_ZJSJ > 0
- @is_zhaojiazhong_zantingdonghua = false if @parry_ZJSJ <= 0
-
- end
-
- def play_new_animation(animation_id, x, y)
- new_animation_sprite = AnimationSprite.new(self.viewport)
- new_animation_sprite.play_parry_animation(animation_id, x, y)
- #~ @animation_manager.add_animation(new_animation_sprite, $data_animations[animation_id])
- end
- end
- # 专用于播放动画的精灵类 - 简化版
- class AnimationSprite < Sprite_Base
- def initialize(viewport = nil)
- super(viewport)
- self.z = 200
- end
- def play_parry_animation(animation_id, x, y)
- self.x = x
- self.y = y
- animation = $data_animations[animation_id]
- return if animation.nil?
- start_animation(animation)
- end
-
- # 直接使用父类的update方法
- alias original_animation_update update
- def update
- original_animation_update
- # 如果动画播放完毕,释放资源
- dispose if !animation?
- end
- end
- # 动画管理器类 - 保持简单
- class AnimationManager
- def initialize
- @animations = []
- end
- def add_animation(sprite, animation)
- @animations << {sprite: sprite, animation: animation}
- end
- def update
- @animations.each {|anim| anim[:sprite].update}
- @animations.reject! {|anim| anim[:sprite].disposed? }
- end
- end
- #1.1 禁用修改默认精灵类,会导致存档无法保存和载入,并且会删除存档
- #class Sprite
- # # 是否是动画精灵的标识 技能id 动画id
- # attr_accessor :is_battler_sprite, :skill_id, :animation_id, :battler
- #
- # alias WDSS_original_initialize initialize
- # def initialize(viewport = nil)
- # WDSS_original_initialize(viewport)
- # @is_battler_sprite = false
- # @skill_id = 0 # 当前技能的ID
- # @animation_id = 0 # 当前动画的ID
- # end
- #end
- #1.1
- class Sprite_Base < Sprite
- # 是否是动画精灵的标识 技能id 动画id
- attr_accessor :is_battler_sprite, :skill_id, :animation_id, :battler
- attr_accessor :is_zhaojiazhong_zantingdonghua #招架中,暂停动画
- alias WDSS_ZJDH_initialize initialize
- def initialize(viewport = nil)
- WDSS_ZJDH_initialize(viewport)
- @is_battler_sprite = false
- @is_zhaojiazhong_zantingdonghua = false
- @skill_id = 0 # 当前技能的ID
- @animation_id = 0 # 当前动画的ID
- end
- # 全局变量,用于存储所有正在播放的动画精灵
- $all_animation_sprites = []
- alias original_animation_set_sprites animation_set_sprites
- def animation_set_sprites(frame)
- original_animation_set_sprites(frame)
- # 将当前帧的精灵添加到全局变量中,并标记为动画精灵
- $all_animation_sprites.concat(@ani_sprites.compact.map do |sprite|
- sprite.is_battler_sprite = true if sprite.instance_variable_defined?(:@is_battler_sprite)
- #p sprite#.is_battler_sprite if sprite.instance_variable_defined?(:@is_battler_sprite)
- #~ p self
- # 给每个精灵分配对应的技能ID和动画ID
- sprite.skill_id = get_current_skill_id if sprite.instance_variable_defined?(:@skill_id)#if sprite.respond_to?(:skill_id)
- sprite.animation_id = generate_unique_animation_id if sprite.instance_variable_defined?(:@animation_id)#if sprite.respond_to?(:animation_id)
-
- sprite
- end)
- end
- # 获取当前技能ID
- def get_current_skill_id
- # 获取battler的当前技能ID
- return @battler.current_skill_id if @battler # 确保battler存在
- return 0
- end
- # 生成一个唯一的动画ID
- def generate_unique_animation_id
- return @battler.animation_id if @battler
- return 0
- end
- #--------------------------------------------------------------------------
- # ● 更新动画
- #--------------------------------------------------------------------------
- alias update_animation_ZJDH_20250525_WDSS update_animation
- def update_animation
- #p @zhaojiaduixiang
- return if @is_zhaojiazhong_zantingdonghua #&& @zhaojiaduixiang
- update_animation_ZJDH_20250525_WDSS
- end
- end
复制代码
[/fold]
|
-
|