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

Project1

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

求 横版有动画战斗脚本

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2008-9-4
帖子
78
跳转到指定楼层
1
发表于 2009-2-4 20:21:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
  感觉RMXP1.2默认纵版的时代过去了......脚本该更新了.......
我想要一个横版的战斗脚本,而且人物在战斗的时候有人物战斗动画,(以前就一动不动,莫名其妙就发动攻击了)希望哪位好心人提供一下脚本,不要45度的哦.

                        谢谢!!!!!!!!!!!!!!!!!!!!!!
用回忆制造新奇!!

Lv1.梦旅人

魔王 ⑨

梦石
0
星屑
90
在线时间
379 小时
注册时间
2006-10-16
帖子
4299

贵宾

2
发表于 2009-2-4 20:36:33 | 只看该作者
  1. #==============================================================================
  2. # ■ 全动画战斗
  3. #------------------------------------------------------------------------------
  4. #  By whbm
  5. #   应用脚本 彩虹神剑 By 66
  6. #==============================================================================
  7.     $fangyu = 0
  8. #   修改内容:
  9. #   1.修改战斗失败继续后被怪打就出现死亡静态或者不再出现死亡动态的BUG
  10. #   2.改变防御方式,怪打的时候防御动作才显现,打完就恢复
  11. #   3.修正一个角色死亡后,其他角色添加第6号状态的问题,就是那个一个死了,其他的都要被
  12. #     打好几次的BUG.
  13. #   4.修正不显示战斗胜利图的BUG
  14. #                                        by 星云
  15. #   5.在此脚本中增加了施法动画(放在第八个★动画里面)
  16. #   6.修复了伤害数值与动画被敌人挡住的情况
  17. #   7.修复了攻击动画帧数过多的情况下和人物死亡判定情况下的挨打动画
  18. #   8.增加了伤害美化效果(可选,素材放在Pictures文件夹的子文件夹Srting中)
  19. #   9.其他问题会继续跟进
  20. #                                        by 果冻叮当猫
  21. #==============================================================================
  22. #简要介绍:
  23. #    本脚本实现了战斗的动态效果,其中包含了待机、攻击、防御、挨打、胜利、死亡。类似于超级横版、超级战斗。但是本系统特色在于所有效果的实现并不是靠庞大的战斗图,而是使用了数据库中的动画。这样不仅突破了不同人不同祯数量的限制,并且方便了单动画单祯的修改。
  24. #使用方法:
  25. #    个人觉得还是比较简单,但是大量的怪物还是会令人头痛。
  26. #    1.数据库的设置
  27. #      敌人必要的动画有待机、挨打、死亡三个必要的动画
  28. #      角色必要的动画有待机、挨打、防御、死亡动态、胜利动态、死亡静态、胜利静态
  29. #
  30. #      死亡静态与胜利静态:动画中只有1祯,为相应动态动画的最后一祯
  31. #      
  32. #      剩下的就是人物攻击的动画,和正常的动画是一样设置
  33. #      如图中的攻击等待动画只是为了在播放攻击动画的同时消除人物本身(素材原因,人物攻击的时候离开了原位,如果是在原位置放魔法是用不上的)
  34. #    2.战斗图的设置
  35. #      战斗图其实只是一个透明的图片,它只是用来描述一个敌人或者角色的大小,并与相应的战斗动画编号相衔接。
  36. #      战斗图的文件名格式如下:
  37. #          名字★待机★防御★挨打★死亡动态★死亡静态★胜利动态★胜利静态★施法动画(本人自己添加的).png
  38. #          (其中“名字”一项与动画无关)
  39. #          例如:
  40. #          紫烟★140★141★148★149★150★144★145★146.png
  41. #      对于敌人无胜利动画或者防御动画,请保持该位置为空,例如:
  42. #          蓝若冰★124★★126★127★128★★★129.png
  43. #    综上,设置就这么完成了。
  44. #注意事项:
  45. #    1.由于系统中待机由动画实现,所以无法使用状态附带动画的功能。
  46. #    2.可以在脚本中使用Ctrl+Shift+F通篇搜索“小改动”,可以修改某些窗口的Z值。
  47. #    3.当您将此系统向您的工程中移植的时候也要注意事项2中的“小改动”。
  48. #    4.系统是从游戏“石焚刃暖”中提取出来的,或许会有疏漏与多余的东西,BUG也是不免的。大家尽管提便是。     
  49. #==============================================================================
  50. class Spriteset_Battle
  51.   #--------------------------------------------------------------------------
  52.   # ● 初始化变量
  53.   #--------------------------------------------------------------------------
  54.   def initialize
  55.     # 生成显示端口
  56.     @viewport1 = Viewport.new(0, 0, 640, 480)
  57.     @viewport2 = Viewport.new(0, 0, 640, 480)
  58.     @viewport3 = Viewport.new(0, 0, 640, 480)
  59.     @viewport4 = Viewport.new(0, 0, 640, 480)
  60.     @viewport2.z = 101
  61.     @viewport3.z = 200
  62.     @viewport4.z = 5000
  63.     # 生成战斗背景活动块
  64.     @battleback_sprite = Sprite.new(@viewport1)
  65.     # 生成敌人活动块
  66.     @enemy_sprites = []
  67.     for enemy in $game_troop.enemies.reverse
  68. #      @enemy_sprites.push(Sprite_Battler.new(@viewport1, enemy))
  69.       @enemy_sprites.push(Sprite_Battler.new(@viewport4, enemy))#敌人的显示高度
  70.     end
  71.     # 生成敌人活动块
  72.     @actor_sprites = []
  73.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  74.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  75.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  76.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  77.     # 生成天候
  78.     @weather = RPG::Weather.new(@viewport1)
  79.     # 生成图片活动块
  80.     @picture_sprites = []
  81.     for i in 51..100
  82.       @picture_sprites.push(Sprite_Picture.new(@viewport3,
  83.         $game_screen.pictures[i]))
  84.     end
  85.     # 生成计时器块
  86.     @timer_sprite = Sprite_Timer.new
  87.     # 刷新画面
  88.     update
  89.   end
  90.   #..........................................................................
  91.   #--------------------------------------------------------------------------
  92.   # ● 胜利图
  93.   #--------------------------------------------------------------------------
  94.   def win
  95.     for sprite in @actor_sprites
  96.       sprite.win
  97.     end
  98.   end
  99.   #..........................................................................
  100.   #--------------------------------------------------------------------------
  101.   # ● 刷新画面
  102.   #--------------------------------------------------------------------------
  103.   def update
  104.     # 刷新角色的活动块 (对应角色的替换)
  105.     @actor_sprites[0].battler = $game_party.actors[0]
  106.     @actor_sprites[1].battler = $game_party.actors[1]
  107.     @actor_sprites[2].battler = $game_party.actors[2]
  108.     @actor_sprites[3].battler = $game_party.actors[3]
  109.     # 战斗背景的文件名与现在情况有差异的情况下
  110.     if @battleback_name != $game_temp.battleback_name
  111.       @battleback_name = $game_temp.battleback_name
  112.       if @battleback_sprite.bitmap != nil
  113.         @battleback_sprite.bitmap.dispose
  114.       end
  115.       @battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name)
  116.       @battleback_sprite.src_rect.set(0, 0, 640, 480)
  117.     end
  118.     # 刷新战斗者的活动块
  119.     for sprite in @enemy_sprites + @actor_sprites
  120.       sprite.update
  121.     end
  122.     # 刷新天气图形
  123.     @weather.type = $game_screen.weather_type
  124.     @weather.max = $game_screen.weather_max
  125.     @weather.update
  126.     # 刷新图片活动块
  127.     for sprite in @picture_sprites
  128.       sprite.update
  129.     end
  130.     # 刷新计时器活动块
  131.     @timer_sprite.update
  132.     # 设置画面的色调与震动位置
  133.     @viewport1.tone = $game_screen.tone
  134.     @viewport1.ox = $game_screen.shake
  135.     # 设置画面的闪烁色
  136.     @viewport4.color = $game_screen.flash_color
  137.     # 刷新显示端口
  138.     @viewport1.update
  139.     @viewport2.update
  140.     @viewport4.update
  141.   end
  142. end
  143. class Arrow_Enemy < Arrow_Base
  144.   #--------------------------------------------------------------------------
  145.   # ● 获取光标指向的敌人
  146.   #--------------------------------------------------------------------------
  147.   def enemy
  148.     return $game_troop.enemies[@index]
  149.   end
  150.   #--------------------------------------------------------------------------
  151.   # ● 刷新画面
  152.   #--------------------------------------------------------------------------
  153.   def update
  154.     super
  155.     # 如果指向不存在的敌人就离开
  156.     $game_troop.enemies.size.times do
  157.       break if self.enemy.exist?
  158.       @index += 1
  159.       @index %= $game_troop.enemies.size
  160.     end
  161.     # 光标右
  162.     if Input.repeat?(Input::RIGHT)
  163.       $game_system.se_play($data_system.cursor_se)
  164.       $game_troop.enemies.size.times do
  165.         @index += 1
  166.         @index %= $game_troop.enemies.size
  167.         break if self.enemy.exist?
  168.       end
  169.     end
  170.     # 光标左
  171.     if Input.repeat?(Input::LEFT)
  172.       $game_system.se_play($data_system.cursor_se)
  173.       $game_troop.enemies.size.times do
  174.         @index += $game_troop.enemies.size - 1
  175.         @index %= $game_troop.enemies.size
  176.         break if self.enemy.exist?
  177.       end
  178.     end
  179.     # 设置活动块坐标
  180.     if self.enemy != nil
  181.       self.x = self.enemy.screen_x + self.ox
  182.       self.y = self.enemy.screen_y + self.oy
  183.     end
  184.   end
  185. end
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

魔王 ⑨

梦石
0
星屑
90
在线时间
379 小时
注册时间
2006-10-16
帖子
4299

贵宾

3
发表于 2009-2-4 20:37:11 | 只看该作者
  1. class Arrow_Actor < Arrow_Base
  2.   #--------------------------------------------------------------------------
  3.   # ● 获取光标指向的角色
  4.   #--------------------------------------------------------------------------
  5.   def actor
  6.     return $game_party.actors[@index]
  7.   end
  8.   #--------------------------------------------------------------------------
  9.   # ● 刷新画面
  10.   #--------------------------------------------------------------------------
  11.   def update
  12.     super
  13.     # 光标右
  14.     if Input.repeat?(Input::RIGHT)
  15.       $game_system.se_play($data_system.cursor_se)
  16.       @index += 1
  17.       @index %= $game_party.actors.size
  18.     end
  19.     # 光标左
  20.     if Input.repeat?(Input::LEFT)
  21.       $game_system.se_play($data_system.cursor_se)
  22.       @index += $game_party.actors.size - 1
  23.       @index %= $game_party.actors.size
  24.     end
  25.     # 设置活动块坐标
  26.     if self.actor != nil
  27.       self.x = self.actor.screen_x + self.ox
  28.       self.y = self.actor.screen_y + self.oy
  29.     end
  30.   end
  31. end
  32. class Scene_Battle
  33.   #--------------------------------------------------------------------------
  34.   # ● 刷新画面 (主回合步骤 3 : 行动方动画)
  35.   #--------------------------------------------------------------------------
  36.   def update_phase4_step3
  37.     # 行动方动画 (ID 为 0 的情况下是白色闪烁)
  38.     if @animation1_id == 0
  39.       @active_battler.white_flash = true
  40.     else
  41.     # 添加施法动画
  42.       #@active_battler.setup_battler_ani(@active_battler.battler_name.split(/★/)[8], 1)
  43.       @active_battler.animation_id = @animation1_id
  44.       @active_battler.animation_hit = true
  45.     end
  46.     # 对像方动画
  47.     for target in @target_battlers
  48.       target.animation_id = @animation2_id
  49.       target.animation_hit = (target.damage != "Miss")
  50.       ###########################################################
  51.       target.setup_battler_dead_ani(0)
  52.       ############################################################
  53.       #.......................................................................
  54.       if target.is_a?(Game_Actor)
  55.         ##############
  56.         if target.guarding?
  57.           $fangyu = 1
  58.        end
  59.         ##############
  60.        if target.current_action.kind == 0 and target.current_action.basic == 1
  61.            target.setup_battler_ani(target.battler_name.split(/★/)[2])
  62.         else
  63.          target.setup_battler_hurt_ani(0)
  64.         end
  65.       end
  66.       if target.is_a?(Game_Enemy)
  67.        if target.current_action.kind == 0 and target.current_action.basic == 1
  68.           target.setup_battler_ani(target.battler_name.split(/★/)[1])
  69.         else
  70.           target.setup_battler_hurt_ani(0)
  71.         end
  72.       end
  73.       #.......................................................................
  74.     end
  75.     # 对像方动画
  76.     for target in @target_battlers
  77.       target.animation_id = @animation2_id
  78.       target.animation_hit = (target.damage != "Miss")
  79.       #......................................................................
  80.     end
  81.     # 限制动画长度、最低 8 帧
  82.     @wait_count = 8
  83.     # 移至步骤 5
  84.     @phase4_step = 5
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # ● 刷新画面 (主回合步骤 4 : 对像方动画) ★
  88.   #--------------------------------------------------------------------------
  89.   def update_phase4_step4
  90.     # 限制动画长度、最低 8 帧
  91.     @wait_count = 8
  92.     # 移至步骤 5
  93.     @phase4_step = 5
  94.   end
  95. end
  96. class Game_Actor < Game_Battler
  97.   
  98. #小改动
  99. #############################################################################
  100. #                                横版修改                                   #
  101. #############################################################################
  102.   
  103.    #--------------------------------------------------------------------------
  104. # ● 取得战斗画面的 X 坐标
  105. #--------------------------------------------------------------------------
  106. def screen_x
  107.    case self.index
  108.    when 0
  109.      return 520
  110.    when 1
  111.      return 480
  112.    when 2
  113.      return 440
  114.    when 3
  115.      return 400
  116.    else
  117.      return 1001
  118.    end
  119. end
  120. #--------------------------------------------------------------------------
  121. # ● 取得战斗画面的 Y 坐标
  122. #--------------------------------------------------------------------------
  123. def screen_y
  124.    case self.index
  125.    when 0
  126.      return 320
  127.    when 1
  128.      return 280
  129.    when 2
  130.      return 240
  131.    when 3
  132.      return 200
  133.    else
  134.      return 1001
  135.    end
  136. end
  137. #--------------------------------------------------------------------------
  138. # ● 取得战斗画面的 Z 坐标
  139. #--------------------------------------------------------------------------
  140. def screen_z
  141.    # 返回计算后的队伍 Z 坐标的排列顺序
  142.    case self.index
  143.    when 0
  144.      return 1
  145.    when 1
  146.      return 2
  147.    when 2
  148.      return 3
  149.    when 3
  150.      return 4
  151.    else
  152.      return 1001
  153.    end
  154. end
  155. #############################################################################
  156.   
  157.   
  158.   
  159.   #--------------------------------------------------------------------------
  160.   # ● 取得战斗画面的 X 坐标
  161.   #--------------------------------------------------------------------------
  162. #  def screen_x
  163.     # 返回计算后的队伍 X 坐标的排列顺序
  164. #    if self.index != nil
  165.       #......................................................................
  166. #      return self.index * 90 + 500
  167.       #......................................................................
  168. #    else
  169. #      return 0
  170. #    end
  171. #  end
  172.   #--------------------------------------------------------------------------
  173.   # ● 取得战斗画面的 Y 坐标
  174.   #--------------------------------------------------------------------------
  175. #  def screen_y
  176.     #........................................................................
  177. #    return 464 - self.index * 110
  178.     #........................................................................
  179. #  end
  180.   #--------------------------------------------------------------------------
  181.   # ● 取得战斗画面的 Z 坐标
  182.   #--------------------------------------------------------------------------
  183. #  def screen_z
  184.     # 返回计算后的队伍 Z 坐标的排列顺序
  185. #    if self.index != nil
  186. #      return 4 - self.index
  187. #    else
  188. #      return 0
  189. #    end
  190. #  end
  191. end

  192. class Scene_Battle
  193.   #..........................................................................
  194.   #--------------------------------------------------------------------------
  195.   # ● 返回phase
  196.   #--------------------------------------------------------------------------
  197.   def phase
  198.     return @phase
  199.   end
  200.   #--------------------------------------------------------------------------
  201.   # ● 返回phase4_step
  202.   #--------------------------------------------------------------------------
  203.   def phase4_step
  204.     return @phase4_step
  205.   end
  206.   #--------------------------------------------------------------------------
  207.   # ● 返回phase4_step
  208.   #--------------------------------------------------------------------------
  209.   def actor_command_active?
  210.     return @actor_command_window.active
  211.   end
  212.   #..........................................................................
  213. end
  214. class Game_Battler
  215.   #..........................................................................
  216.   #--------------------------------------------------------------------------
  217.   # ● 获取循环的动画 ID
  218.   #--------------------------------------------------------------------------  
  219.   def show_damage(value)
  220.     @show_damage_value = value
  221.   end
  222.   #--------------------------------------------------------------------------
  223.   # ● 获取循环的动画 ID
  224.   #--------------------------------------------------------------------------
  225.   def show_damage_value
  226.     return @show_damage_value
  227.   end
  228.   #--------------------------------------------------------------------------
  229.   # ● 获取循环的动画 ID
  230.   #--------------------------------------------------------------------------
  231.   def battler_ani
  232.     return @battler_ani
  233.   end
  234.   #--------------------------------------------------------------------------
  235.   # ● 获取循环的动画 ID
  236.   #--------------------------------------------------------------------------
  237.   def setup_battler_ani(battler_ani, once = 0)
  238.     @battler_ani = battler_ani
  239.     @once = once
  240.   end
  241.   #--------------------------------------------------------------------------
  242.   # ● 获取循环的动画 ID
  243.   #--------------------------------------------------------------------------
  244.   def setup_battler_hurt_ani(hurt)
  245.     @hurt = hurt
  246.   end  
  247.   #--------------------------------------------------------------------------
  248.   # ● 获取循环的动画 ID
  249.   #--------------------------------------------------------------------------
  250.   def setup_battler_dead_ani(over)
  251.     @over = over
  252.   end
  253.   #--------------------------------------------------------------------------
  254.   # ● 获取循环的动画 ID
  255.   #--------------------------------------------------------------------------
  256.   def battler_dead_ani
  257.     return @over
  258.   end
  259.   #--------------------------------------------------------------------------
  260.   # ● 获取循环的动画 ID
  261.   #--------------------------------------------------------------------------
  262.   def battler_ani_once
  263.     return @once
  264.   end
  265.   #--------------------------------------------------------------------------
  266.   # ● 获取循环的动画 ID
  267.   #--------------------------------------------------------------------------
  268.   def battler_hurt_ani
  269.     return @hurt
  270.   end
  271.   #..........................................................................
  272. end
  273. class Sprite_Battler < RPG::Sprite
  274.   #..........................................................................
  275.   #--------------------------------------------------------------------------
  276.   # ● 胜利图
  277.   #--------------------------------------------------------------------------
  278.   def win
  279.     if @battler_name != nil and not @battler.hidden and not @battler.dead?
  280.       @battler.setup_battler_ani(@battler_name.split(/★/)[6], 1)
  281.     end
  282.   end
  283.   #..........................................................................
  284.   #--------------------------------------------------------------------------
  285.   # ● 释放
  286.   #--------------------------------------------------------------------------
  287.   def dispose
  288.     if self.bitmap != nil
  289.       self.bitmap.dispose
  290.     end
  291.     super
  292.   end
  293.   #--------------------------------------------------------------------------
  294.   # ● 刷新画面
  295.   #--------------------------------------------------------------------------
  296.   def update
  297.     super
  298.     # 战斗者为 nil 的情况下
  299.     if @battler == nil
  300.       self.bitmap = nil
  301.       loop_animation(nil)
  302.       return
  303.     end
  304.     # 文件名和色相与当前情况有差异的情况下
  305.     if @battler.battler_name != @battler_name or
  306.        @battler.battler_hue != @battler_hue
  307.       @battler_hue = @battler.battler_hue
  308.       # 获取、设置位图
  309.       @battler_name = @battler.battler_name
  310.       self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
  311.       #.......................................................................
  312.       @battler.setup_battler_ani(@battler.battler_name.split(/★/)[1])
  313.       #.......................................................................
  314.       @width = bitmap.width
  315.       @height = bitmap.height
  316.       self.ox = @width / 2
  317.       self.oy = @height
  318.       # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
  319.       if @battler.is_a?(Game_Enemy)
  320.         if @battler.dead? or @battler.hidden
  321.           self.opacity = 0
  322.         end
  323.       end
  324.     end
  325.     # 动画 ID 与当前的情况有差异的情况下
  326.     #.........................................................................
  327.     if @battler.battler_ani != @battler_ani
  328.       @battler_ani = @battler.battler_ani
  329.       loop_animation($data_animations[@battler_ani.to_i])
  330.     end
  331.     #.........................................................................
  332.     # 应该被显示的角色的情况下
  333.     if @battler.is_a?(Game_Actor) and @battler_visible
  334.       # 不是主状态的时候稍稍降低点透明度
  335.       if $game_temp.battle_main_phase
  336.         self.opacity += 3 if self.opacity < 255
  337.       else
  338.         self.opacity -= 3 if self.opacity > 207
  339.       end
  340.     end
  341.     # 明灭
  342.     if @battler.blink
  343.       blink_on
  344.     else
  345.       blink_off
  346.     end
  347.     # 不可见的情况下
  348.     unless @battler_visible
  349.       # 出现 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  350.       if not @battler.hidden and not @battler.dead? and
  351.          (@battler.damage == nil or @battler.damage_pop)
  352.         if @battler.is_a?(Game_Enemy)
  353.           appear
  354.         else
  355.           @battler.setup_battler_ani(@battler.battler_name.split(/★/)[1])
  356.         end
  357.         @battler_visible = true
  358.       end
  359.     end
  360.     # 可见的情况下
  361.     if @battler_visible
  362.       # 逃跑
  363.       if @battler.hidden
  364.         $game_system.se_play($data_system.escape_se)
  365.         escape
  366.         @battler_visible = false
  367.       end
  368.       # 白色闪烁
  369.       if @battler.white_flash
  370.         whiten
  371.         @battler.white_flash = false
  372.       end
  373.       # 动画
  374.       if @battler.animation_id != 0
  375.         animation = $data_animations[@battler.animation_id]
  376.         animation(animation, @battler.animation_hit)
  377.         @battler.animation_id = 0
  378.       end
  379.       # 伤害
  380.       if @battler.damage_pop
  381.         damage(@battler.damage, @battler.critical)
  382.         @battler.damage = nil
  383.         @battler.critical = false
  384.         @battler.damage_pop = false
  385.       end
  386.       # korapusu
  387.       if @battler.damage == nil and @battler.dead?
  388.         #....................................................................
  389.         if @battler.is_a?(Game_Enemy)
  390.           $game_system.se_play($data_system.enemy_collapse_se)
  391.           #collapse
  392.         else
  393.           $game_system.se_play($data_system.actor_collapse_se)
  394.         end
  395.         #....................................................................
  396.         @battler_visible = false
  397.       end
  398.     end
  399.     # 设置活动块的坐标
  400.     self.x = @battler.screen_x
  401.     self.y = @battler.screen_y
  402.     self.z = @battler.screen_z
  403.   end
  404. end
  405. module RPG
  406.   class Sprite < ::Sprite
  407.     def damage(value, critical)
  408.       dispose_damage
  409.       if value.is_a?(Numeric)
  410.         damage_string = value.abs.to_s
  411.       else
  412.         damage_string = value.to_s
  413.       end
  414.       bitmap = Bitmap.new(160, 48)
  415.       bitmap.font.name = "Arial Black"
  416.       bitmap.font.size = 32
  417.       bitmap.font.color.set(0, 0, 0)
  418.       bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  419.       bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  420.       bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  421.       bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
  422.       if value.is_a?(Numeric) and value < 0
  423.         bitmap.font.color.set(176, 255, 144)
  424.       else
  425.         bitmap.font.color.set(255, 255, 255)
  426.       end
  427.       bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  428.       if critical
  429.         bitmap.font.size = 20
  430.         bitmap.font.color.set(0, 0, 0)
  431.         bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
  432.         bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
  433.         bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
  434.         bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
  435.         bitmap.font.color.set(255, 255, 255)
  436.         bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
  437.       end
  438.       @_damage_sprite = ::Sprite.new(self.viewport)
  439.       @_damage_sprite.bitmap = bitmap
  440.       @_damage_sprite.ox = 80
  441.       @_damage_sprite.oy = 20
  442.       @_damage_sprite.x = self.x
  443.       @_damage_sprite.x -= self.bitmap.width/2 if @battler.is_a?(Game_Actor)
  444.       @_damage_sprite.y = self.y - self.oy / 2
  445.       @_damage_sprite.z = 3000
  446.       @_damage_duration = 40
  447.     end
  448.   end
  449. end
  450. module RPG
  451. #--------------------------------------------------------------------------
  452. # ● 常量设定
  453. #--------------------------------------------------------------------------
  454. # 是否显示总伤害
  455. SHOW_TOTAL_DAMAGE = true
  456. # 角色受攻击时是否跳一下
  457. BATTLER_JUMP = true
  458. # 伤害美化字符串文件夹名(放在Pictures文件夹中的子文件夹)
  459. STRING_DOCUMENTS = "String/"
  460. # 是否使用伤害美化效果
  461. USE_DAMAGE = true

  462. class Sprite < ::Sprite
  463.    #==========================================
  464.    # 修改说明:
  465.    # @flash_shake用来制作挨打时候跳跃
  466.    # @_damage    用来记录每次打击之后弹出数字
  467.    # @_total_damage 记录总伤害
  468.    # @_total_damage_duration 总伤害持续帧
  469.    #==========================================
  470.    #alias 66RPG_rainbow_initialize : initialize
  471.    def initialize(viewport = nil)
  472.      #66RPG_rainbow_initialize(viewport)
  473.      super(viewport)
  474.      @_whiten_duration = 0
  475.      @_appear_duration = 0
  476.      @_escape_duration = 0
  477.      @_collapse_duration = 0
  478.      @_damage_duration = 0
  479.      @_animation_duration = 0
  480.      @_blink = false
  481.      # 挨打时候跳跃
  482.      @flash_shake = 0
  483.      # 伤害记录数组
  484.      @_damage = []
  485.      # 总伤害数字
  486.      @_total_damage = 0
  487.      # 总伤害持续帧
  488.      @_total_damage_duration = 0
  489.      #.........................................................................
  490.      @hits = 0
  491.      #.........................................................................
  492.    end
  493.    #--------------------------------------------------------------------------
  494.    #美化的伤害处理
  495.    #--------------------------------------------------------------------------
  496.     def damage(value, critical)
  497.       
  498. if USE_DAMAGE == true then
  499.   
  500.       # 释放伤害,效果是伤害数字快速消失,觉得不如不消失好看......
  501.       #dispose_damage
  502.       #清除hit数
  503.       dispose_hit
  504.       # 如果伤害值是数值
  505.       if value.is_a?(Numeric)
  506.         # 绝对值转为字符串
  507.         damage_string = value.abs.to_s
  508.       else
  509.         # 转为字符串
  510.         damage_string = value.to_s
  511.       end
  512.       # 初始化位图
  513.       bitmap = Bitmap.new(162, 64)
  514.       bitmap.font.name = ["华文行楷","黑体", "宋体"]
  515.       bitmap.font.size = 32
  516.       # 伤害值是数值的情况下
  517.       if value.is_a?(Numeric)
  518.         # 分割伤害值字符串
  519.         damage_array = damage_string.scan(/./)
  520.         damage_x = 81 - damage_string.size * 9
  521.         # 伤害值为负的情况下
  522.         if value < 0
  523.           # 调用回复数字表
  524.           rect_y = 32
  525.         else
  526.           # 调用伤害数字表
  527.           rect_y = 0
  528.         end
  529.         # 循环伤害值字符串
  530.         for char in damage_array
  531.           number = char.to_i
  532.           # 显示伤害数字
  533.           bitmap.blt(damage_x, 32, RPG::Cache.picture(STRING_DOCUMENTS + "Damage"),#"Damagenew"),
  534.           Rect.new(number * 18, rect_y, 18, 32))
  535.           # 后移一位
  536.           damage_x += 18
  537.         end
  538.       # 伤害值不是数值的情况
  539.       else
  540.         # 如果伤害值不是 Miss
  541.         unless value == "Miss"
  542.           # 系统默认描画字符串
  543.           bitmap.font.color.set(0, 0, 0)
  544.           bitmap.draw_text(-1, 27, 162, 36, damage_string, 1)
  545.           bitmap.draw_text(+1, 27, 162, 36, damage_string, 1)
  546.           bitmap.draw_text(-1, 29, 162, 36, damage_string, 1)
  547.           bitmap.draw_text(+1, 29, 162, 36, damage_string, 1)
  548.           bitmap.font.color.set(255, 255, 255)
  549.           bitmap.draw_text(0, 28, 162, 36, damage_string, 1)
  550.         # Miss 的情况下
  551.         else
  552.           # 显示未击中图画
  553.           bitmap.blt(36, 28, RPG::Cache.picture(STRING_DOCUMENTS + "Damage"), Rect.new(90, 64, 90, 32))
  554.         end
  555.       end
  556.       # 会心一击标志打开的情况
  557.       if critical
  558.         # 显示会心一击图画
  559.         bitmap.blt(36, 0, RPG::Cache.picture(STRING_DOCUMENTS + "Damage"), Rect.new(0, 64, 90, 32))
  560.       end
  561.       
  562. else
  563.       
  564.      #.........................................................................
  565.      #清除hit数
  566.      dispose_hit
  567.      #.........................................................................
  568.      if value.is_a?(Numeric)
  569.        damage_string = value.abs.to_s
  570.      else
  571.        damage_string = value.to_s
  572.      end
  573.      bitmap = Bitmap.new(160, 48)
  574.      bitmap.font.name = "Arial Black"
  575.      bitmap.font.size = 32
  576.      bitmap.font.color.set(0, 0, 0)
  577.      bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  578.      bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  579.      bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  580.      bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
  581.      #=======================================
  582.      # 修改:颜色
  583.      #=======================================
  584.      if value.is_a?(Numeric) and value < 0
  585.        bitmap.font.color.set(176, 255, 144)
  586.      else
  587.        bitmap.font.color.set(255, 55, 55)
  588.      end
  589.      bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  590.      if critical
  591.        bitmap.font.size = 20
  592.        bitmap.font.color.set(0, 0, 0)
  593.        bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
  594.        bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
  595.        bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
  596.        bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
  597.        bitmap.font.color.set(255, 255, 255)
  598.        bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
  599.      end
  600.      
  601. end
  602.    
  603.      # 伤害值定位     
  604.      @_damage_sprite = ::Sprite.new#(self.viewport)
  605.      @_damage_sprite.bitmap = bitmap
  606.      @_damage_sprite.ox = 80
  607.      @_damage_sprite.oy = 20
  608.      @_damage_sprite.x = self.x
  609.      @_damage_sprite.y = self.y - self.oy / 2
  610.      @_damage_sprite.z = 3000
  611.      @_damage_duration = 40
  612.      #=======================================
  613.      # 修改:推入新的伤害
  614.      #=======================================
  615.      @_damage.push([@_damage_sprite,@_damage_duration-10,0, rand(30) - 15, rand(3)])
  616.      # 总伤害处理
  617.      make_total_damage(value)
  618.      
  619.      
  620.      
  621.     end
  622.    #--------------------------------------------------------------------------
  623.    # ● 返回 @hits
  624.    #--------------------------------------------------------------------------
  625.    def get_hit
  626.      return @hits
  627.    end
  628.    #--------------------------------------------------------------------------
  629.    # ● hit数的美化描绘
  630.    #--------------------------------------------------------------------------
  631.    #..........................................................................
  632.    def hit
  633.      # 如果伤害值是数值
  634.      # 转为字符串
  635.      value=@hits
  636.      hits_string = value.to_s
  637.      # 初始化位图
  638.      bitmap = Bitmap.new(320, 64)
  639.      bitmap.font.name = "Arial Black"
  640.      bitmap.font.size = 32
  641.      # 分割伤害值字符串
  642.      hits_array = hits_string.scan(/./)
  643.      hits_x = - 36.2#hits_string.size * 18.1 # 81 - hits_string.size * 18.1
  644.      rect_y = 0
  645.      # 循环伤害值字符串
  646.      for char in hits_array
  647.        # 后移一位
  648.        hits_x += 36.2
  649.        number = char.to_i
  650.        # 显示伤害数字
  651.        bitmap.blt(hits_x, 0, RPG::Cache.picture(STRING_DOCUMENTS + "Number"),
  652.        Rect.new(number * 36.2, rect_y, 36.2, 50))
  653.      end
  654.      hits_x += 18.1
  655.      bitmap.blt(hits_x, 0, RPG::Cache.picture(STRING_DOCUMENTS + "HITS"),
  656.                 Rect.new(0, -21, 90, 50))
  657.      # 伤害值定位
  658.      @_hits_sprite = ::Sprite.new(self.viewport)
  659.      @_hits_sprite.bitmap = bitmap
  660.      @_hits_sprite.x = 560 - hits_string.size * 36.2
  661.      @_hits_sprite.y = 70
  662.      @_hits_sprite.z = 3000
  663.      @_hits_duration = 40
  664.    end
  665.    #..........................................................................
  666.    #--------------------------------------------------------------------------
  667.    # ● 美化的总伤害处理
  668.    #--------------------------------------------------------------------------
  669.    def make_total_damage(value)
  670.      
  671. if USE_DAMAGE == true then     
  672.      
  673.      if value.is_a?(Numeric)# and SHOW_TOTAL_DAMAGE
  674.        @_total_damage += value
  675.         # 绝对值转为字符串
  676.         damage_string = @_total_damage.abs.to_s
  677.       else
  678.         return
  679.       end
  680. #####################################################小改动
  681.      if SHOW_TOTAL_DAMAGE
  682. #####################################################
  683.       # 初始化位图
  684.       bitmap = Bitmap.new(300, 150)
  685.       bitmap.font.name = "Arial Black"
  686.       bitmap.font.size = 32
  687.       # 伤害值是数值的情况下
  688.       if value.is_a?(Numeric)
  689.         # 分割伤害值字符串
  690.         damage_array = damage_string.scan(/./)
  691.         damage_x = 40 - damage_string.size * 9
  692.         # 伤害值为负的情况下
  693.         if value < 0
  694.           # 调用回复数字表
  695.           name= STRING_DOCUMENTS + "Number3"
  696.         else
  697.           # 调用伤害数字表
  698.           name= STRING_DOCUMENTS + "Number2"
  699.         end
  700.         # 循环伤害值字符串
  701.         for char in damage_array
  702.           number = char.to_i
  703.           # 显示伤害数字
  704.           bitmap.blt(damage_x, 0, RPG::Cache.picture(name),
  705.           Rect.new(number * 36.2, 0, 36.2, 50))
  706.           # 后移一位
  707.           damage_x += 36.2
  708.         end
  709. #####################################################小改动
  710.      end
  711. #####################################################
  712.       end
  713.       
  714. else
  715.             
  716.    #--------------------------------------------------------------------------
  717.    # ● 总伤害处理
  718.    #--------------------------------------------------------------------------
  719.      if value.is_a?(Numeric)# and SHOW_TOTAL_DAMAGE
  720.        @_total_damage += value
  721.      else
  722.        return
  723.      end
  724. #####################################################小改动
  725.      if SHOW_TOTAL_DAMAGE
  726. #####################################################
  727.      bitmap = Bitmap.new(300, 150)
  728.      bitmap.font.name = "Arial Black"
  729.      bitmap.font.size = 48
  730.      bitmap.font.color.set(0, 0, 0)
  731.      bitmap.draw_text(+2, 12+2, 160, 36, @_total_damage.abs.to_s, 1)
  732.      if @_total_damage < 0
  733.        bitmap.font.color.set(80, 255, 00)
  734.      else
  735.        bitmap.font.color.set(255, 140, 0)
  736.      end
  737.      bitmap.draw_text(0, 12, 160, 36, @_total_damage.abs.to_s, 1)
  738. #####################################################小改动
  739.      end
  740. #####################################################
  741. end

  742.      if @_total_damage_sprite.nil?
  743.        @_total_damage_sprite = ::Sprite.new#(self.viewport)
  744.        @_total_damage_sprite.ox = 80
  745.        @_total_damage_sprite.oy = 20
  746.        @_total_damage_sprite.z = 3000
  747.      end
  748.      @_total_damage_sprite.bitmap = bitmap
  749.      @_total_damage_sprite.zoom_x = 1.5
  750.      @_total_damage_sprite.zoom_y = 1.5
  751.      @_total_damage_sprite.x = self.x
  752.      @_total_damage_sprite.y = self.y  - self.oy / 2 - 64
  753.      @_total_damage_sprite.z = 3001
  754.      #.........................................................................
  755.      @_total_damage_duration = 40
  756.      #.........................................................................
  757.      #.........................................................................
  758.      #hit数描绘
  759.      @hits+=1
  760.      hit
  761.      #.........................................................................
  762.    end
  763.    def animation(animation, hit, battler_damage="", battler_critical=false)
  764.      dispose_animation      
  765.      #=======================================
  766.      # 修改:记录伤害和critical
  767.      #=======================================
  768.      @battler_damage = battler_damage
  769.      @battler_critical = battler_critical
  770.      @_animation = animation
  771.      return if @_animation == nil
  772.      @_animation_hit = hit
  773.      @_animation_duration = @_animation.frame_max
  774.      animation_name = @_animation.animation_name
  775.      animation_hue = @_animation.animation_hue
  776.      bitmap = RPG::Cache.animation(animation_name, animation_hue)
  777.      #=======================================
  778.      # 修改:计算总闪光权限值
  779.      #=======================================
  780.      for timing in @_animation.timings
  781.        quanzhong = animation_process_timing(timing, @_animation_hit,true)
  782.        @all_quanzhong += quanzhong
  783.        # 记录最后一次闪光
  784.        @_last_frame = timing.frame if quanzhong != 0
  785.      end
  786.      #.........................................................................
  787.      @last_frame = @_last_frame
  788.      #.........................................................................
  789.      if @@_reference_count.include?(bitmap)
  790.        @@_reference_count[bitmap] += 1
  791.      else
  792.        @@_reference_count[bitmap] = 1
  793.      end
  794.      #=======================================
  795.      # 修改:行动方动画不显示伤害
  796.      #=======================================
  797.      if $scene.is_a?(Scene_Battle)
  798.        if $scene.animation1_id == @battler.animation_id
  799.          @battler_damage = ""
  800.        end
  801.      end
  802.      @_animation_sprites = []
  803.      if @_animation.position != 3 or not @@_animations.include?(animation)
  804.        for i in 0..15
  805.          sprite = ::Sprite.new(self.viewport)
  806.          sprite.bitmap = bitmap
  807.          sprite.visible = false
  808.          @_animation_sprites.push(sprite)
  809.        end
  810.        unless @@_animations.include?(animation)
  811.          @@_animations.push(animation)
  812.        end
  813.      end
  814.      update_animation
  815.    end
  816.    #=======================================
  817.    # 修改:更换清除伤害的算法,以防万一
  818.    #       本内容在脚本中没有使用过
  819.    #=======================================
  820.    def dispose_damage
  821.      for damage in @_damage.reverse
  822.        damage[0].bitmap.dispose
  823.        damage[0].dispose
  824.        @_damage.delete(damage)
  825.      end
  826.      @_total_damage = 0
  827.      @_last_frame = -1
  828.      if @_total_damage_sprite != nil
  829.        @_total_damage_duration = 0
  830.        @_total_damage_sprite.bitmap.dispose
  831.        @_total_damage_sprite.dispose
  832.        @_total_damage_sprite = nil
  833.      end
  834.    end
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

魔王 ⑨

梦石
0
星屑
90
在线时间
379 小时
注册时间
2006-10-16
帖子
4299

贵宾

4
发表于 2009-2-4 20:37:21 | 只看该作者
  1.    #=======================================
  2.    # 清除hit数
  3.    #=======================================
  4.    #...........................................................................
  5.    def dispose_hit
  6.      if @_hits_sprite != nil
  7.        @_hits_sprite.bitmap.dispose
  8.        @_hits_sprite.dispose
  9.        @_hits_sprite = nil
  10.      end
  11.    end
  12.    #...........................................................................
  13.    def dispose_animation
  14.      #=======================================
  15.      # 修改:清除记录的伤害,清除权重记录
  16.      #=======================================
  17.      @battler_damage = nil
  18.      @battler_critical = nil
  19.      @all_quanzhong = 1
  20.      @_total_damage = 0
  21.      @_last_frame = -1
  22.      #.........................................................................
  23.      @hits = 0
  24.      #.........................................................................
  25.      if @_animation_sprites != nil
  26.        sprite = @_animation_sprites[0]
  27.        if sprite != nil
  28.          @@_reference_count[sprite.bitmap] -= 1
  29.          if @@_reference_count[sprite.bitmap] == 0
  30.            sprite.bitmap.dispose
  31.          end
  32.        end
  33.        for sprite in @_animation_sprites
  34.          sprite.dispose
  35.        end
  36.        @_animation_sprites = nil
  37.        @_animation = nil
  38.      end
  39.    end
  40.    def update
  41.      super
  42.      if @_whiten_duration > 0
  43.        @_whiten_duration -= 1
  44.        self.color.alpha = 128 - (16 - @_whiten_duration) * 10
  45.      end
  46.      if @_appear_duration > 0
  47.        @_appear_duration -= 1
  48.        self.opacity = (16 - @_appear_duration) * 16
  49.      end
  50.      if @_escape_duration > 0
  51.        @_escape_duration -= 1
  52.        self.opacity = 256 - (32 - @_escape_duration) * 10
  53.      end
  54.      if @_collapse_duration > 0
  55.        @_collapse_duration -= 1
  56.        self.opacity = 256 - (48 - @_collapse_duration) * 6
  57.      end
  58.      #=======================================
  59.      # 修改:更新算法,更新弹出
  60.      #=======================================
  61.      if @_damage_duration > 0
  62.        @_damage_duration -= 1
  63.        for damage in @_damage
  64.          damage[0].x = self.x + self.viewport.rect.x -
  65.                        self.ox + self.src_rect.width / 2 +
  66.                        (40 - damage[1]) * damage[3] / 10
  67.          damage[0].y -= damage[4]+damage[1]/10
  68.          damage[0].opacity = damage[1]*20
  69.          damage[1] -= 1
  70.          if damage[1]==0
  71.            damage[0].bitmap.dispose
  72.            damage[0].dispose
  73.            @_damage.delete(damage)
  74.            next
  75.          end
  76.        end
  77.      end
  78.      #=======================================
  79.      # 添加:弹出总伤害
  80.      #=======================================
  81.      if @_total_damage_duration > 0
  82.        @_total_damage_duration -= 1
  83.        @_total_damage_sprite.y -= 1 if @_total_damage_duration % 2 == 0
  84.        if @_total_damage_sprite.zoom_x > 1.0
  85.          @_total_damage_sprite.zoom_x -= 0.05
  86.        end
  87.        if @_total_damage_sprite.zoom_y > 1.0
  88.          @_total_damage_sprite.zoom_y -= 0.05
  89.        end
  90.        @_total_damage_sprite.opacity = 256 - (24 - @_total_damage_duration) * 16
  91.        #......................................................................
  92.        if @_total_damage_duration <= 7 and @_total_damage_duration > 0
  93.          @_hits_sprite.opacity -= 32
  94.          @_hits_sprite.x += 1
  95.        end
  96.        #......................................................................
  97.        if @_total_damage_duration <= 0
  98.          #.....................................................................
  99.          dispose_hit
  100.          #.....................................................................
  101.          @_total_damage = 0
  102.          @_total_damage_duration = 0
  103. #####################################################小改动
  104.          if SHOW_TOTAL_DAMAGE
  105.          @_total_damage_sprite.bitmap.dispose
  106.          end
  107. #####################################################
  108.          @_total_damage_sprite.dispose
  109.          @_total_damage_sprite = nil
  110.        end
  111.      end
  112.      #=======================================
  113.      if @_animation != nil and (Graphics.frame_count % 2 == 0)
  114.        @_animation_duration -= 1
  115.        update_animation
  116.      end
  117.      if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
  118.        update_loop_animation
  119.        @_loop_animation_index += 1
  120.        #......................................................................
  121.        @loop_animation_once = 0
  122.        @loop_animation_once = 1 if @once == 1 and @_loop_animation_index == @_loop_animation.frame_max
  123.        #......................................................................
  124.        @_loop_animation_index %= @_loop_animation.frame_max
  125.      end
  126.      if @_blink
  127.        @_blink_count = (@_blink_count + 1) % 32
  128.        if @_blink_count < 16
  129.          alpha = (16 - @_blink_count) * 6
  130.        else
  131.          alpha = (@_blink_count - 16) * 6
  132.        end
  133.        self.color.set(255, 255, 255, alpha)
  134.      end
  135.      @@_animations.clear
  136.    end
  137.    #..........................................................................
  138.    def loop_animation_once
  139.      return @_loop_animation_once
  140.    end
  141.    #..........................................................................
  142.    def update_animation
  143.      if @_animation_duration > 0
  144.        frame_index = @_animation.frame_max - @_animation_duration
  145.        @frame_index = frame_index
  146.        cell_data = @_animation.frames[frame_index].cell_data
  147.        position = @_animation.position
  148.        animation_set_sprites(@_animation_sprites, cell_data, position)
  149.        #=======================================
  150.        # 修改:弹出伤害,权重计算
  151.        #=======================================
  152.        for timing in @_animation.timings
  153.          if timing.frame == frame_index
  154.            t = 1.0 * animation_process_timing(timing, @_animation_hit)            
  155.            #p t,"当前权重", @all_quanzhong,"总权重"
  156.            if @battler_damage.is_a?(Numeric) and t != 0
  157.              t *= @battler_damage
  158.              t /= @all_quanzhong
  159.              #p t,"当前伤害",@battler_damage,"总伤害"
  160.              t = t.to_i
  161.              # 最后一次闪光的话,伤害修正
  162.              if frame_index == @_last_frame
  163.                @_total_damage = @battler_damage - t
  164.              end
  165.              #p t,@battler_damage,@all_quanzhong
  166.              damage(t,@battler_critical)
  167.            # 防止重复播放miss
  168.            elsif !@battler_damage.is_a?(Numeric) and timing.flash_scope != 0
  169.              damage(@battler_damage,@battler_critical)
  170.            end
  171.          end
  172.        end
  173.      else
  174.        dispose_animation
  175.      end
  176.    end
  177.    #=======================================
  178.    # 修改:敌人跳跃的功能 + 添加返回数值
  179.    #=======================================
  180.    def update_loop_animation
  181.      frame_index = @_loop_animation_index
  182.      cell_data = @_loop_animation.frames[frame_index].cell_data
  183.      position = @_loop_animation.position
  184.      #·改·
  185.      if @wait_count.to_i <= 0
  186.        @wait_count = 0
  187.        animation_set_sprites(@_loop_animation_sprites, cell_data, position)
  188.      else
  189.        @wait_count -= 1
  190.        for sprite in @_loop_animation_sprites
  191.          sprite.visible = false
  192.        end
  193.      end
  194.      if @wait_flash.to_i <= 0
  195.        @wait_flash = 0
  196.      else
  197.        @wait_flash -= 1
  198.        for sprite in @_loop_animation_sprites
  199.          sprite.blend_type = 1
  200.        end
  201.      end
  202.      #·改·
  203.      for timing in @_loop_animation.timings
  204.        if timing.frame == frame_index
  205.          animation_process_timing(timing, true)
  206.        end
  207.      end
  208.    end
  209.    #=======================================
  210.    # 修改:敌人跳跃的功能 + 添加返回数值
  211.    #=======================================
  212.    def loop_animation(animation)
  213.      return if animation == @_loop_animation
  214.      dispose_loop_animation
  215.      @_loop_animation = animation
  216.      return if @_loop_animation == nil
  217.      @_loop_animation_index = 0
  218.      animation_name = @_loop_animation.animation_name
  219.      animation_hue = @_loop_animation.animation_hue
  220.      bitmap = RPG::Cache.animation(animation_name, animation_hue)
  221.      if @@_reference_count.include?(bitmap)
  222.        @@_reference_count[bitmap] += 1
  223.      else
  224.        @@_reference_count[bitmap] = 1
  225.      end
  226.      @_loop_animation_sprites = []
  227.      for i in 0..15
  228.        sprite = ::Sprite.new
  229.        sprite.bitmap = bitmap
  230.        sprite.visible = false
  231.        @_loop_animation_sprites.push(sprite)
  232.      end
  233.      update_loop_animation
  234.    end
  235.    #=======================================
  236.    # 修改:敌人跳跃的功能 + 添加返回数值
  237.    #=======================================
  238.     def animation_process_timing(timing, hit,dontflash=false)
  239.       if (timing.condition == 0) or
  240.          (timing.condition == 1 and hit == true) or
  241.          (timing.condition == 2 and hit == false)
  242.         unless dontflash
  243.           if timing.se.name != ""
  244.             se = timing.se
  245.             Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch)
  246.           end
  247.         end
  248.         case timing.flash_scope
  249.         when 1
  250.           unless dontflash
  251.             self.flash(timing.flash_color, timing.flash_duration * 2)
  252.             #....................................................................
  253.             @wait_flash = timing.flash_duration
  254.             #....................................................................
  255.             if @_total_damage >0
  256.               @flash_shake_switch = true
  257.               @flash_shake = 10
  258.             end
  259.           end
  260.           return timing.flash_color.alpha * timing.flash_duration
  261.         when 2
  262.           unless dontflash
  263.             if self.viewport != nil
  264.               self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
  265.               return timing.flash_color.alpha * timing.flash_duration
  266.             end
  267.           end
  268.         when 3
  269.           unless dontflash
  270.             self.flash(nil, timing.flash_duration * 2)
  271.             #@_loop_animation_count = 1
  272.             #·改·
  273.             @wait_count = timing.flash_duration
  274.             #·改·
  275.           end
  276.           return timing.flash_color.alpha * timing.flash_duration
  277.         end
  278.       end      
  279.       return 0
  280.     end   
  281. end
  282. end
  283. #==============================================================================
  284. # ■ Sprite_Battler
  285. #==============================================================================
  286. class Sprite_Battler < RPG::Sprite
  287. #--------------------------------------------------------------------------
  288. # ● 初始化对像
  289. #    添加跳跃记录
  290. #--------------------------------------------------------------------------
  291. def initialize(viewport, battler = nil)
  292.   super(viewport)
  293.   @battler = battler
  294.   @battler_visible = false
  295.   @flash_shake_switch = true
  296.   #........................................................................
  297.   @once = 0
  298.   @frame_index = -1
  299.   @last_frame = 0
  300.   #........................................................................
  301. end
  302. #--------------------------------------------------------------------------
  303. # ● 刷新画面
  304. #    增添跳跃功能
  305. #--------------------------------------------------------------------------
  306. def update
  307.   super
  308.   # 战斗者为 nil 的情况下
  309.   if @battler == nil
  310.     self.bitmap = nil
  311.     loop_animation(nil)
  312.     return
  313.   end
  314.   # 文件名和色相与当前情况有差异的情况下
  315.   if @battler.battler_name != @battler_name or
  316.      @battler.battler_hue != @battler_hue
  317.     # 获取、设置位图
  318.     @battler_name = @battler.battler_name
  319.     @battler_hue = @battler.battler_hue
  320.     self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
  321.     #.......................................................................
  322.     if not @battler.hidden and not @battler.dead?
  323.       @battler.setup_battler_ani(@battler.battler_name.split(/★/)[1])
  324.     end
  325.     #.......................................................................
  326.     @width = bitmap.width
  327.     @height = bitmap.height
  328.     self.ox = @width / 2
  329.     self.oy = @height
  330.   end
  331.   #.......................................................................
  332.   update_actor_animation
  333.   update_enemy_animation
  334.   #.......................................................................
  335.   # 动画 ID 与当前的情况有差异的情况下
  336.   #.........................................................................
  337.   if @battler.is_a?(Game_Enemy)
  338.     if @once == 1 and @loop_animation_once == 1 and
  339.        @battler.battler_dead_ani == 1
  340.       @battler.setup_battler_ani(@battler.battler_name.split(/★/)[5])
  341.     elsif @once == 1 and @loop_animation_once == 1 and $scene.phase != 5
  342.       @battler.setup_battler_ani(@battler.battler_name.split(/★/)[1])
  343.     end
  344.   end
  345.   if @battler.is_a?(Game_Actor)
  346.     ####################################################################
  347.     if @once == 1 and @loop_animation_once == 1 and $scene.phase != 5 and
  348.        @battler.battler_dead_ani == 1 and @battler.dead?
  349.       @battler.setup_battler_ani(@battler.battler_name.split(/★/)[5])
  350.     #######################################################################
  351.     elsif @once == 1 and @loop_animation_once == 1 and $scene.phase != 5
  352.       @battler.setup_battler_ani(@battler.battler_name.split(/★/)[1])
  353.       #################################################################
  354.       $fangyu = 0
  355.       @battler.setup_battler_dead_ani(0)
  356.       ########################################################
  357.     elsif @once == 1 and @loop_animation_once == 1 and $scene.phase == 5 and
  358.           not @battler.dead?
  359.       @battler.setup_battler_ani(@battler.battler_name.split(/★/)[7])
  360.       ######################################################
  361.       $fangyu = 0
  362.       @battler.setup_battler_dead_ani(0)
  363.       ######################################################
  364.     end
  365.   end
  366.   if @battler.battler_ani != @battler_ani
  367.     @battler_ani = @battler.battler_ani
  368.     @once = @battler.battler_ani_once
  369.     loop_animation($data_animations[@battler_ani.to_i])
  370.   end
  371.   #.........................................................................
  372.   # 明灭
  373.   if @battler.blink
  374.     blink_on
  375.   else
  376.     blink_off
  377.   end
  378.   # 不可见的情况下
  379.   unless @battler_visible
  380.     # 出现
  381.     if not @battler.hidden and not @battler.dead? and
  382.        (@battler.damage == nil or @battler.damage_pop)
  383.       #.......................................................................
  384.       if @battler.is_a?(Game_Enemy)
  385.         @battler.setup_battler_ani(@battler.battler_name.split(/★/)[1])
  386.         #appear
  387.       else
  388.         @battler.setup_battler_ani(@battler.battler_name.split(/★/)[1])
  389.       end
  390.       #.......................................................................
  391.       @battler_visible = true
  392.     end
  393.   end
  394.   # 可见的情况下
  395.   if @battler_visible
  396.     # 逃跑
  397.     if @battler.hidden
  398.       $game_system.se_play($data_system.escape_se)
  399.       escape
  400.       @battler_visible = false
  401.     end
  402.     # 白色闪烁
  403.     if @battler.white_flash
  404.       whiten
  405.       @battler.white_flash = false
  406.     end
  407.     # 动画
  408.     if @battler.animation_id != 0
  409.       animation = $data_animations[@battler.animation_id]
  410.       animation(animation, @battler.animation_hit,@battler.damage, @battler.critical)
  411.       @battler.animation_id = 0
  412.     end
  413.     # 伤害
  414.     if @battler.damage_pop
  415.       @battler.damage = nil
  416.       @battler.critical = false
  417.       @battler.damage_pop = false
  418.     end
  419.     # korapusu
  420.     if @battler.damage == nil and @battler.dead?
  421.       if @battler.is_a?(Game_Enemy)
  422.         if @battler.battler_dead_ani != 1
  423.           #p "Battler Death Error"
  424.           $game_system.se_play($data_system.enemy_collapse_se)
  425.           @battler.setup_battler_ani(@battler.battler_name.split(/★/)[4], 1)
  426.           @battler.setup_battler_dead_ani(1)
  427.         end
  428.         #.....................................................................
  429.         collapse
  430.         #.....................................................................
  431.       else
  432.         #.....................................................................
  433.         if @battler.battler_dead_ani != 1
  434.           #p "Battler Death Error"
  435.           $game_system.se_play($data_system.enemy_collapse_se)
  436.           @battler.setup_battler_ani(@battler.battler_name.split(/★/)[4], 1)
  437.           @battler.setup_battler_dead_ani(1)
  438.         end
  439.         #.....................................................................
  440.       end
  441.       @battler_visible = false
  442.     end
  443.   end
  444.   # 设置活动块的坐标
  445.   if @flash_shake_switch == true
  446.     self.x = @battler.screen_x
  447.     self.y = @battler.screen_y
  448.     self.z = @battler.screen_z
  449.     @flash_shake_switch = false
  450.   end
  451.   if @flash_shake != 0 and @battler.damage != nil and RPG::BATTLER_JUMP
  452.     if @battler.is_a?(Game_Enemy)
  453.       case @flash_shake
  454.       when 9..10
  455.         self.x -=4
  456.         self.y -=4
  457.         self.z = @battler.screen_z
  458.       when 6..8
  459.         self.x -=2
  460.         self.y -=2
  461.         self.z = @battler.screen_z
  462.       when 3..5
  463.         self.x +=2
  464.         self.y +=2
  465.         self.z = @battler.screen_z
  466.       when 1..2
  467.         self.x +=4
  468.         self.y +=4
  469.         self.z = @battler.screen_z
  470.       end
  471.     end
  472.     if @battler.is_a?(Game_Actor)
  473.       case @flash_shake
  474.       when 9..10
  475.         self.x +=4
  476.         self.y +=4
  477.         self.z = @battler.screen_z
  478.       when 6..8
  479.         self.x +=2
  480.         self.y +=2
  481.         self.z = @battler.screen_z
  482.       when 3..5
  483.         self.x -=2
  484.         self.y -=2
  485.         self.z = @battler.screen_z
  486.       when 1..2
  487.         self.x -=4
  488.         self.y -=4
  489.         self.z = @battler.screen_z
  490.       end
  491.     end
  492.     @flash_shake -= 1
  493.   end
  494. end
  495. end

  496. #==============================================================================
  497. # ■ Scene_Battle
  498. #------------------------------------------------------------------------------
  499. #  处理战斗画面的类。
  500. #==============================================================================

  501. class Scene_Battle
  502. #--------------------------------------------------------------------------
  503. # ● 定义实例变量
  504. #--------------------------------------------------------------------------
  505. attr_reader   :animation1_id                    # 行动方动画ID
  506. end
  507. class Sprite_Battler < RPG::Sprite
  508.   #--------------------------------------------------------------------------
  509.   # ● 处理角色动作
  510.   #--------------------------------------------------------------------------
  511.   def update_actor_animation
  512.     if @battler.is_a?(Game_Actor)
  513.       if @battler.show_damage_value != nil
  514.         self.damage(@battler.show_damage_value, false)
  515.         @battler.show_damage(nil)
  516.         @battler.setup_battler_ani(@battler.battler_name.split(/★/)[3], 1)
  517.         @battler.setup_battler_hurt_ani(1)
  518.       end
  519.       if @battler.current_action.kind == 0 and @battler.current_action.basic == 1
  520.         ######################################################################
  521.         @battler.setup_battler_ani(@battler.battler_name.split(/★/)[2], 1)
  522.           @battler.setup_battler_hurt_ani(1)
  523.         ####################################################################
  524.       else
  525. #        if @hits == 1 and not @battler.dead? and @battler.battler_hurt_ani != 1 and @battler.damage.is_a?(Numeric) and @battler.damage > 0 and $fangyu != 1
  526.         if @hits >= 1 and not @battler.dead? and @battler.damage.is_a?(Numeric) and @battler.damage > 0 and $fangyu != 1
  527.           @battler.setup_battler_ani(@battler.battler_name.split(/★/)[3], 1)
  528.           @battler.setup_battler_hurt_ani(1)
  529.         ########################################################################
  530.         elsif @hits == 1 and not @battler.dead? and @battler.battler_hurt_ani != 1 and @battler.damage.is_a?(Numeric) and @battler.damage > 0 and $fangyu == 1
  531.           @battler.setup_battler_ani(@battler.battler_name.split(/★/)[2], 1)
  532.           @battler.setup_battler_hurt_ani(1)
  533.           #################################################################
  534.         elsif @hits >= 1 and @battler.damage.is_a?(Numeric) and @battler.damage > 0 and $fangyu != 1 and @frame_index != @last_frame and @battler.dead? and @battler.battler_dead_ani != 1
  535.           @battler.setup_battler_ani(@battler.battler_name.split(/★/)[3], 1)
  536.           @battler.setup_battler_hurt_ani(1)
  537.           #################################################################
  538.         elsif @frame_index == @last_frame and @battler.dead? and @battler.battler_dead_ani != 1
  539.           for actor in $game_party.actors
  540.             if @battler != actor
  541.               actor.add_state(6)
  542.             end
  543.           end
  544.           @battler.setup_battler_ani(@battler.battler_name.split(/★/)[4], 1)
  545.           @battler.setup_battler_dead_ani(1)
  546.         elsif $scene.phase == 5 and @once == 0 and @battler_name != nil and not @battler.hidden and not @battler.dead?
  547.              @once = 1
  548.              @battler.setup_battler_ani(@battler_name.split(/★/)[6], 1)
  549.         end
  550.       end
  551.     end
  552.   end
  553.   #--------------------------------------------------------------------------
  554.   # ● 处理敌人动作
  555.   #--------------------------------------------------------------------------
  556.   def update_enemy_animation
  557.     if @battler.is_a?(Game_Enemy)
  558.       if @battler.show_damage_value != nil
  559.         self.damage(@battler.show_damage_value, false)
  560.         @battler.show_damage(nil)
  561.         @battler.setup_battler_ani(@battler.battler_name.split(/★/)[3], 1)
  562.         @battler.setup_battler_hurt_ani(1)
  563.       end
  564.       if @battler.current_action.kind == 0 and @battler.current_action.basic == 1
  565.       else
  566. #        if @hits == 1 and not @battler.dead? and @battler.battler_hurt_ani != 1 and @battler.damage.is_a?(Numeric) and @battler.damage > 0
  567.         if @hits >= 1 and not @battler.dead? and @battler.damage.is_a?(Numeric) and @battler.damage > 0
  568.           @battler.setup_battler_ani(@battler.battler_name.split(/★/)[3], 1)
  569.           @battler.setup_battler_hurt_ani(1)
  570.           #################################################################
  571.         elsif @hits >= 1 and @battler.damage.is_a?(Numeric) and @battler.damage > 0 and $fangyu != 1 and @frame_index != @last_frame and @battler.dead? and @battler.battler_dead_ani != 1
  572.           @battler.setup_battler_ani(@battler.battler_name.split(/★/)[3], 1)
  573.           @battler.setup_battler_hurt_ani(1)
  574.           #################################################################
  575.         elsif @frame_index == @last_frame and @battler.dead? and @battler.battler_dead_ani != 1
  576.           @battler.setup_battler_ani(@battler.battler_name.split(/★/)[4], 1)
  577.           @battler.setup_battler_dead_ani(1)
  578.           collapse
  579.         end
  580.       end
  581.     end
  582.   end
  583. end
复制代码

直接从我工程里抄出来的…………全部粘帖在一起 - -不知道改了哪里,有没有错未知
话说这不叫连帖吧。 = =
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2008-9-4
帖子
78
5
 楼主| 发表于 2009-2-4 21:58:38 | 只看该作者
{/qiang}试一试就知道行不行了!!        谢谢你啦!!!{/cy}
用回忆制造新奇!!
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

梦石
0
星屑
1852
在线时间
2678 小时
注册时间
2010-6-26
帖子
3197

开拓者整合系统大赛RMVX达人剧作品鉴家

6
发表于 2010-9-15 20:03:02 | 只看该作者
请问有范例工程吗?

评分

参与人数 1星屑 -100 收起 理由
六祈 -100 禁止挖坟

查看全部评分


      情人怨遥夜,竟夕起相思
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 20:05

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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