设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1423|回复: 2
打印 上一主题 下一主题

[已经解决] 本人新人脚本盲,求问怎么将灵魂升天的效果和彩虹神剑.....

[复制链接]

Lv1.梦旅人

梦石
0
星屑
104
在线时间
165 小时
注册时间
2014-2-1
帖子
13
跳转到指定楼层
1
发表于 2015-3-2 13:22:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x

本人新人脚本盲,在添加了彩虹神剑脚本后,发现原本的角色阵亡灵魂升天脚本失效了,角色阵亡后出现了如图中红圈所示的变白效果而已,因为灵魂升天的脚本没有注释,我看不懂,不知道怎么将两个脚本合并,既能有彩虹神剑的连击效果,又可以使角色阵亡后出现灵魂升天的效果,麻烦大神指点下怎么将两个脚本综合下?
下面附上两个脚本:
灵魂升天脚本:
RUBY 代码复制
  1. module RPG
  2.   class Sprite < ::Sprite   
  3.     def initialize(viewport = nil)
  4.       super(viewport)
  5.       @_whiten_duration = 0
  6.       @_appear_duration = 0
  7.       @_escape_duration = 0
  8.       @_collapse_duration = 0
  9.       @_damage_duration = 0
  10.       @_animation_duration = 0
  11.       @_blink = false
  12.       @coll_time = 0
  13.     end
  14.     def collapse
  15.       @coll.dispose if @coll != nil  
  16.       @coll = Sprite.new
  17.       @coll.bitmap = Bitmap.new("Graphics/Battlers/#{@battler_name}")  
  18.       @coll.ox = self.ox
  19.       @coll.oy = self.oy
  20.       @coll.opacity = 100
  21.       @coll.z = 0
  22.       @coll.blend_type = 1
  23.       @coll.x = self.x
  24.       @coll.y = self.y
  25.       @coll_time = 42
  26.       @_whiten_duration = 0
  27.       @_appear_duration = 0
  28.       @_escape_duration = 0
  29.     end
  30.     def update
  31.       super
  32.       if @_whiten_duration > 0
  33.         @_whiten_duration -= 1
  34.         self.color.alpha = 128 - (16 - @_whiten_duration) * 10
  35.       end
  36.       if @_appear_duration > 0
  37.         @_appear_duration -= 1
  38.         self.opacity = (16 - @_appear_duration) * 16
  39.       end
  40.       if @_escape_duration > 0
  41.         @_escape_duration -= 1
  42.         self.opacity = 256 - (32 - @_escape_duration) * 10
  43.       end
  44.       if @coll_time > 0
  45.         @coll_time -= 1
  46.         @coll.y = self.y - (48 - @coll_time) * 6
  47.         self.opacity = 256 - (48 - @coll_time) * 6
  48.         if @coll_time == 0
  49.           @coll.dispose
  50.         end
  51.       end
  52.       if @_damage_duration > 0
  53.         @_damage_duration -= 1
  54.         case @_damage_duration
  55.         when 38..39
  56.           @_damage_sprite.y -= 2
  57.         when 36..37
  58.           @_damage_sprite.y -= 4
  59.         when 34..35
  60.           @_damage_sprite.y -= 2
  61.         when 28..33
  62.           @_damage_sprite.y -= 4
  63.         end
  64.         @_damage_sprite.opacity = 256 - (12 - @_damage_duration) * 32
  65.         if @_damage_duration == 0
  66.           dispose_damage
  67.         end
  68.       end
  69.       if @_animation != nil and (Graphics.frame_count % 2 == 0)
  70.         @_animation_duration -= 1
  71.         update_animation
  72.       end
  73.       if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
  74.         update_loop_animation
  75.         @_loop_animation_index += 1
  76.         @_loop_animation_index %= @_loop_animation.frame_max
  77.       end
  78.       if @_blink
  79.         @_blink_count = (@_blink_count + 1) % 32
  80.         if @_blink_count < 16
  81.           alpha = (16 - @_blink_count) * 6
  82.         else
  83.           alpha = (@_blink_count - 16) * 6
  84.         end
  85.         self.color.set(255, 255, 255, alpha)
  86.       end
  87.       @@_animations.clear
  88.     end
  89.   end
  90. end


彩虹神剑脚本:
RUBY 代码复制
  1. =begin
  2. ==============================================================================
  3.  
  4. 彩虹神剑(伤害分段显示)显示总伤害版 v1.0b
  5.  
  6. ==============================================================================
  7.  
  8. 彩虹神剑 by 柳柳
  9. 显示总伤害修改 by 叶子
  10.  
  11. ==============================================================================
  12.  
  13. 6-20-2006 v1.0
  14. 在彩虹神剑的基础上增加了显示总伤害的功能,而且总伤害的数字是弹出伤害时逐渐增加的
  15.  
  16. v1.0a
  17. 修正了显示伤害和实际伤害有差别的问题
  18. 修正了miss的情况下显示miss混乱的问题
  19. 修正了对己方技能重复显示伤害的问题
  20. 未修正播放目标动画第一帧时目标有时无端跳动的BUG
  21.  
  22. v1.0b
  23. 修改了总伤害数字的位置和z坐标
  24. 未修正播放目标动画第一帧时目标有时无端跳动的BUG
  25.  
  26. ==============================================================================
  27. =end
  28. # 核心的说明:
  29. # damage_pop 不再附带damage()的功能,这个放到animation里面去了
  30.  
  31. module RPG
  32. #--------------------------------------------------------------------------
  33. # ● 常量设定
  34. #--------------------------------------------------------------------------
  35. # 是否显示总伤害
  36. SHOW_TOTAL_DAMAGE = true
  37. # 角色受攻击时是否跳一下
  38. BATTLER_JUMP = true
  39.  
  40. class Sprite < ::Sprite
  41.    #==========================================
  42.    # 修改说明:
  43.    # @flash_shake用来制作挨打时候跳跃
  44.    # @_damage    用来记录每次打击之后弹出数字
  45.    # @_total_damage 记录总伤害
  46.    # @_total_damage_duration 总伤害持续帧
  47.    #==========================================
  48.    #alias 66RPG_rainbow_initialize : initialize
  49.    def initialize(viewport = nil)
  50.      #66RPG_rainbow_initialize(viewport)
  51.      super(viewport)
  52.      @_whiten_duration = 0
  53.      @_appear_duration = 0
  54.      @_escape_duration = 0
  55.      @_collapse_duration = 0
  56.      @_damage_duration = 0
  57.      @_animation_duration = 0
  58.      @_blink = false
  59.      # 挨打时候跳跃
  60.      @flash_shake = 0
  61.      # 伤害记录数组
  62.      @_damage = []
  63.      # 总伤害数字
  64.      @_total_damage = 0
  65.      # 总伤害持续帧
  66.      @_total_damage_duration = 0
  67.    end
  68.    def damage(value, critical)
  69.      if value.is_a?(Numeric)
  70.        damage_string = value.abs.to_s
  71.      else
  72.        damage_string = value.to_s
  73.      end
  74.      bitmap = Bitmap.new(160, 48)
  75.      bitmap.font.name = "Arial Black"
  76.      bitmap.font.size = 32
  77.      bitmap.font.color.set(0, 0, 0)
  78.      bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  79.      bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  80.      bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  81.      bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
  82.      #=======================================
  83.      # 修改:颜色
  84.      #=======================================
  85.      if value.is_a?(Numeric) and value < 0
  86.        bitmap.font.color.set(176, 255, 144)
  87.      else
  88.        bitmap.font.color.set(255, 55, 55)
  89.      end
  90.      bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  91.      if critical
  92.        bitmap.font.size = 20
  93.        bitmap.font.color.set(0, 0, 0)
  94.        bitmap.draw_text(-1, -1, 160, 20, "暴击", 1)
  95.        bitmap.draw_text(+1, -1, 160, 20, "暴击", 1)
  96.        bitmap.draw_text(-1, +1, 160, 20, "暴击", 1)
  97.        bitmap.draw_text(+1, +1, 160, 20, "暴击", 1)
  98.        bitmap.font.color.set(255, 255, 255)
  99.        bitmap.draw_text(0, 0, 160, 20, "暴击", 1)
  100.      end
  101.      @_damage_sprite = ::Sprite.new(self.viewport)
  102.      @_damage_sprite.bitmap = bitmap
  103.      @_damage_sprite.ox = 80
  104.      @_damage_sprite.oy = 20
  105.      @_damage_sprite.x = self.x
  106.      @_damage_sprite.y = self.y - self.oy / 2
  107.      @_damage_sprite.z = 3000
  108.      @_damage_duration = 40
  109.      #=======================================
  110.      # 修改:推入新的伤害
  111.      #=======================================
  112.      @_damage.push([@_damage_sprite,@_damage_duration-10,0, rand(30) - 15, rand(3)])
  113.      # 总伤害处理
  114.      make_total_damage(value)
  115.    end
  116.    #--------------------------------------------------------------------------
  117.    # ● 总伤害处理
  118.    #--------------------------------------------------------------------------
  119.    def make_total_damage(value)
  120.      if value.is_a?(Numeric) and SHOW_TOTAL_DAMAGE
  121.        @_total_damage += value
  122.      else
  123.        return
  124.      end
  125.      bitmap = Bitmap.new(300, 150)
  126.      bitmap.font.name = "Arial Black"
  127.      bitmap.font.size = 48
  128.      bitmap.font.color.set(0, 0, 0)
  129.      bitmap.draw_text(+2, 12+2, 160, 36, @_total_damage.abs.to_s, 1)
  130.      if @_total_damage < 0
  131.        bitmap.font.color.set(80, 255, 00)
  132.      else
  133.        bitmap.font.color.set(255, 140, 0)
  134.      end
  135.      bitmap.draw_text(0, 12, 160, 36, @_total_damage.abs.to_s, 1)
  136.      if @_total_damage_sprite.nil?
  137.        @_total_damage_sprite = ::Sprite.new(self.viewport)
  138.        @_total_damage_sprite.ox = 80
  139.        @_total_damage_sprite.oy = 20
  140.        @_total_damage_sprite.z = 3000
  141.      end
  142.      @_total_damage_sprite.bitmap = bitmap
  143.      @_total_damage_sprite.zoom_x = 1.5
  144.      @_total_damage_sprite.zoom_y = 1.5
  145.      @_total_damage_sprite.x = self.x
  146.      @_total_damage_sprite.y = self.y  - self.oy / 2 - 64
  147.      @_total_damage_sprite.z = 3001
  148.      @_total_damage_duration = 80
  149.    end
  150.    def animation(animation, hit, battler_damage="", battler_critical=false)
  151.      dispose_animation      
  152.      #=======================================
  153.      # 修改:记录伤害和critical
  154.      #=======================================
  155.      @battler_damage = battler_damage
  156.      @battler_critical = battler_critical
  157.      @_animation = animation
  158.      return if @_animation == nil
  159.      @_animation_hit = hit
  160.      @_animation_duration = @_animation.frame_max
  161.      animation_name = @_animation.animation_name
  162.      animation_hue = @_animation.animation_hue
  163.      bitmap = RPG::Cache.animation(animation_name, animation_hue)
  164.      #=======================================
  165.      # 修改:计算总闪光权限值
  166.      #=======================================
  167.      for timing in @_animation.timings
  168.        quanzhong = animation_process_timing(timing, @_animation_hit,true)
  169.        @all_quanzhong += quanzhong
  170.        # 记录最后一次闪光
  171.        @_last_frame = timing.frame if quanzhong != 0
  172.      end      
  173.      if @@_reference_count.include?(bitmap)
  174.        @@_reference_count[bitmap] += 1
  175.      else
  176.        @@_reference_count[bitmap] = 1
  177.      end
  178.      #=======================================
  179.      # 修改:行动方动画不显示伤害
  180.      #=======================================
  181.      if $scene.is_a?(Scene_Battle)
  182.        if $scene.animation1_id == @battler.animation_id
  183.          @battler_damage = ""
  184.        end
  185.      end
  186.      @_animation_sprites = []
  187.      if @_animation.position != 3 or not @@_animations.include?(animation)
  188.        for i in 0..15
  189.          sprite = ::Sprite.new(self.viewport)
  190.          sprite.bitmap = bitmap
  191.          sprite.visible = false
  192.          @_animation_sprites.push(sprite)
  193.        end
  194.        unless @@_animations.include?(animation)
  195.          @@_animations.push(animation)
  196.        end
  197.      end
  198.      update_animation
  199.    end
  200.    #=======================================
  201.    # 修改:更换清除伤害的算法,以防万一
  202.    #       本内容在脚本中没有使用过
  203.    #=======================================
  204.    def dispose_damage
  205.      for damage in @_damage.reverse
  206.        damage[0].bitmap.dispose
  207.        damage[0].dispose
  208.        @_damage.delete(damage)
  209.      end
  210.      @_total_damage = 0
  211.      @_last_frame = -1
  212.      if @_total_damage_sprite != nil
  213.        @_total_damage_duration = 0
  214.        @_total_damage_sprite.bitmap.dispose
  215.        @_total_damage_sprite.dispose
  216.        @_total_damage_sprite = nil
  217.      end
  218.    end
  219.    def dispose_animation
  220.      #=======================================
  221.      # 修改:清除记录的伤害,清除权重记录
  222.      #=======================================
  223.      @battler_damage = nil
  224.      @battler_critical = nil
  225.      @all_quanzhong = 1
  226.      @_total_damage = 0
  227.      @_last_frame = -1
  228.      if @_animation_sprites != nil
  229.        sprite = @_animation_sprites[0]
  230.        if sprite != nil
  231.          @@_reference_count[sprite.bitmap] -= 1
  232.          if @@_reference_count[sprite.bitmap] == 0
  233.            sprite.bitmap.dispose
  234.          end
  235.        end
  236.        for sprite in @_animation_sprites
  237.          sprite.dispose
  238.        end
  239.        @_animation_sprites = nil
  240.        @_animation = nil
  241.      end
  242.    end
  243.    def update
  244.      super
  245.      if @_whiten_duration > 0
  246.        @_whiten_duration -= 1
  247.        self.color.alpha = 128 - (16 - @_whiten_duration) * 10
  248.      end
  249.      if @_appear_duration > 0
  250.        @_appear_duration -= 1
  251.        self.opacity = (16 - @_appear_duration) * 16
  252.      end
  253.      if @_escape_duration > 0
  254.        @_escape_duration -= 1
  255.        self.opacity = 256 - (32 - @_escape_duration) * 10
  256.      end
  257.      if @_collapse_duration > 0
  258.        @_collapse_duration -= 1
  259.        self.opacity = 256 - (48 - @_collapse_duration) * 6
  260.      end
  261.      #=======================================
  262.      # 修改:更新算法,更新弹出
  263.      #=======================================
  264.      if @_damage_duration > 0
  265.        @_damage_duration -= 1
  266.        for damage in @_damage
  267.          damage[0].x = self.x + self.viewport.rect.x -
  268.                        self.ox + self.src_rect.width / 2 +
  269.                        (40 - damage[1]) * damage[3] / 10
  270.          damage[0].y -= damage[4]+damage[1]/10
  271.          damage[0].opacity = damage[1]*20
  272.          damage[1] -= 1
  273.          if damage[1]==0
  274.            damage[0].bitmap.dispose
  275.            damage[0].dispose
  276.            @_damage.delete(damage)
  277.            next
  278.          end
  279.        end
  280.      end
  281.      #=======================================
  282.      # 添加:弹出总伤害
  283.      #=======================================
  284.      if @_total_damage_duration > 0
  285.        @_total_damage_duration -= 1
  286.        @_total_damage_sprite.y -= 1 if @_total_damage_duration % 2 == 0
  287.        if @_total_damage_sprite.zoom_x > 1.0
  288.          @_total_damage_sprite.zoom_x -= 0.05
  289.        end
  290.        if @_total_damage_sprite.zoom_y > 1.0
  291.          @_total_damage_sprite.zoom_y -= 0.05
  292.        end
  293.        @_total_damage_sprite.opacity = 256 - (24 - @_total_damage_duration) * 16
  294.        if @_total_damage_duration <= 0
  295.          @_total_damage = 0
  296.          @_total_damage_duration = 0
  297.          @_total_damage_sprite.bitmap.dispose
  298.          @_total_damage_sprite.dispose
  299.          @_total_damage_sprite = nil
  300.        end
  301.      end
  302.      #=======================================
  303.      if @_animation != nil and (Graphics.frame_count % 2 == 0)
  304.        @_animation_duration -= 1
  305.        update_animation
  306.      end
  307.      if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
  308.        update_loop_animation
  309.        @_loop_animation_index += 1
  310.        @_loop_animation_index %= @_loop_animation.frame_max
  311.      end
  312.      if @_blink
  313.        @_blink_count = (@_blink_count + 1) % 32
  314.        if @_blink_count < 16
  315.          alpha = (16 - @_blink_count) * 6
  316.        else
  317.          alpha = (@_blink_count - 16) * 6
  318.        end
  319.        self.color.set(255, 255, 255, alpha)
  320.      end
  321.      @@_animations.clear
  322.    end
  323.    def update_animation
  324.      if @_animation_duration > 0
  325.        frame_index = @_animation.frame_max - @_animation_duration
  326.        cell_data = @_animation.frames[frame_index].cell_data
  327.        position = @_animation.position
  328.        animation_set_sprites(@_animation_sprites, cell_data, position)
  329.        #=======================================
  330.        # 修改:弹出伤害,权重计算
  331.        #=======================================
  332.        for timing in @_animation.timings
  333.          if timing.frame == frame_index
  334.            t = 1.0 * animation_process_timing(timing, @_animation_hit)            
  335.            #p t,"当前权重", @all_quanzhong,"总权重"
  336.            if @battler_damage.is_a?(Numeric) and t != 0
  337.              t *= @battler_damage
  338.              t /= @all_quanzhong
  339.              #p t,"当前伤害",@battler_damage,"总伤害"
  340.              t = t.to_i
  341.              # 最后一次闪光的话,伤害修正
  342.              if frame_index == @_last_frame
  343.                @_total_damage = @battler_damage - t
  344.              end
  345.              #p t,@battler_damage,@all_quanzhong
  346.              damage(t,@battler_critical)
  347.            # 防止重复播放miss
  348.            elsif !@battler_damage.is_a?(Numeric) and timing.flash_scope != 0
  349.              damage(@battler_damage,@battler_critical)
  350.            end
  351.          end
  352.        end
  353.      else
  354.        dispose_animation
  355.      end
  356.    end
  357.    #=======================================
  358.    # 修改:敌人跳跃的功能 + 添加返回数值
  359.    #=======================================
  360.     def animation_process_timing(timing, hit,dontflash=false)
  361.       if (timing.condition == 0) or
  362.          (timing.condition == 1 and hit == true) or
  363.          (timing.condition == 2 and hit == false)
  364.         unless dontflash
  365.           if timing.se.name != ""
  366.             se = timing.se
  367.             Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch)
  368.           end
  369.         end
  370.         case timing.flash_scope
  371.         when 1
  372.           unless dontflash
  373.             self.flash(timing.flash_color, timing.flash_duration * 2)
  374.             if @_total_damage >0
  375.               @flash_shake_switch = true
  376.               @flash_shake = 10
  377.             end
  378.           end
  379.           return timing.flash_color.alpha * timing.flash_duration
  380.         when 2
  381.           unless dontflash
  382.             if self.viewport != nil
  383.               self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
  384.               return timing.flash_color.alpha * timing.flash_duration
  385.             end
  386.           end
  387.         when 3
  388.           unless dontflash
  389.             self.flash(nil, timing.flash_duration * 2)
  390.           end
  391.           return timing.flash_color.alpha * timing.flash_duration
  392.         end
  393.       end      
  394.       return 0
  395.     end   
  396. end
  397. end
  398. #==============================================================================
  399. # ■ Sprite_Battler
  400. #==============================================================================
  401. class Sprite_Battler < RPG::Sprite
  402. #--------------------------------------------------------------------------
  403. # ● 初始化对像
  404. #    添加跳跃记录
  405. #--------------------------------------------------------------------------
  406. def initialize(viewport, battler = nil)
  407.   super(viewport)
  408.   @battler = battler
  409.   @battler_visible = false
  410.   @flash_shake_switch = true
  411. end
  412. #--------------------------------------------------------------------------
  413. # ● 刷新画面
  414. #    增添跳跃功能
  415. #--------------------------------------------------------------------------
  416. def update
  417.   super
  418.   # 战斗者为 nil 的情况下
  419.   if @battler == nil
  420.     self.bitmap = nil
  421.     loop_animation(nil)
  422.     return
  423.   end
  424.   # 文件名和色相与当前情况有差异的情况下
  425.   if @battler.battler_name != @battler_name or
  426.      @battler.battler_hue != @battler_hue
  427.     # 获取、设置位图
  428.     @battler_name = @battler.battler_name
  429.     @battler_hue = @battler.battler_hue
  430.     self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
  431.     @width = bitmap.width
  432.     @height = bitmap.height
  433.     self.ox = @width / 2
  434.     self.oy = @height
  435.     # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
  436.     if @battler.dead? or @battler.hidden
  437.       self.opacity = 0
  438.     end
  439.   end
  440.   # 动画 ID 与当前的情况有差异的情况下
  441.   if @battler.damage == nil and
  442.      @battler.state_animation_id != @state_animation_id
  443.     @state_animation_id = @battler.state_animation_id
  444.     loop_animation($data_animations[@state_animation_id])
  445.   end
  446.   # 应该被显示的角色的情况下
  447.   if @battler.is_a?(Game_Actor) and @battler_visible
  448.     # 不是主状态的时候稍稍降低点透明度
  449.     if $game_temp.battle_main_phase
  450.       self.opacity += 3 if self.opacity < 255
  451.     else
  452.       self.opacity -= 3 if self.opacity > 207
  453.     end
  454.   end
  455.   # 明灭
  456.   if @battler.blink
  457.     blink_on
  458.   else
  459.     blink_off
  460.   end
  461.   # 不可见的情况下
  462.   unless @battler_visible
  463.     # 出现
  464.     if not @battler.hidden and not @battler.dead? and
  465.        (@battler.damage == nil or @battler.damage_pop)
  466.       appear
  467.       @battler_visible = true
  468.     end
  469.   end
  470.   # 可见的情况下
  471.   if @battler_visible
  472.     # 逃跑
  473.     if @battler.hidden
  474.       $game_system.se_play($data_system.escape_se)
  475.       escape
  476.       @battler_visible = false
  477.     end
  478.     # 白色闪烁
  479.     if @battler.white_flash
  480.       whiten
  481.       @battler.white_flash = false
  482.     end
  483.     # 动画
  484.     if @battler.animation_id != 0
  485.       animation = $data_animations[@battler.animation_id]
  486.       animation(animation, @battler.animation_hit,@battler.damage, @battler.critical)
  487.       @battler.animation_id = 0
  488.     end
  489.     # 伤害
  490.     if @battler.damage_pop
  491.       @battler.damage = nil
  492.       @battler.critical = false
  493.       @battler.damage_pop = false
  494.     end
  495.     # korapusu
  496.     if @battler.damage == nil and @battler.dead?
  497.       if @battler.is_a?(Game_Enemy)
  498.         $game_system.se_play($data_system.enemy_collapse_se)
  499.       else
  500.         $game_system.se_play($data_system.actor_collapse_se)
  501.       end
  502.       collapse
  503.       @battler_visible = false
  504.     end
  505.   end
  506.   # 设置活动块的坐标
  507.   if @flash_shake_switch == true
  508.     self.x = @battler.screen_x
  509.     self.y = @battler.screen_y
  510.     self.z = @battler.screen_z
  511.     @flash_shake_switch = false
  512.   end
  513.   if @flash_shake != 0 and @battler.damage != nil and RPG::BATTLER_JUMP
  514.     case @flash_shake
  515.     when 9..10
  516.       self.x = @battler.screen_x
  517.       self.y -=4
  518.       self.z = @battler.screen_z
  519.     when 6..8
  520.       self.x = @battler.screen_x
  521.       self.y -=2
  522.       self.z = @battler.screen_z
  523.     when 3..5
  524.       self.x = @battler.screen_x
  525.       self.y +=2
  526.       self.z = @battler.screen_z
  527.     when 2
  528.       self.x = @battler.screen_x
  529.       self.y += 4
  530.       self.z = @battler.screen_z
  531.     when 1
  532.       self.x = @battler.screen_x
  533.       self.y = @battler.screen_y
  534.       self.z = @battler.screen_z
  535.     end
  536.     @flash_shake -= 1
  537.   end
  538. end
  539. end
  540.  
  541. #==============================================================================
  542. # ■ Scene_Battle
  543. #------------------------------------------------------------------------------
  544. #  处理战斗画面的类。
  545. #==============================================================================
  546.  
  547. class Scene_Battle
  548. #--------------------------------------------------------------------------
  549. # ● 定义实例变量
  550. #--------------------------------------------------------------------------
  551. attr_reader   :animation1_id                    # 行动方动画ID
  552. end


麻烦诸位了!先感激下!  

Lv5.捕梦者

梦石
0
星屑
33469
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

2
发表于 2015-3-2 13:49:11 | 只看该作者
大概的整合了一下,没测试
  1. =begin
  2. ==============================================================================

  3. 彩虹神剑(伤害分段显示)显示总伤害版 v1.0b

  4. ==============================================================================

  5. 彩虹神剑 by 柳柳
  6. 显示总伤害修改 by 叶子

  7. ==============================================================================

  8. 6-20-2006 v1.0
  9. 在彩虹神剑的基础上增加了显示总伤害的功能,而且总伤害的数字是弹出伤害时逐渐增加的

  10. v1.0a
  11. 修正了显示伤害和实际伤害有差别的问题
  12. 修正了miss的情况下显示miss混乱的问题
  13. 修正了对己方技能重复显示伤害的问题
  14. 未修正播放目标动画第一帧时目标有时无端跳动的BUG

  15. v1.0b
  16. 修改了总伤害数字的位置和z坐标
  17. 未修正播放目标动画第一帧时目标有时无端跳动的BUG

  18. ==============================================================================
  19. =end
  20. # 核心的说明:
  21. # damage_pop 不再附带damage()的功能,这个放到animation里面去了

  22. module RPG
  23. #--------------------------------------------------------------------------
  24. # ● 常量设定
  25. #--------------------------------------------------------------------------
  26. # 是否显示总伤害
  27. SHOW_TOTAL_DAMAGE = true
  28. # 角色受攻击时是否跳一下
  29. BATTLER_JUMP = true

  30. class Sprite < ::Sprite
  31.    #==========================================
  32.    # 修改说明:
  33.    # @flash_shake用来制作挨打时候跳跃
  34.    # @_damage    用来记录每次打击之后弹出数字
  35.    # @_total_damage 记录总伤害
  36.    # @_total_damage_duration 总伤害持续帧
  37.    #==========================================
  38.    #alias 66RPG_rainbow_initialize : initialize
  39.    def initialize(viewport = nil)
  40.      #66RPG_rainbow_initialize(viewport)
  41.      super(viewport)
  42.      @_whiten_duration = 0
  43.      @_appear_duration = 0
  44.      @_escape_duration = 0
  45.      @_collapse_duration = 0
  46.      @_damage_duration = 0
  47.      @_animation_duration = 0
  48.      @_blink = false
  49.      # 挨打时候跳跃
  50.      @flash_shake = 0
  51.      # 伤害记录数组
  52.      @_damage = []
  53.      # 总伤害数字
  54.      @_total_damage = 0
  55.      # 总伤害持续帧
  56.      @_total_damage_duration = 0
  57.      @coll_time = 0
  58.    end
  59.    def collapse
  60.       @coll.dispose if @coll != nil  
  61.       @coll = Sprite.new
  62.       @coll.bitmap = Bitmap.new("Graphics/Battlers/#{@battler_name}")  
  63.       @coll.ox = self.ox
  64.       @coll.oy = self.oy
  65.       @coll.opacity = 100
  66.       @coll.z = 0
  67.       @coll.blend_type = 1
  68.       @coll.x = self.x
  69.       @coll.y = self.y
  70.       @coll_time = 42
  71.       @_whiten_duration = 0
  72.       @_appear_duration = 0
  73.       @_escape_duration = 0
  74.    end
  75.    def damage(value, critical)
  76.      if value.is_a?(Numeric)
  77.        damage_string = value.abs.to_s
  78.      else
  79.        damage_string = value.to_s
  80.      end
  81.      bitmap = Bitmap.new(160, 48)
  82.      bitmap.font.name = "Arial Black"
  83.      bitmap.font.size = 32
  84.      bitmap.font.color.set(0, 0, 0)
  85.      bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  86.      bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  87.      bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  88.      bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
  89.      #=======================================
  90.      # 修改:颜色
  91.      #=======================================
  92.      if value.is_a?(Numeric) and value < 0
  93.        bitmap.font.color.set(176, 255, 144)
  94.      else
  95.        bitmap.font.color.set(255, 55, 55)
  96.      end
  97.      bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  98.      if critical
  99.        bitmap.font.size = 20
  100.        bitmap.font.color.set(0, 0, 0)
  101.        bitmap.draw_text(-1, -1, 160, 20, "暴击", 1)
  102.        bitmap.draw_text(+1, -1, 160, 20, "暴击", 1)
  103.        bitmap.draw_text(-1, +1, 160, 20, "暴击", 1)
  104.        bitmap.draw_text(+1, +1, 160, 20, "暴击", 1)
  105.        bitmap.font.color.set(255, 255, 255)
  106.        bitmap.draw_text(0, 0, 160, 20, "暴击", 1)
  107.      end
  108.      @_damage_sprite = ::Sprite.new(self.viewport)
  109.      @_damage_sprite.bitmap = bitmap
  110.      @_damage_sprite.ox = 80
  111.      @_damage_sprite.oy = 20
  112.      @_damage_sprite.x = self.x
  113.      @_damage_sprite.y = self.y - self.oy / 2
  114.      @_damage_sprite.z = 3000
  115.      @_damage_duration = 40
  116.      #=======================================
  117.      # 修改:推入新的伤害
  118.      #=======================================
  119.      @_damage.push([@_damage_sprite,@_damage_duration-10,0, rand(30) - 15, rand(3)])
  120.      # 总伤害处理
  121.      make_total_damage(value)
  122.    end
  123.    #--------------------------------------------------------------------------
  124.    # ● 总伤害处理
  125.    #--------------------------------------------------------------------------
  126.    def make_total_damage(value)
  127.      if value.is_a?(Numeric) and SHOW_TOTAL_DAMAGE
  128.        @_total_damage += value
  129.      else
  130.        return
  131.      end
  132.      bitmap = Bitmap.new(300, 150)
  133.      bitmap.font.name = "Arial Black"
  134.      bitmap.font.size = 48
  135.      bitmap.font.color.set(0, 0, 0)
  136.      bitmap.draw_text(+2, 12+2, 160, 36, @_total_damage.abs.to_s, 1)
  137.      if @_total_damage < 0
  138.        bitmap.font.color.set(80, 255, 00)
  139.      else
  140.        bitmap.font.color.set(255, 140, 0)
  141.      end
  142.      bitmap.draw_text(0, 12, 160, 36, @_total_damage.abs.to_s, 1)
  143.      if @_total_damage_sprite.nil?
  144.        @_total_damage_sprite = ::Sprite.new(self.viewport)
  145.        @_total_damage_sprite.ox = 80
  146.        @_total_damage_sprite.oy = 20
  147.        @_total_damage_sprite.z = 3000
  148.      end
  149.      @_total_damage_sprite.bitmap = bitmap
  150.      @_total_damage_sprite.zoom_x = 1.5
  151.      @_total_damage_sprite.zoom_y = 1.5
  152.      @_total_damage_sprite.x = self.x
  153.      @_total_damage_sprite.y = self.y  - self.oy / 2 - 64
  154.      @_total_damage_sprite.z = 3001
  155.      @_total_damage_duration = 80
  156.    end
  157.    def animation(animation, hit, battler_damage="", battler_critical=false)
  158.      dispose_animation      
  159.      #=======================================
  160.      # 修改:记录伤害和critical
  161.      #=======================================
  162.      @battler_damage = battler_damage
  163.      @battler_critical = battler_critical
  164.      @_animation = animation
  165.      return if @_animation == nil
  166.      @_animation_hit = hit
  167.      @_animation_duration = @_animation.frame_max
  168.      animation_name = @_animation.animation_name
  169.      animation_hue = @_animation.animation_hue
  170.      bitmap = RPG::Cache.animation(animation_name, animation_hue)
  171.      #=======================================
  172.      # 修改:计算总闪光权限值
  173.      #=======================================
  174.      for timing in @_animation.timings
  175.        quanzhong = animation_process_timing(timing, @_animation_hit,true)
  176.        @all_quanzhong += quanzhong
  177.        # 记录最后一次闪光
  178.        @_last_frame = timing.frame if quanzhong != 0
  179.      end      
  180.      if @@_reference_count.include?(bitmap)
  181.        @@_reference_count[bitmap] += 1
  182.      else
  183.        @@_reference_count[bitmap] = 1
  184.      end
  185.      #=======================================
  186.      # 修改:行动方动画不显示伤害
  187.      #=======================================
  188.      if $scene.is_a?(Scene_Battle)
  189.        if $scene.animation1_id == @battler.animation_id
  190.          @battler_damage = ""
  191.        end
  192.      end
  193.      @_animation_sprites = []
  194.      if @_animation.position != 3 or not @@_animations.include?(animation)
  195.        for i in 0..15
  196.          sprite = ::Sprite.new(self.viewport)
  197.          sprite.bitmap = bitmap
  198.          sprite.visible = false
  199.          @_animation_sprites.push(sprite)
  200.        end
  201.        unless @@_animations.include?(animation)
  202.          @@_animations.push(animation)
  203.        end
  204.      end
  205.      update_animation
  206.    end
  207.    #=======================================
  208.    # 修改:更换清除伤害的算法,以防万一
  209.    #       本内容在脚本中没有使用过
  210.    #=======================================
  211.    def dispose_damage
  212.      for damage in @_damage.reverse
  213.        damage[0].bitmap.dispose
  214.        damage[0].dispose
  215.        @_damage.delete(damage)
  216.      end
  217.      @_total_damage = 0
  218.      @_last_frame = -1
  219.      if @_total_damage_sprite != nil
  220.        @_total_damage_duration = 0
  221.        @_total_damage_sprite.bitmap.dispose
  222.        @_total_damage_sprite.dispose
  223.        @_total_damage_sprite = nil
  224.      end
  225.    end
  226.    def dispose_animation
  227.      #=======================================
  228.      # 修改:清除记录的伤害,清除权重记录
  229.      #=======================================
  230.      @battler_damage = nil
  231.      @battler_critical = nil
  232.      @all_quanzhong = 1
  233.      @_total_damage = 0
  234.      @_last_frame = -1
  235.      if @_animation_sprites != nil
  236.        sprite = @_animation_sprites[0]
  237.        if sprite != nil
  238.          @@_reference_count[sprite.bitmap] -= 1
  239.          if @@_reference_count[sprite.bitmap] == 0
  240.            sprite.bitmap.dispose
  241.          end
  242.        end
  243.        for sprite in @_animation_sprites
  244.          sprite.dispose
  245.        end
  246.        @_animation_sprites = nil
  247.        @_animation = nil
  248.      end
  249.    end
  250.    def update
  251.      super
  252.      if @_whiten_duration > 0
  253.        @_whiten_duration -= 1
  254.        self.color.alpha = 128 - (16 - @_whiten_duration) * 10
  255.      end
  256.      if @_appear_duration > 0
  257.        @_appear_duration -= 1
  258.        self.opacity = (16 - @_appear_duration) * 16
  259.      end
  260.      if @_escape_duration > 0
  261.        @_escape_duration -= 1
  262.        self.opacity = 256 - (32 - @_escape_duration) * 10
  263.      end
  264.      if @_collapse_duration > 0
  265.        @_collapse_duration -= 1
  266.        self.opacity = 256 - (48 - @_collapse_duration) * 6
  267.      end
  268.      if @coll_time > 0
  269.         @coll_time -= 1
  270.         @coll.y = self.y - (48 - @coll_time) * 6
  271.         self.opacity = 256 - (48 - @coll_time) * 6
  272.         if @coll_time == 0
  273.           @coll.dispose
  274.         end
  275.       end
  276.      #=======================================
  277.      # 修改:更新算法,更新弹出
  278.      #=======================================
  279.      if @_damage_duration > 0
  280.        @_damage_duration -= 1
  281.        for damage in @_damage
  282.          damage[0].x = self.x + self.viewport.rect.x -
  283.                        self.ox + self.src_rect.width / 2 +
  284.                        (40 - damage[1]) * damage[3] / 10
  285.          damage[0].y -= damage[4]+damage[1]/10
  286.          damage[0].opacity = damage[1]*20
  287.          damage[1] -= 1
  288.          if damage[1]==0
  289.            damage[0].bitmap.dispose
  290.            damage[0].dispose
  291.            @_damage.delete(damage)
  292.            next
  293.          end
  294.        end
  295.      end
  296.      #=======================================
  297.      # 添加:弹出总伤害
  298.      #=======================================
  299.      if @_total_damage_duration > 0
  300.        @_total_damage_duration -= 1
  301.        @_total_damage_sprite.y -= 1 if @_total_damage_duration % 2 == 0
  302.        if @_total_damage_sprite.zoom_x > 1.0
  303.          @_total_damage_sprite.zoom_x -= 0.05
  304.        end
  305.        if @_total_damage_sprite.zoom_y > 1.0
  306.          @_total_damage_sprite.zoom_y -= 0.05
  307.        end
  308.        @_total_damage_sprite.opacity = 256 - (24 - @_total_damage_duration) * 16
  309.        if @_total_damage_duration <= 0
  310.          @_total_damage = 0
  311.          @_total_damage_duration = 0
  312.          @_total_damage_sprite.bitmap.dispose
  313.          @_total_damage_sprite.dispose
  314.          @_total_damage_sprite = nil
  315.        end
  316.      end
  317.      #=======================================
  318.      if @_animation != nil and (Graphics.frame_count % 2 == 0)
  319.        @_animation_duration -= 1
  320.        update_animation
  321.      end
  322.      if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
  323.        update_loop_animation
  324.        @_loop_animation_index += 1
  325.        @_loop_animation_index %= @_loop_animation.frame_max
  326.      end
  327.      if @_blink
  328.        @_blink_count = (@_blink_count + 1) % 32
  329.        if @_blink_count < 16
  330.          alpha = (16 - @_blink_count) * 6
  331.        else
  332.          alpha = (@_blink_count - 16) * 6
  333.        end
  334.        self.color.set(255, 255, 255, alpha)
  335.      end
  336.      @@_animations.clear
  337.    end
  338.    def update_animation
  339.      if @_animation_duration > 0
  340.        frame_index = @_animation.frame_max - @_animation_duration
  341.        cell_data = @_animation.frames[frame_index].cell_data
  342.        position = @_animation.position
  343.        animation_set_sprites(@_animation_sprites, cell_data, position)
  344.        #=======================================
  345.        # 修改:弹出伤害,权重计算
  346.        #=======================================
  347.        for timing in @_animation.timings
  348.          if timing.frame == frame_index
  349.            t = 1.0 * animation_process_timing(timing, @_animation_hit)            
  350.            #p t,"当前权重", @all_quanzhong,"总权重"
  351.            if @battler_damage.is_a?(Numeric) and t != 0
  352.              t *= @battler_damage
  353.              t /= @all_quanzhong
  354.              #p t,"当前伤害",@battler_damage,"总伤害"
  355.              t = t.to_i
  356.              # 最后一次闪光的话,伤害修正
  357.              if frame_index == @_last_frame
  358.                @_total_damage = @battler_damage - t
  359.              end
  360.              #p t,@battler_damage,@all_quanzhong
  361.              damage(t,@battler_critical)
  362.            # 防止重复播放miss
  363.            elsif !@battler_damage.is_a?(Numeric) and timing.flash_scope != 0
  364.              damage(@battler_damage,@battler_critical)
  365.            end
  366.          end
  367.        end
  368.      else
  369.        dispose_animation
  370.      end
  371.    end
  372.    #=======================================
  373.    # 修改:敌人跳跃的功能 + 添加返回数值
  374.    #=======================================
  375.     def animation_process_timing(timing, hit,dontflash=false)
  376.       if (timing.condition == 0) or
  377.          (timing.condition == 1 and hit == true) or
  378.          (timing.condition == 2 and hit == false)
  379.         unless dontflash
  380.           if timing.se.name != ""
  381.             se = timing.se
  382.             Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch)
  383.           end
  384.         end
  385.         case timing.flash_scope
  386.         when 1
  387.           unless dontflash
  388.             self.flash(timing.flash_color, timing.flash_duration * 2)
  389.             if @_total_damage >0
  390.               @flash_shake_switch = true
  391.               @flash_shake = 10
  392.             end
  393.           end
  394.           return timing.flash_color.alpha * timing.flash_duration
  395.         when 2
  396.           unless dontflash
  397.             if self.viewport != nil
  398.               self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
  399.               return timing.flash_color.alpha * timing.flash_duration
  400.             end
  401.           end
  402.         when 3
  403.           unless dontflash
  404.             self.flash(nil, timing.flash_duration * 2)
  405.           end
  406.           return timing.flash_color.alpha * timing.flash_duration
  407.         end
  408.       end      
  409.       return 0
  410.     end   
  411. end
  412. end
  413. #==============================================================================
  414. # ■ Sprite_Battler
  415. #==============================================================================
  416. class Sprite_Battler < RPG::Sprite
  417. #--------------------------------------------------------------------------
  418. # ● 初始化对像
  419. #    添加跳跃记录
  420. #--------------------------------------------------------------------------
  421. def initialize(viewport, battler = nil)
  422.   super(viewport)
  423.   @battler = battler
  424.   @battler_visible = false
  425.   @flash_shake_switch = true
  426. end
  427. #--------------------------------------------------------------------------
  428. # ● 刷新画面
  429. #    增添跳跃功能
  430. #--------------------------------------------------------------------------
  431. def update
  432.   super
  433.   # 战斗者为 nil 的情况下
  434.   if @battler == nil
  435.     self.bitmap = nil
  436.     loop_animation(nil)
  437.     return
  438.   end
  439.   # 文件名和色相与当前情况有差异的情况下
  440.   if @battler.battler_name != @battler_name or
  441.      @battler.battler_hue != @battler_hue
  442.     # 获取、设置位图
  443.     @battler_name = @battler.battler_name
  444.     @battler_hue = @battler.battler_hue
  445.     self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
  446.     @width = bitmap.width
  447.     @height = bitmap.height
  448.     self.ox = @width / 2
  449.     self.oy = @height
  450.     # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
  451.     if @battler.dead? or @battler.hidden
  452.       self.opacity = 0
  453.     end
  454.   end
  455.   # 动画 ID 与当前的情况有差异的情况下
  456.   if @battler.damage == nil and
  457.      @battler.state_animation_id != @state_animation_id
  458.     @state_animation_id = @battler.state_animation_id
  459.     loop_animation($data_animations[@state_animation_id])
  460.   end
  461.   # 应该被显示的角色的情况下
  462.   if @battler.is_a?(Game_Actor) and @battler_visible
  463.     # 不是主状态的时候稍稍降低点透明度
  464.     if $game_temp.battle_main_phase
  465.       self.opacity += 3 if self.opacity < 255
  466.     else
  467.       self.opacity -= 3 if self.opacity > 207
  468.     end
  469.   end
  470.   # 明灭
  471.   if @battler.blink
  472.     blink_on
  473.   else
  474.     blink_off
  475.   end
  476.   # 不可见的情况下
  477.   unless @battler_visible
  478.     # 出现
  479.     if not @battler.hidden and not @battler.dead? and
  480.        (@battler.damage == nil or @battler.damage_pop)
  481.       appear
  482.       @battler_visible = true
  483.     end
  484.   end
  485.   # 可见的情况下
  486.   if @battler_visible
  487.     # 逃跑
  488.     if @battler.hidden
  489.       $game_system.se_play($data_system.escape_se)
  490.       escape
  491.       @battler_visible = false
  492.     end
  493.     # 白色闪烁
  494.     if @battler.white_flash
  495.       whiten
  496.       @battler.white_flash = false
  497.     end
  498.     # 动画
  499.     if @battler.animation_id != 0
  500.       animation = $data_animations[@battler.animation_id]
  501.       animation(animation, @battler.animation_hit,@battler.damage, @battler.critical)
  502.       @battler.animation_id = 0
  503.     end
  504.     # 伤害
  505.     if @battler.damage_pop
  506.       @battler.damage = nil
  507.       @battler.critical = false
  508.       @battler.damage_pop = false
  509.     end
  510.     # korapusu
  511.     if @battler.damage == nil and @battler.dead?
  512.       if @battler.is_a?(Game_Enemy)
  513.         $game_system.se_play($data_system.enemy_collapse_se)
  514.       else
  515.         $game_system.se_play($data_system.actor_collapse_se)
  516.       end
  517.       collapse
  518.       @battler_visible = false
  519.     end
  520.   end
  521.   # 设置活动块的坐标
  522.   if @flash_shake_switch == true
  523.     self.x = @battler.screen_x
  524.     self.y = @battler.screen_y
  525.     self.z = @battler.screen_z
  526.     @flash_shake_switch = false
  527.   end
  528.   if @flash_shake != 0 and @battler.damage != nil and RPG::BATTLER_JUMP
  529.     case @flash_shake
  530.     when 9..10
  531.       self.x = @battler.screen_x
  532.       self.y -=4
  533.       self.z = @battler.screen_z
  534.     when 6..8
  535.       self.x = @battler.screen_x
  536.       self.y -=2
  537.       self.z = @battler.screen_z
  538.     when 3..5
  539.       self.x = @battler.screen_x
  540.       self.y +=2
  541.       self.z = @battler.screen_z
  542.     when 2
  543.       self.x = @battler.screen_x
  544.       self.y += 4
  545.       self.z = @battler.screen_z
  546.     when 1
  547.       self.x = @battler.screen_x
  548.       self.y = @battler.screen_y
  549.       self.z = @battler.screen_z
  550.     end
  551.     @flash_shake -= 1
  552.   end
  553. end
  554. end

  555. #==============================================================================
  556. # ■ Scene_Battle
  557. #------------------------------------------------------------------------------
  558. #  处理战斗画面的类。
  559. #==============================================================================

  560. class Scene_Battle
  561. #--------------------------------------------------------------------------
  562. # ● 定义实例变量
  563. #--------------------------------------------------------------------------
  564. attr_reader   :animation1_id                    # 行动方动画ID
  565. end
复制代码

评分

参与人数 1梦石 +1 收起 理由
RyanBern + 1 认可答案

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
104
在线时间
165 小时
注册时间
2014-2-1
帖子
13
3
 楼主| 发表于 2015-3-2 16:50:33 | 只看该作者
芯☆淡茹水 发表于 2015-3-2 13:49
大概的整合了一下,没测试

可以啦!感谢大神!{:2_275:}
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 12:25

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表