じ☆ve冰风 发表于 2024-4-19 20:46:02

翻转(水平/垂直)动画

(根据提问区问题如何将数据库动画水平翻转。编写。)


RUBY 代码
#==============================================================================
# ■ 翻转动画 by 各种压力的猫君
#------------------------------------------------------------------------------
#  翻转显示动画,支持水平翻转和垂直翻转,理论支持任何地方的动画显示。
#------------------------------------------------------------------------------
#   使用方法:
#   ① 扩大你的动画数据库上限
#   ② 在设定段指定翻转开始编号
#   ③ 需要翻转播放时播放指定编号的动画
#   特殊动画:
#   数据库中动画名以结尾的动画不会被翻转显示
#   数据库中动画名以结尾的动画会水平翻转显示
#   数据库中动画名以结尾的动画会垂直翻转显示
#   识别标示中的字母可在设定段中更改(正则表达式)
#   ※特殊动画的优先级高于数字指定※
#==============================================================================

#------------------------------------------------------------------------------
# ● 设定段
#------------------------------------------------------------------------------

module FFAni # Full_Flip_Animation

# 水平翻转编号偏移量
# 若设定为100,则101号动画为1号动画的水平翻转(数据库中可以为空)
HF_ID = 100

# 垂直翻转编号偏移量(※请确保这个数字比上面一个数字大!※)
# 若设定为200,则201号动画为1号动画的垂直翻转(数据库中可以为空)
VF_ID = 200

# 特殊动画识别正则表达式
NF_Flag = /\\z/ # 不翻转
HF_Flag = /\\z/ # 水平翻转
VF_Flag = /\\z/ # 垂直翻转

end

"         ┏━━━━━━━━━━━━━━━━━┓         "
"         ┃※以下内容无一定脚本基础请勿修改※┃         "
"         ┗━━━━━━━━━━━━━━━━━┛         "

#==============================================================================
# ■ RPG::Sprite
#------------------------------------------------------------------------------
#  追加了 RPGXP 使用的各种效果处理的精灵的类。
#==============================================================================

module RPG
class Sprite < ::Sprite
    #------------------------------------------------------------------------
    # ● 播放动画
    #------------------------------------------------------------------------
    def animation(animation, hit)
      dispose_animation
      @_animation = animation
      #---------------------------------------------------
      # 根据动画ID判断翻转情况
      #---------------------------------------------------
      if@_animation.id > FFAni::VF_ID    # 垂直
      full_flip = 2
      fixed_animation_id = @_animation.id - FFAni::VF_ID
      elsif@_animation.id > FFAni::HF_ID# 水平
      full_flip = 1
      fixed_animation_id = @_animation.id - FFAni::HF_ID
      end
      #---------------------------------------------------
      # 根据动画名判断翻转情况
      #---------------------------------------------------
      if(FFAni::NF_Flag =~ @_animation.name)# 不翻转
      full_flip = 0
      elsif(FFAni::HF_Flag =~ @_animation.name)# 水平
      full_flip = 1
      elsif(FFAni::VF_Flag =~ @_animation.name)# 垂直
      full_flip = 2
      end
      #---------------------------------------------------
      # 修正参数
      #   @_full_flip
      #   0 : 不翻转
      #   1 : 水平翻转
      #   2 : 垂直翻转
      #---------------------------------------------------
      if full_flip == nil
      @_full_flip = 0
      else
      @_full_flip = full_flip
      end
      unless fixed_animation_id == nil
      @_animation = $data_animations
      end
      #---------------------------------------------------
      returnif@_animation == nil
      @_animation_hit = hit
      @_animation_duration = @_animation.frame_max
      animation_name = @_animation.animation_name
      animation_hue = @_animation.animation_hue
      bitmap = RPG::Cache.animation(animation_name, animation_hue)
      if @@_reference_count.include?(bitmap)
      @@_reference_count += 1
      else
      @@_reference_count = 1
      end
      @_animation_sprites = []
      if@_animation.position != 3ornot @@_animations.include?(animation)
      for i in0..15
          sprite = ::Sprite.new(self.viewport)
          sprite.bitmap = bitmap
          sprite.visible = false
          @_animation_sprites.push(sprite)
      end
      unless @@_animations.include?(animation)
          @@_animations.push(animation)
      end
      end
      update_animation
    end
    #------------------------------------------------------------------------
    # ● 播放循环动画
    #------------------------------------------------------------------------
    def loop_animation(animation)
      returnif animation == @_loop_animation
      dispose_loop_animation
      @_loop_animation = animation
      returnif@_loop_animation == nil
      @_loop_animation_index = 0
      animation_name = @_loop_animation.animation_name
      animation_hue = @_loop_animation.animation_hue
      bitmap = RPG::Cache.animation(animation_name, animation_hue)
      if @@_reference_count.include?(bitmap)
      @@_reference_count += 1
      else
      @@_reference_count = 1
      end
      @_loop_animation_sprites = []
      for i in0..15
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      @_loop_animation_sprites.push(sprite)
      end
      update_loop_animation
    end
    #------------------------------------------------------------------------
    # ● 设定动画Sprites
    #------------------------------------------------------------------------
    def animation_set_sprites(sprites, cell_data, position)
      for i in0..15
      sprite = sprites
      pattern = cell_data
      if sprite == nilor pattern == nilor pattern == -1
          sprite.visible = falseif sprite != nil
          next
      end
      sprite.visible = true
      sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
      if position == 3
          ifself.viewport != nil
            sprite.x = self.viewport.rect.width / 2
            sprite.y = self.viewport.rect.height - 160
          else
            sprite.x = 320
            sprite.y = 240
          end
      else
          sprite.x = self.x - self.ox + self.src_rect.width / 2
          sprite.y = self.y - self.oy + self.src_rect.height / 2
          sprite.y -= self.src_rect.height / 4if position == 0
          sprite.y += self.src_rect.height / 4if position == 2
      end
      #---------------------------------------------------
      # 脚本本体
      #---------------------------------------------------
      case@_full_flip
      when0# 啥也不做
          sprite.x += cell_data
          sprite.y += cell_data
          sprite.angle = cell_data
          sprite.mirror = (cell_data == 1)
      when1# 水平翻转
          sprite.x -= cell_data
          sprite.y += cell_data
          sprite.angle = 360 - cell_data
          sprite.mirror = (cell_data == 0)
      when2# 垂直翻转
          sprite.x += cell_data
          sprite.y -= cell_data
          temp_angel = cell_data + 180
          sprite.angle = temp_angel > 360 ? temp_angel - 360 : temp_angel   
          sprite.mirror = (cell_data == 0)
      end
      #---------------------------------------------------
      sprite.z = 2000
      sprite.ox = 96
      sprite.oy = 96
      sprite.zoom_x = cell_data / 100.0
      sprite.zoom_y = cell_data / 100.0
      sprite.opacity = cell_data * self.opacity / 255.0
      sprite.blend_type = cell_data
      end
    end
end
end


这没啥好截图的 = = b 用法很简单,范例不提供了。
             本帖来自P1论坛作者各种压力的猫君,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=226947若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 翻转(水平/垂直)动画