Project1

标题: 怎么让伤害显示有正负号? [打印本页]

作者: 爆焰    时间: 2011-8-31 08:39
标题: 怎么让伤害显示有正负号?
本帖最后由 「旅」 于 2011-8-31 13:50 编辑
  1. module RPG
  2.   class Sprite < ::Sprite
  3.     def damage(value, critical)
  4.       dispose_damage
  5.       if value.is_a?(Numeric)
  6.         damage_string = value.abs.to_s
  7.       else
  8.         damage_string = value.to_s
  9.       end
  10.       bitmap = Bitmap.new(160, 48)
  11.       bitmap.font.name = "黑体"
  12.       bitmap.font.size = 20
  13.       bitmap.font.color.set(0, 0, 0)
  14.       bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  15.       bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  16.       bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  17.       bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
  18.       if value.is_a?(Numeric) and value < 0
  19.         bitmap.font.color.set(0, 255, 0)
  20.       else
  21.         bitmap.font.color.set(255, 0, 0)
  22.       end
  23.       bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  24.       if critical
  25.         bitmap.font.size = 21
  26.         bitmap.font.color.set(0, 0, 0)
  27.         bitmap.draw_text(-1, -1, 160, 20, "暴击", 1)
  28.         bitmap.draw_text(+1, -1, 160, 20, "暴击", 1)
  29.         bitmap.draw_text(-1, +1, 160, 20, "暴击", 1)
  30.         bitmap.draw_text(+1, +1, 160, 20, "暴击", 1)
  31.         bitmap.font.color.set(255, 255, 255)
  32.         bitmap.draw_text(0, 0, 160, 20, "暴击", 1)
  33.       end
  34.       @_damage_sprite = ::Sprite.new(self.viewport)
  35.       @_damage_sprite.bitmap = bitmap
  36.       @_damage_sprite.ox = 80
  37.       @_damage_sprite.oy = 20
  38.       @_damage_sprite.x = self.x
  39.       @_damage_sprite.y = self.y - self.oy / 2
  40.       @_damage_sprite.z = 3000
  41.       @_damage_duration = 40
  42.     end
  43.   end
  44. end
复制代码
dsu_plus_rewardpost_czw
作者: 亿万星辰    时间: 2011-8-31 08:52
话说这样没有问题的帖子我是不是可以扣分的……  
如果是个人问题,请使用短消息彼此联系。
作者: 爆焰    时间: 2011-8-31 09:02
亿万星辰 发表于 2011-8-31 08:52
话说这样没有问题的帖子我是不是可以扣分的……  
如果是个人问题,请使用短消息彼此联系。 ...

{:2_44:}我咬你哦!
作者: 钢铁列兵    时间: 2011-8-31 09:03
你到底想问什么?
作者: 爆焰    时间: 2011-8-31 09:04
钢铁列兵 发表于 2011-8-31 09:03
你到底想问什么?

没事,超级版主答应单独为我解答的,所以我就发了个帖子
作者: 「旅」    时间: 2011-8-31 11:58
  1. module RPG
  2.   class Sprite < ::Sprite
  3.     def damage(value, critical)
  4.       dispose_damage
  5.       if value > 0
  6.         if value.is_a?(Numeric)
  7.           damage_string = "-" + value.abs.to_s
  8.         else
  9.           damage_string = "-" + value.to_s
  10.         end
  11.       else
  12.         if value.is_a?(Numeric)
  13.           damage_string = "+" + value.abs.to_s
  14.         else
  15.           damage_string = "+" + value.to_s
  16.         end
  17.       end
  18.       bitmap = Bitmap.new(160, 48)
  19.       bitmap.font.name = "黑体"
  20.       bitmap.font.size = 20
  21.       bitmap.font.color.set(0, 0, 0)
  22.       bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  23.       bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  24.       bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  25.       bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
  26.       if value.is_a?(Numeric) and value < 0
  27.         bitmap.font.color.set(0, 255, 0)
  28.       else
  29.         bitmap.font.color.set(255, 0, 0)
  30.       end
  31.       bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  32.       if critical
  33.         bitmap.font.size = 21
  34.         bitmap.font.color.set(0, 0, 0)
  35.         bitmap.draw_text(-1, -1, 160, 20, "暴击", 1)
  36.         bitmap.draw_text(+1, -1, 160, 20, "暴击", 1)
  37.         bitmap.draw_text(-1, +1, 160, 20, "暴击", 1)
  38.         bitmap.draw_text(+1, +1, 160, 20, "暴击", 1)
  39.         bitmap.font.color.set(255, 255, 255)
  40.         bitmap.draw_text(0, 0, 160, 20, "暴击", 1)
  41.       end
  42.       @_damage_sprite = ::Sprite.new(self.viewport)
  43.       @_damage_sprite.bitmap = bitmap
  44.       @_damage_sprite.ox = 80
  45.       @_damage_sprite.oy = 20
  46.       @_damage_sprite.x = self.x
  47.       @_damage_sprite.y = self.y - self.oy / 2
  48.       @_damage_sprite.z = 3000
  49.       @_damage_duration = 40
  50.     end
  51.   end
  52. end
复制代码
OK了~

ps下次发帖记得写清楚原因~
作者: 禾西    时间: 2011-8-31 12:14
私人問題請私下解決,小旅你看著處理吧
作者: 「旅」    时间: 2011-8-31 14:55
本帖最后由 「旅」 于 2011-8-31 17:14 编辑

「旅」于2011-8-31 15:27补充以下内容:
  1. module RPG
  2.   class Sprite < ::Sprite
  3.     def damage(value, critical)
  4.       return if value == ""
  5.       dispose_damage
  6.       if value.to_i > 0
  7.         if value.is_a?(Numeric)
  8.           damage_string = "-" + value.abs.to_s
  9.         else
  10.           damage_string = "-" + value.to_s
  11.         end
  12.       else
  13.         if value.is_a?(Numeric)
  14.           damage_string = "+" + value.abs.to_s
  15.         else
  16.           damage_string = "+" + value.to_s
  17.         end
  18.       end
  19.       bitmap = Bitmap.new(160, 48)
  20.       bitmap.font.name = "黑体"
  21.       bitmap.font.size = 20
  22.       bitmap.font.color.set(0, 0, 0)
  23.       bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  24.       bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  25.       bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  26.       bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
  27.       if value.is_a?(Numeric) and value < 0
  28.         bitmap.font.color.set(0, 255, 0)
  29.       else
  30.         bitmap.font.color.set(255, 0, 0)
  31.       end
  32.       bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  33.       if critical
  34.         bitmap.font.size = 21
  35.         bitmap.font.color.set(0, 0, 0)
  36.         bitmap.draw_text(-1, -1, 160, 20, "暴击", 1)
  37.         bitmap.draw_text(+1, -1, 160, 20, "暴击", 1)
  38.         bitmap.draw_text(-1, +1, 160, 20, "暴击", 1)
  39.         bitmap.draw_text(+1, +1, 160, 20, "暴击", 1)
  40.         bitmap.font.color.set(255, 255, 255)
  41.         bitmap.draw_text(0, 0, 160, 20, "暴击", 1)
  42.       end
  43.       @_damage_sprite = ::Sprite.new(self.viewport)
  44.       @_damage_sprite.bitmap = bitmap
  45.       @_damage_sprite.ox = 80
  46.       @_damage_sprite.oy = 20
  47.       @_damage_sprite.x = self.x
  48.       @_damage_sprite.y = self.y - self.oy / 2
  49.       @_damage_sprite.z = 3000
  50.       @_damage_duration = 40
  51.     end
  52.   end
  53. end



  54. module RPG
  55. class Sprite < ::Sprite
  56. def damage2(value)
  57. dispose_damage

  58. damage_string = value.to_s

  59. if value.to_i > 0
  60. damage_string = "+"+damage_string
  61. end

  62. bitmap = Bitmap.new(160, 48)
  63. bitmap.font.name = "Arial Black"

  64. #——字体修改
  65. bitmap.font.size = 28
  66. #——字体修改

  67. #——边框颜色
  68. bitmap.font.color.set(255, 255, 255)
  69. #——边框颜色

  70. bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  71. bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  72. bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  73. bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)

  74. #——颜色修改
  75. bitmap.font.color.set(0, 185, 185)
  76. #——颜色修改

  77. bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  78. @_damage_sprite2 = ::Sprite.new(self.viewport)
  79. @_damage_sprite2.bitmap = bitmap

  80. #——位置修改
  81. @_damage_sprite2.ox = 80
  82. @_damage_sprite2.oy = 20
  83. @_damage_sprite2.x = self.x
  84. @_damage_sprite2.y = self.y - self.oy / 2 + 15
  85. #——位置修改

  86. @_damage_sprite2.z = 3000
  87. @_damage_duration2 = 40
  88. end
  89. def dispose_damage2
  90. if @_damage_sprite2 != nil
  91. @_damage_sprite2.bitmap.dispose
  92. @_damage_sprite2.dispose
  93. @_damage_sprite2 = nil
  94. @_damage_duration2 = 0
  95. end
  96. end
  97. alias lv24_update update
  98. def update
  99. lv24_update
  100. if @_damage_duration2 > 0
  101. @_damage_duration2 -= 1
  102. case @_damage_duration2
  103. when 38..39
  104. @_damage_sprite2.y -= 4
  105. when 36..37
  106. @_damage_sprite2.y -= 2
  107. when 34..35
  108. @_damage_sprite2.y += 2
  109. when 28..33
  110. @_damage_sprite2.y += 4
  111. end
  112. @_damage_sprite2.opacity = 256 - (12 - @_damage_duration2) * 32
  113. if @_damage_duration2 == 0
  114. dispose_damage
  115. end
  116. end
  117. end
  118. alias lv23_initialize initialize
  119. def initialize(viewport = nil)
  120. lv23_initialize(viewport)
  121. @_damage_duration2 = 0
  122. end
  123. alias lv23_dispose dispose
  124. def dispose
  125. lv23_dispose
  126. dispose_damage2
  127. end
  128. end
  129. end
  130. class Game_Actor
  131. attr_accessor :damage2
  132. alias lv23_initialize initialize
  133. def initialize(i)
  134. lv23_initialize(i)
  135. @damage2 = 0
  136. end
  137. end
  138. class Game_Enemy
  139. attr_accessor :damage2
  140. alias lv23_initialize initialize
  141. def initialize(i,i2)
  142. lv23_initialize(i,i2)
  143. @damage2 = 0
  144. end
  145. end
  146. class Sprite_Battler
  147. alias lv23_update update
  148. def update
  149. lv23_update
  150. return if @battler == nil
  151. if @battler.damage2 != 0
  152. damage2(@battler.damage2)
  153. @battler.damage2 = 0
  154. end
  155. end
  156. end


  157. class Game_Battler
  158.   def skill_effect(user, skill)
  159.     # 清除会心一击标志
  160.     self.critical = false
  161.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  162.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  163.     if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  164.        ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  165.       # 过程结束
  166.       return false
  167.     end
  168.     # 清除有效标志
  169.     effective = false
  170.     # 公共事件 ID 是有效的情况下,设置为有效标志
  171.     effective |= skill.common_event_id > 0
  172.     # 第一命中判定
  173.     hit = skill.hit
  174.     if skill.atk_f > 0
  175.       hit *= user.hit / 100
  176.     end
  177.     hit_result = (rand(100) < hit)
  178.     # 不确定的特技的情况下设置为有效标志
  179.     effective |= hit < 100
  180.     # 命中的情况下
  181.     if hit_result == true
  182.       # 计算威力
  183.       power = skill.power + user.atk * skill.atk_f / 100
  184.       if power > 0
  185.         power -= self.pdef * skill.pdef_f / 200
  186.         power -= self.mdef * skill.mdef_f / 200
  187.         power = [power, 0].max
  188.       end
  189.       # 计算倍率
  190.       rate = 20
  191.       rate += (user.str * skill.str_f / 100)
  192.       rate += (user.dex * skill.dex_f / 100)
  193.       rate += (user.agi * skill.agi_f / 100)
  194.       rate += (user.int * skill.int_f / 100)
  195.       # 计算基本伤害
  196.       self.damage = power * rate / 20
  197.       # 属性修正
  198.       self.damage *= elements_correct(skill.element_set)
  199.       self.damage /= 100
  200.       # 伤害符号正确的情况下
  201.       if self.damage > 0
  202.         # 防御修正
  203.         if self.guarding?
  204.           self.damage /= 2
  205.         end
  206.       end
  207.       # 分散
  208.       if skill.variance > 0 and self.damage.abs > 0
  209.         amp = [self.damage.abs * skill.variance / 100, 1].max
  210.         self.damage += rand(amp+1) + rand(amp+1) - amp
  211.       end
  212.       # 第二命中判定
  213.       eva = 8 * self.agi / user.dex + self.eva
  214.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  215.       hit = self.cant_evade? ? 100 : hit
  216.       hit_result = (rand(100) < hit)
  217.       # 不确定的特技的情况下设置为有效标志
  218.       effective |= hit < 100
  219.     end
  220.     # 命中的情况下
  221.     if hit_result == true
  222.       # 威力 0 以外的物理攻击的情况下
  223.       if skill.power != 0 and skill.atk_f > 0
  224.         # 状态冲击解除
  225.         remove_states_shock
  226.         # 设置有效标志
  227.         effective = true
  228.       end
  229.       # HP 的伤害减法运算
  230.       last_hp = self.hp
  231.       self.hp -= self.damage
  232.       effective |= self.hp != last_hp
  233.       # 状态变化
  234.       @state_changed = false
  235.       effective |= states_plus(skill.plus_state_set)
  236.       effective |= states_minus(skill.minus_state_set)
  237.       # 威力为 0 的场合
  238.       if skill.power == 0
  239.         # 伤害设置为空的字串
  240.         self.damage = ""
  241.         # 状态没有变化的情况下
  242.         unless @state_changed
  243.           # 伤害设置为 "Miss"
  244.           self.damage = "Miss"
  245.         end
  246.       end
  247.     # Miss 的情况下
  248.     else
  249.       # 伤害设置为 "Miss"
  250.       self.damage = "Miss"
  251.     end
  252.     # 不在战斗中的情况下
  253.     unless $game_temp.in_battle
  254.       # 伤害设置为 nil
  255.       self.damage = nil
  256.     end
  257.     # 过程结束
  258.     return effective
  259.   end
  260.   def item_effect(item)
  261.     # 清除会心一击标志
  262.     self.critical = false
  263.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  264.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  265.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  266.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  267.       # 过程结束
  268.       return false
  269.     end
  270.     # 清除有效标志
  271.     effective = false
  272.     # 公共事件 ID 是有效的情况下,设置为有效标志
  273.     effective |= item.common_event_id > 0
  274.     # 命中判定
  275.     hit_result = (rand(100) < item.hit)
  276.     # 不确定的特技的情况下设置为有效标志
  277.     effective |= item.hit < 100
  278.     # 命中的情况
  279.     if hit_result == true
  280.       # 计算回复量
  281.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  282.       recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
  283.       if recover_hp < 0
  284.         recover_hp += self.pdef * item.pdef_f / 20
  285.         recover_hp += self.mdef * item.mdef_f / 20
  286.         recover_hp = [recover_hp, 0].min
  287.       end
  288.       # 属性修正
  289.       recover_hp *= elements_correct(item.element_set)
  290.       recover_hp /= 100
  291.       recover_sp *= elements_correct(item.element_set)
  292.       recover_sp /= 100
  293.       # 分散
  294.       if item.variance > 0 and recover_hp.abs > 0
  295.         amp = [recover_hp.abs * item.variance / 100, 1].max
  296.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  297.       end
  298.       if item.variance > 0 and recover_sp.abs > 0
  299.         amp = [recover_sp.abs * item.variance / 100, 1].max
  300.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  301.       end
  302.       # 回复量符号为负的情况下
  303.       if recover_hp < 0
  304.         # 防御修正
  305.         if self.guarding?
  306.           recover_hp /= 2
  307.         end
  308.       end
  309.       # HP 回复量符号的反转、设置伤害值
  310.       self.damage = -recover_hp
  311.       self.damage2 = recover_sp
  312.       # HP 以及 SP 的回复
  313.       last_hp = self.hp
  314.       last_sp = self.sp
  315.       self.hp += recover_hp
  316.       self.sp += recover_sp
  317.       effective |= self.hp != last_hp
  318.       effective |= self.sp != last_sp
  319.       # 状态变化
  320.       @state_changed = false
  321.       effective |= states_plus(item.plus_state_set)
  322.       effective |= states_minus(item.minus_state_set)
  323.       # 能力上升值有效的情况下
  324.       if item.parameter_type > 0 and item.parameter_points != 0
  325.         # 能力值的分支
  326.         case item.parameter_type
  327.         when 1  # MaxHP
  328.           @maxhp_plus += item.parameter_points
  329.         when 2  # MaxSP
  330.           @maxsp_plus += item.parameter_points
  331.         when 3  # 力量
  332.           @str_plus += item.parameter_points
  333.         when 4  # 灵巧
  334.           @dex_plus += item.parameter_points
  335.         when 5  # 速度
  336.           @agi_plus += item.parameter_points
  337.         when 6  # 魔力
  338.           @int_plus += item.parameter_points
  339.         end
  340.         # 设置有效标志
  341.         effective = true
  342.       end
  343.       # HP 回复率与回复量为 0 的情况下
  344.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  345.         # 设置伤害为空的字符串
  346.         self.damage = ""
  347.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  348.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  349.            (item.parameter_type == 0 or item.parameter_points == 0)
  350.           # 状态没有变化的情况下
  351.           unless @state_changed
  352.             # 伤害设置为 "Miss"
  353.             self.damage = "Miss"
  354.           end
  355.         end
  356.       end
  357.     # Miss 的情况下
  358.     else
  359.       # 伤害设置为 "Miss"
  360.       self.damage = "Miss"
  361.     end
  362.     # 不在战斗中的情况下
  363.     unless $game_temp.in_battle
  364.       # 伤害设置为 nil
  365.       self.damage = nil
  366.     end
  367.     # 过程结束
  368.     return effective
  369.   end
  370. end

  371. class Scene_Battle
  372.   def make_skill_action_result
  373.     # 获取特技
  374.     @skill = $data_skills[@active_battler.current_action.skill_id]
  375.     # 如果不是强制行动
  376.     unless @active_battler.current_action.forcing
  377.       # 因为 SP 耗尽而无法使用的情况下
  378.       unless @active_battler.skill_can_use?(@skill.id)
  379.         # 清除强制行动对像的战斗者
  380.         $game_temp.forcing_battler = nil
  381.         # 移至步骤 1
  382.         @phase4_step = 1
  383.         return
  384.       end
  385.     end
  386.     # 消耗 SP
  387.     @active_battler.sp -= @skill.sp_cost
  388.     @active_battler.damage2 = [email protected]_cost
  389.     # 刷新状态窗口
  390.     @status_window.refresh
  391.     # 在帮助窗口显示特技名
  392.     @help_window.set_text(@skill.name, 1)
  393.     # 设置动画 ID
  394.     @animation1_id = @skill.animation1_id
  395.     @animation2_id = @skill.animation2_id
  396.     # 设置公共事件 ID
  397.     @common_event_id = @skill.common_event_id
  398.     # 设置对像侧战斗者
  399.     set_target_battlers(@skill.scope)
  400.     # 应用特技效果
  401.     for target in @target_battlers
  402.       target.skill_effect(@active_battler, @skill)
  403.     end
  404.   end
  405. end
复制代码
把全部,包括我的sp显示和你的伤害显示都替换成这个~应该没问题了~




范例: SP消耗显示.rar (191.8 KB, 下载次数: 21)




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1