Project1

标题: 帮我做个伤害的脚本 [打印本页]

作者: pudding    时间: 2009-11-8 13:26
标题: 帮我做个伤害的脚本
本帖最后由 pudding 于 2009-11-12 20:26 编辑


第1行为敌人受害的显示
第2行为 恢复生命的显示
第4行为 角色受伤的显示
作者: well    时间: 2009-11-8 13:26
本帖最后由 well 于 2009-11-14 14:21 编辑

我试过了,用你18楼的伤害图片。负数为miss图,正数为第4行。
如果正数伤害不显示。我只能猜测是因为素材只有3行。
作者: 九夜神尊    时间: 2009-11-8 15:42
话说这个我也使用过,不过近来隐归山林
LZ要的这个效果,可以直接改你目前使用的伤害值脚本

话说,现成的就是这样的!
作者: Eienshinken    时间: 2009-11-9 01:02
本帖最后由 Eienshinken 于 2009-11-9 01:08 编辑

这不是我写的脚本,是用SailCat大大的伤害美化脚本改的
  1. #==============================================================================
  2. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  3. #==============================================================================
  4. # ============================================================================
  5. # 伤害效果美化 v1.0 by SailCat
  6. # ============================================================================
  7. # 脚本使用说明:
  8. # 1.使用时需要将Damage.png复制到你的游戏的Graphics/Pictures目录下
  9. # 2.Damage.png文件的格式:
  10. #   大小为180 x 96
  11. #   (0, 0) - (179, 31)为伤害值的数字表,其中每个数字宽18,高32
  12. #   (0, 32) - (179, 63)为回复值(伤害负值)的数字表,其中每个数字宽18,高32
  13. #   (0, 64) - (89, 95)为会心一击标记的图画,长宽为90 x 32
  14. #   (90, 64) - (179, 95)为未命中标记的图画,长宽为90 x 32
  15. # ============================================================================
  16. module RPG
  17.   class Sprite < ::Sprite
  18.     #--------------------------------------------------------------------------
  19.     # ● 伤害值描画
  20.     #--------------------------------------------------------------------------
  21.     def damage(value, critical)
  22.       # 释放伤害
  23.       dispose_damage
  24.       # 如果伤害值是数值
  25.       if value.is_a?(Numeric)
  26.         # 绝对值转为字符串
  27.         damage_string = value.abs.to_s
  28.       else
  29.         # 转为字符串
  30.         damage_string = value.to_s
  31.       end
  32.       # 初始化位图
  33.       bitmap = Bitmap.new(180, 128)
  34.       bitmap.font.name = "Arial Black"
  35.       bitmap.font.size = 32
  36.       # 伤害值是数值的情况下
  37.       if value.is_a?(Numeric)
  38.         # 分割伤害值字符串
  39.         damage_array = damage_string.scan(/./)
  40.         damage_x = 81 - damage_string.size * 9
  41.         # 伤害值为负的情况下
  42.         if value < 0
  43.           # 调用回复数字表
  44.           rect_y = 32
  45.         else
  46.           # 调用伤害数字表
  47.           rect_y = 0
  48.         end
  49.         # 循环伤害值字符串
  50.         for char in damage_array
  51.           number = char.to_i
  52.           # 显示伤害数字
  53.           unless @battler.is_a?(Game_Enemy)
  54.             bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  55.             Rect.new(number * 18, rect_y+32*3, 18, 32))
  56.           else
  57.           bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  58.             Rect.new(number * 18, rect_y, 18, 32))
  59.           end
  60.           # 后移一位
  61.           damage_x += 18
  62.         end
  63.       # 伤害值不是数值的情况
  64.       else
  65.         # 如果伤害值不是 Miss
  66.         unless value == "Miss"
  67.           # 系统默认描画字符串
  68.           bitmap.font.color.set(0, 0, 0)
  69.           bitmap.draw_text(-1, 27, 162, 36, damage_string, 1)
  70.           bitmap.draw_text(+1, 27, 162, 36, damage_string, 1)
  71.           bitmap.draw_text(-1, 29, 162, 36, damage_string, 1)
  72.           bitmap.draw_text(+1, 29, 162, 36, damage_string, 1)
  73.           bitmap.font.color.set(255, 255, 255)
  74.           bitmap.draw_text(0, 28, 162, 36, damage_string, 1)
  75.         # Miss 的情况下
  76.         else
  77.           # 显示未击中图画
  78.           bitmap.blt(36, 28, RPG::Cache.picture("Damage"), Rect.new(90, 64, 90, 32))
  79.         end
  80.       end
  81.       # 会心一击标志打开的情况
  82.       if critical
  83.         # 显示会心一击图画
  84.         bitmap.blt(36, 0, RPG::Cache.picture("Damage"), Rect.new(0, 64, 90, 32))
  85.       end
  86.       # 伤害值定位
  87.       @_damage_sprite = ::Sprite.new(self.viewport)
  88.       @_damage_sprite.bitmap = bitmap
  89.       @_damage_sprite.ox = 81
  90.       @_damage_sprite.oy = 20
  91.       @_damage_sprite.x = self.x
  92.       @_damage_sprite.y = self.y - self.oy / 2
  93.       @_damage_sprite.z = 3000
  94.       @_damage_duration = 40
  95.     end
  96.   end
  97. end
  98. #==============================================================================
  99. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  100. #==============================================================================
复制代码

作者: pudding    时间: 2009-11-9 01:04
这不是我写的脚本,是用SailCat大大的伤害美化脚本改的.#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#================== ...
Eienshinken 发表于 2009-11-9 01:02


这个伤害的图片 是怎么样子的??
作者: Eienshinken    时间: 2009-11-9 01:05
本帖最后由 Eienshinken 于 2009-11-9 01:09 编辑

可能太长了脚本..  我把他空白的地方删掉看
修改了.看看显示了吗?
对了..LZ要是回合战斗的伤害显示么- - ???这个是回合的..
如果是地图显示伤害的话.这个貌似用不了
作者: pudding    时间: 2009-11-9 01:10
5# Eienshinken

地图显示的
作者: Eienshinken    时间: 2009-11-9 01:11
那你现在使用的地图脚本能否提供一下.我试改看
作者: pudding    时间: 2009-11-9 01:12
本帖最后由 pudding 于 2009-11-9 01:14 编辑

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
#
# 使用方法:
#
# ★、对角色显示伤害,如下3步:
#
# 1、设置伤害内容:$game_player.damage = 数值
#    注意:如果数值是负数,就变成补血的颜色了。
#
# 2、设置是否会心一击:$game_player.critical = true/false
#    如果不是会心一击,就不用这一步了
#
# 3、释放伤害:$game_player.damage_pop = true
#
#
# ★、对普通NPC和事件进行伤害,类似的3步:
#
# 1、设置伤害内容:$game_map.events[事件编号].damage = 数值
#
# 2、设置是否会心一击:$game_map.events[事件编号].critical = true/false
#
# 3、释放伤害:$game_map.events[事件编号].damage_pop = true
#
# 注意,事件编号是事件的ID号,如果目标是“本事件”,那么在事件编号输入@event_id
#
#------------------------------------------------------------------------------
# 预祝有人能早日做出华丽的ARPG来,别忘了到网站发布哦~
#------------------------------------------------------------------------------
class Sprite_Character < RPG::Sprite
  alias carol3_66RPG_damage_pop_update update
  def update
    carol3_66RPG_damage_pop_update
    if @character.damage_pop
      damage(@character.damage, @character.critical)
      @character.damage = nil
      @character.critical = false
      @character.damage_pop = false
    end
  end  
end
class Game_Character
  attr_accessor :damage_pop
  attr_accessor :damage
  attr_accessor :critical
  alias carol3_66RPG_damage_pop_initialize initialize
  def initialize
    @damage_pop = false
    @damage = 0
    @critical = false
    carol3_66RPG_damage_pop_initialize
  end
end

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================




    睡了...明天上来  希望你做好了
作者: Eienshinken    时间: 2009-11-9 01:17
本帖最后由 Eienshinken 于 2009-11-9 05:31 编辑

原本的那个脚本改成显示图片掉血的倒是不难.但是要在行走图上显示不同的伤害数值,我试了蛮久 想不出应该用什么方法让共用的伤害参数分开使用..负数与正数能分别显示颜色,应该就是从那个地方下手修改- -
但是找了很久也不知道该用什么变量来判断改变人物掉血的颜色..

抱歉,帮不上忙.
作者: well    时间: 2009-11-9 08:11
测试了一下。伤害值美化脚本貌似可以配合LZ的地图显示伤害。
LZ的图片需要去底就是了。规格正符合脚本要求
伤害显示部分53~59行改为如下:

  1.           unless critical
  2.             bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  3.             Rect.new(number * 18, rect_y, 18, 32))            
  4.           else
  5.             bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  6.             Rect.new(number * 18, rect_y+32*3, 18, 32))
  7.           end
复制代码
就有了测试的效果。

sample1.JPG (2.97 KB, 下载次数: 16)

sample1.JPG

sample2.JPG (3.53 KB, 下载次数: 19)

sample2.JPG

sample3.JPG (4.94 KB, 下载次数: 14)

sample3.JPG

作者: pudding    时间: 2009-11-9 12:31
测试了一下。伤害值美化脚本貌似可以配合LZ的地图显示伤害。
LZ的图片需要去底就是了。规格正符合脚本要求
伤害显示部分53~59行改为如下:
          unless critical
            bitmap.blt(damage_x, 32, RPG::C ...
well 发表于 2009-11-9 08:11


53~59行??
不准确...请把脚本发出来...脚本最多57行
作者: well    时间: 2009-11-9 12:39
我指的是3楼发的伤害值美化脚本。
作者: pudding    时间: 2009-11-9 13:00

伤害会跟着角色移动...而且角色受伤的那行也不是我想要的那种效果..没改变
作者: well    时间: 2009-11-9 15:11
本帖最后由 well 于 2009-11-9 16:44 编辑

13# pudding
关于角色受伤字符的行数,是我没仔细看LZ的帖。

  1. # 显示伤害数字
  2.        unless @battler.is_a?(Game_Actor)||critical
  3.             bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  4.             Rect.new(number * 18, rect_y, 18, 32))            
  5.           else
  6.             bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  7.             Rect.new(number * 18, rect_y+32*3, 18, 32))
  8.           end
复制代码
至于伤害数字跟随角色。搜索一番后得出代码如下
  1.     def update
  2.       if @_damage_duration > 0
  3.         @_damage_duration -= 1
  4.         @_damage_sprite.x = self.x
  5.         case @_damage_duration
  6.         when 38..39
  7.           @_damage_sprite.y -= 4
  8.         when 36..37
  9.           @_damage_sprite.y -= 2
  10.         when 34..35
  11.           @_damage_sprite.y += 2
  12.         when 28..33
  13.           @_damage_sprite.y += 4
  14.         when 0..32
  15.           unless @_damage_sprite.y == self.y - self.oy/2
  16.             @_damage_sprite.y -= (@_damage_sprite.y - self.y + self.oy/2)/8
  17.           end
  18.         end        
  19.         @_damage_sprite.opacity = 256 - (12 - @_damage_duration) * 32
  20.         if @_damage_duration == 0
  21.           dispose_damage
  22.         end
  23.       end
  24.     end
复制代码
这段加到伤害美化脚本的class Sprite里。when 28..39都是照抄帮助文件。
看起来勉强算是跟随角色吧。
作者: pudding    时间: 2009-11-9 17:42
并没有显示红色那行...还是原来样子...比地图显示伤害的那个脚本还要差
作者: Eienshinken    时间: 2009-11-9 17:51
貌似同时显示伤害数值的话,伤害数值的显示图片就不会分开吧
作者: well    时间: 2009-11-9 17:54
15# pudding
呃,这个是要配合地图显示伤害脚本的……,地图显示伤害脚本区分角色还是怪物受伤害,伤害值美化……顾名思义就是伤害美化……
作者: pudding    时间: 2009-11-9 18:12
本帖最后由 pudding 于 2009-11-9 18:24 编辑
15# pudding
呃,这个是要配合地图显示伤害脚本的……,地图显示伤害脚本区分角色还是怪物受伤害,伤害值美化……顾名思义就是伤害美化……
well 发表于 2009-11-9 17:54


..我并不是想要美化...我要的是角色受伤显示为第4行 ..美化只需要改张图吧!不需要用到脚本
作者: well    时间: 2009-11-9 20:09
本帖最后由 well 于 2009-11-9 20:12 编辑

18# pudding
……
首先,美化除了改图之外,你需要伤害美化脚本来显示图片上美化的数字。
其次,角色受到伤害显示数字为图片第四行的效果,对吗?
之前的尝试都失败了。下面还是引入开关。
还是那段脚本,53~59行

  1. # 显示伤害数字
  2. if $game_switches[10] == true
  3.   bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  4.   Rect.new(number * 18, rect_y+32*3, 18, 32))        
  5. else
  6.    bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  7.    Rect.new(number * 18, rect_y, 18, 32))
  8. end
复制代码
然后地图伤害脚本下面这一段里加一句

  1. if @character.damage_pop
  2.   damage(@character.damage, @character.critical)
  3.   @character.damage = nil
  4.   @character.critical = false
  5.   @character.damage_pop = false
  6.   $game_switches[10] = false #加入这一行,为了复位。
  7. end
复制代码
需要显示第四行字体效果的时候,加入一行打开10号开关的语句 $game_switches[10] = true 或者事件指令打开开关。因为有上面那一句。会自动关闭。
作者: pudding    时间: 2009-11-9 21:07
if @character.damage_pop

  damage(@character.damage, @character.critical)

  @character.damage = nil

  @character.critical = false

  @character.damage_pop = false

  $game_switches[10] = false #加入这一行,为了复位。

end
加在哪个位置?
class Sprite_Character < RPG::Sprite
  alias carol3_66RPG_damage_pop_update update
  def update
    carol3_66RPG_damage_pop_update
    if @character.damage_pop
      damage(@character.damage, @character.critical)
      @character.damage = nil
      @character.critical = false
      @character.damage_pop = false
    end
  end  
end
class Game_Character
  attr_accessor :damage_pop
  attr_accessor :damage
  attr_accessor :critical
  alias carol3_66RPG_damage_pop_initialize initialize
  def initialize
    @damage_pop = false
    @damage = 0
    @critical = false
    carol3_66RPG_damage_pop_initialize
  end
end
帮我加进去吧!
作者: well    时间: 2009-11-9 21:20
本帖最后由 well 于 2009-11-9 21:21 编辑
加在哪个位置?
class Sprite_Character < RPG::Sprite
  alias carol3_66RPG_damage_pop_update update
  def update
    carol3_66RPG_damage_pop_update
    if @character.damage_pop
      damage(@character.damage, @character.critical)
      @character.damage = nil
      @character.critical = false
      @character.damage_pop = false
      $game_switches[10] = false #加这里
    end
  end  
...
pudding 发表于 2009-11-9 21:07

其实不加也无所谓,在显示伤害前把开关关上就是。
作者: pudding    时间: 2009-11-9 21:25
其实不加也无所谓,在显示伤害前把开关关上就是。
well 发表于 2009-11-9 21:20

你测试过的吗?有错误额...
作者: well    时间: 2009-11-9 21:31
本帖最后由 well 于 2009-11-9 21:32 编辑

我没测试不加复位开关的情况,请问错误提示是?
作者: pudding    时间: 2009-11-9 21:35
本帖最后由 pudding 于 2009-11-9 21:36 编辑



但是 58行却是这样  

作者: well    时间: 2009-11-9 22:06
24# pudding
,少end。
算了,我把脚本完整贴一遍吧,我测试显示是正常的。
  1. # ============================================================================
  2. # 伤害效果美化 v1.0 by SailCat
  3. # 整合 地图伤害 by carol3
  4. #============================================================================
  5. # 脚本使用说明:
  6. # 1.使用时需要将Damage.png复制到你的游戏的Graphics/Pictures目录下
  7. # 2.Damage.png文件的格式:
  8. #   大小为180 x 96
  9. #   (0, 0) - (179, 31)为伤害值的数字表,其中每个数字宽18,高32
  10. #   (0, 32) - (179, 63)为回复值(伤害负值)的数字表,其中每个数字宽18,高32
  11. #   (0, 64) - (89, 95)为会心一击标记的图画,长宽为90 x 32
  12. #   (90, 64) - (179, 95)为未命中标记的图画,长宽为90 x 32
  13. # ============================================================================
  14. # 伤害显示方法:
  15. # ★、对角色显示伤害:
  16. # 脚本:
  17. # $game_switches[10] = true #图片第4行效果,此时负数无效
  18. # $game_player.damage = 数值 #负数效果为图片第2行,若为负值,省略第一行。
  19. # $game_player.critical = true #会心一击,false则省略此行
  20. # $game_player.damage_pop = true
  21. #
  22. # ★、对普通NPC和事件进行伤害:
  23. # 脚本:
  24. # $game_map.events[事件编号].damage = 数值 #负数效果为图片第2行
  25. # $game_map.events[事件编号].critical = true/false #会心一击
  26. # $game_map.events[事件编号].damage_pop = true
  27. #
  28. # 注意,事件编号是事件的ID号,如果目标是“本事件”,那么在事件编号输入@event_id
  29. #
  30. # ============================================================================
  31. module RPG
  32.   class Sprite < ::Sprite
  33.     #--------------------------------------------------------------------------
  34.     # ● 伤害值描画
  35.     #--------------------------------------------------------------------------
  36.     def damage(value, critical)
  37.       # 释放伤害
  38.       dispose_damage
  39.       # 如果伤害值是数值
  40.       if value.is_a?(Numeric)
  41.         # 绝对值转为字符串
  42.         damage_string = value.abs.to_s
  43.       else
  44.         # 转为字符串
  45.         damage_string = value.to_s
  46.       end
  47.       # 初始化位图
  48.       bitmap = Bitmap.new(180, 128)
  49.       bitmap.font.name = "Arial Black"
  50.       bitmap.font.size = 32
  51.       # 伤害值是数值的情况下
  52.       if value.is_a?(Numeric)
  53.         # 分割伤害值字符串
  54.         damage_array = damage_string.scan(/./)
  55.         damage_x = 81 - damage_string.size * 9
  56.         # 伤害值为负的情况下
  57.         if value < 0
  58.           # 调用回复数字表
  59.           rect_y = 32
  60.         else
  61.           # 调用伤害数字表
  62.           rect_y = 0
  63.         end
  64.         # 循环伤害值字符串
  65.         for char in damage_array
  66.           number = char.to_i
  67.           # 显示伤害数字
  68.           if $game_switches[10] == true
  69.             bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  70.             Rect.new(number * 18, rect_y+32*3, 18, 32))        
  71.           else
  72.             bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  73.             Rect.new(number * 18, rect_y, 18, 32))
  74.           end
  75.           # 后移一位
  76.           damage_x += 18
  77.         end
  78.       # 伤害值不是数值的情况
  79.       else
  80.         # 如果伤害值不是 Miss
  81.         unless value == "Miss"
  82.           # 系统默认描画字符串
  83.           bitmap.font.color.set(0, 0, 0)
  84.           bitmap.draw_text(-1, 27, 162, 36, damage_string, 1)
  85.           bitmap.draw_text(+1, 27, 162, 36, damage_string, 1)
  86.           bitmap.draw_text(-1, 29, 162, 36, damage_string, 1)
  87.           bitmap.draw_text(+1, 29, 162, 36, damage_string, 1)
  88.           bitmap.font.color.set(255, 255, 255)
  89.           bitmap.draw_text(0, 28, 162, 36, damage_string, 1)
  90.         # Miss 的情况下
  91.         else
  92.           # 显示未击中图画
  93.           bitmap.blt(36, 28, RPG::Cache.picture("Damage"), Rect.new(90, 64, 90, 32))
  94.         end
  95.       end
  96.       # 会心一击标志打开的情况
  97.       if critical
  98.         # 显示会心一击图画
  99.         bitmap.blt(36, 0, RPG::Cache.picture("Damage"), Rect.new(0, 64, 90, 32))
  100.       end
  101.       # 伤害值定位
  102.       @_damage_sprite = ::Sprite.new(self.viewport)
  103.       @_damage_sprite.bitmap = bitmap
  104.       @_damage_sprite.ox = 81
  105.       @_damage_sprite.oy = 20
  106.       @_damage_sprite.x = self.x
  107.       @_damage_sprite.y = self.y - self.oy
  108.       @_damage_sprite.z = 3000
  109.       @_damage_duration = 40      
  110.     end
  111. #=================整合地图伤害==============================================
  112.     alias carol3_66RPG_damage_pop_update update
  113.     def update
  114.       carol3_66RPG_damage_pop_update
  115.       if @character.damage_pop
  116.         damage(@character.damage, @character.critical)
  117.         @character.damage = nil
  118.         @character.critical = false
  119.         @character.damage_pop = false
  120. #=================开关复位===================================================
  121.         $game_switches[10] = false
  122. #============================================================================
  123.       end
  124. #=================伤害跟随角色===============================================
  125.       if @_damage_duration > 0
  126.         @_damage_sprite.x = self.x
  127.         case @_damage_duration
  128.         when 0..32
  129.           unless @_damage_sprite.y == self.y - self.oy
  130.             @_damage_sprite.y -= (@_damage_sprite.y - self.y + self.oy)/8
  131.           end
  132.         end        
  133.       end
  134. #============================================================================
  135.     end   
  136.   end  
  137. end
  138. #=================整合地图伤害===============================================
  139. class Game_Character
  140.   attr_accessor :damage_pop
  141.   attr_accessor :damage
  142.   attr_accessor :critical
  143.   alias carol3_66RPG_damage_pop_initialize initialize
  144.   def initialize
  145.     @damage_pop = false
  146.     @damage = 0
  147.     @critical = false
  148.     carol3_66RPG_damage_pop_initialize
  149.   end
  150. end
  151. #==============================================================================
  152. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  153. #==============================================================================
复制代码

作者: pudding    时间: 2009-11-9 22:10
本帖最后由 pudding 于 2009-11-9 22:13 编辑

  怎么还不是角色受伤显示第4行的...而且伤害N久才消失..角色移动它也跟着移动

把$game_player.damage_pop = true 换了  $game_switches[10] = true 后
角色受伤并没有显示伤害...   请认真测试过...

未命名.PNG (7.52 KB, 下载次数: 13)

未命名.PNG

作者: well    时间: 2009-11-9 22:54
26# pudding

好吧,我不能说别人理解力差,只好说自己表述有问题了。
我有表达过把$game_player.damage_pop = true 替换 $game_switches[10] = true
这样的意思吗?
下面是写在事件里的伤害显示脚本
角色普通伤害(4行)

  1. $game_switches[10] = true
  2. $game_player.damage = 正数
  3. $game_player.damage_pop = true
复制代码
角色恢复

  1. $game_player.damage = 负数
  2. $game_player.damage_pop = true
复制代码
角色会心一击

  1. $game_switches[10] = true     #希望伤害数字为4行效果则加上此行
  2. $game_player.damage = 正数
  3. $game_player.critical = true
  4. $game_player.damage_pop = true
复制代码
伤害显示时间改 @_damage_duration = 40 的数值。还有运动轨迹都是系统默认,有需要在update里面改。参考14楼。
我已经搞不清你要伤害跟随角色还是不跟随。不要的跟随的话把我标注的那段删除即可。
作者: pudding    时间: 2009-11-9 23:05
本帖最后由 pudding 于 2009-11-9 23:08 编辑

我已经搞不清你要伤害跟随角色还是不跟随。不要的跟随的话把我标注的那段删除即可。


伤害的消失 请做成我签名的那样 向上 慢慢 消失
作者: well    时间: 2009-11-9 23:28
28# pudding
25楼109行 @_damage_duration = 30

  1. #=================伤害跟随角色===============================================
  2.       if @_damage_duration > 0
  3.         @_damage_sprite.x = self.x
  4.         @_damage_sprite.y -= 2   
  5.         @_damage_sprite.opacity = @_damage_duration * 6 + 50
  6.       end
  7. #============================================================================
复制代码

作者: pudding    时间: 2009-11-9 23:38
本帖最后由 pudding 于 2009-11-9 23:58 编辑



你看看...还是随着角色移动 而且 有时候角色受伤 变成蓝色  应该是红色的
伤害跳上去 又跳下来 定着  和我签名的相比....


睡觉了...明天中午在上来看看
作者: Eienshinken    时间: 2009-11-10 00:23
# 显示伤害数字
          if $game_switches[10] == true
            bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
            Rect.new(number * 18, rect_y+32*3, 18, 32))        
          else
            bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
            Rect.new(number * 18, rect_y, 18, 32))
          end

这样判定的话 .当开关打开后 不管是敌人还是角色 都会变为这个伤害图片的颜色..
其实和我遇到的问题差不多. 如果判定角色与敌人同时受伤,那么敌人的伤害也会变成这个颜色.
就因为这个关系 ,寻找很久都没想到有什么方法能解决.
不同时受伤时显示不同颜色的伤害图片就会没问题.
作者: well    时间: 2009-11-10 09:55
本帖最后由 well 于 2009-11-10 09:58 编辑

  1. # ============================================================================
  2. # 伤害效果美化 v1.0 by SailCat
  3. # ============================================================================
  4. # 脚本使用说明:
  5. # 1.使用时需要将Damage.png复制到你的游戏的Graphics/Pictures目录下
  6. # 2.Damage.png文件的格式:
  7. #   大小为180 x 96
  8. #   (0, 0) - (179, 31)为伤害值的数字表,其中每个数字宽18,高32
  9. #   (0, 32) - (179, 63)为回复值(伤害负值)的数字表,其中每个数字宽18,高32
  10. #   (0, 64) - (89, 95)为会心一击标记的图画,长宽为90 x 32
  11. #   (90, 64) - (179, 95)为未命中标记的图画,长宽为90 x 32
  12. # ============================================================================
  13. # 使用方法:
  14. #
  15. # ★、对角色显示伤害:默认显示第4行
  16. # 脚本:
  17. # $game_player.damage = 数值 #负数效果为图片第2行
  18. # $game_player.critical = true #会心一击,false则省略此行
  19. # $game_player.damage_pop = true
  20. #
  21. # ★、对普通NPC和事件进行伤害:默认显示第1行
  22. # 脚本:
  23. # $game_map.events[事件编号].damage = 数值 #负数效果为图片第2行
  24. # $game_map.events[事件编号].critical = true/false #会心一击,false则省略此行
  25. # $game_map.events[事件编号].damage_pop = true
  26. #
  27. # 注意,事件编号是事件的ID号,如果目标是“本事件”,那么在事件编号输入@event_id
  28. #
  29. # ============================================================================
  30. module RPG
  31.   class Sprite < ::Sprite
  32.     #--------------------------------------------------------------------------
  33.     # ● 伤害值描画
  34.     #--------------------------------------------------------------------------
  35.     def damage(value, critical)
  36.       # 释放伤害
  37.       dispose_damage
  38.       # 如果伤害值是数值
  39.       if value.is_a?(Numeric)
  40.         # 绝对值转为字符串
  41.         damage_string = value.abs.to_s
  42.       else
  43.         # 转为字符串
  44.         damage_string = value.to_s
  45.       end
  46.       # 初始化位图
  47.       bitmap = Bitmap.new(180, 128)
  48.       bitmap.font.name = "Arial Black"
  49.       bitmap.font.size = 32
  50.       # 伤害值是数值的情况下
  51.       if value.is_a?(Numeric)
  52.         # 分割伤害值字符串
  53.         damage_array = damage_string.scan(/./)
  54.         damage_x = 81 - damage_string.size * 9        
  55.         # 循环伤害值字符串
  56.         for char in damage_array
  57.           # 伤害值为负的情况下
  58.           if value < 0
  59.             # 调用回复数字表
  60.             rect_y = 32
  61.           else
  62.             # 调用伤害数字表
  63.             rect_y = 0
  64.           end
  65.           number = char.to_i
  66.           # 显示伤害数字
  67.           if @character.is_a?(Game_Player) && value > 0     
  68.             bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  69.             Rect.new(number * 18, 32*3, 18, 32))        
  70.           else
  71.             bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  72.             Rect.new(number * 18, rect_y, 18, 32))
  73.           end
  74.           # 后移一位
  75.           damage_x += 18
  76.         end
  77.       # 伤害值不是数值的情况
  78.       else
  79.         # 如果伤害值不是 Miss
  80.         unless value == "Miss"
  81.           # 系统默认描画字符串
  82.           bitmap.font.color.set(0, 0, 0)
  83.           bitmap.draw_text(-1, 27, 162, 36, damage_string, 1)
  84.           bitmap.draw_text(+1, 27, 162, 36, damage_string, 1)
  85.           bitmap.draw_text(-1, 29, 162, 36, damage_string, 1)
  86.           bitmap.draw_text(+1, 29, 162, 36, damage_string, 1)
  87.           bitmap.font.color.set(255, 255, 255)
  88.           bitmap.draw_text(0, 28, 162, 36, damage_string, 1)
  89.         # Miss 的情况下
  90.         else
  91.           # 显示未击中图画
  92.           bitmap.blt(36, 28, RPG::Cache.picture("Damage"), Rect.new(90, 64, 90, 32))
  93.         end
  94.       end
  95.       # 会心一击标志打开的情况
  96.       if critical
  97.         # 显示会心一击图画
  98.         bitmap.blt(36, 0, RPG::Cache.picture("Damage"), Rect.new(0, 64, 90, 32))
  99.       end
  100.       # 伤害值定位
  101.       @_damage_sprite = ::Sprite.new(self.viewport)
  102.       @_damage_sprite.bitmap = bitmap
  103.       @_damage_sprite.ox = 81
  104.       @_damage_sprite.oy = 20
  105.       @_damage_sprite.x = self.x
  106.       @_damage_sprite.y = self.y - self.oy
  107.       @_damage_sprite.z = 3000
  108.       @_damage_duration = 30      
  109.     end
  110. #=================整合地图伤害==============================================
  111.     alias carol3_66RPG_damage_pop_update update
  112.     def update
  113.       carol3_66RPG_damage_pop_update
  114.       if @character.damage_pop
  115.         if @can_be_hurt
  116.           @can_be_hurt = false
  117.           damage(@character.damage, @character.critical)
  118.         end
  119.         @character.damage = nil
  120.         @character.critical = false
  121.         @character.damage_pop = false  
  122.       end
  123. #=================伤害跟随角色===============================================
  124.       if @_damage_duration > 0
  125.         @_damage_sprite.x = self.x
  126.         @_damage_sprite.y -= 2
  127.         @_damage_sprite.opacity = @_damage_duration * 8 + 10
  128.       end      
  129.       if @_damage_duration == 0
  130.         dispose_damage
  131.         @can_be_hurt = true
  132.       end      
  133. #============================================================================
  134.     end   
  135.   end  
  136. end
  137. #=================整合地图伤害===============================================
  138. class Game_Character
  139.   attr_accessor :damage_pop
  140.   attr_accessor :damage
  141.   attr_accessor :critical
  142.   alias carol3_66RPG_damage_pop_initialize initialize
  143.   def initialize
  144.     @damage_pop = false
  145.     @damage = 0
  146.     @critical = false
  147.     carol3_66RPG_damage_pop_initialize
  148.   end
  149. end
  150. #==============================================================================
  151. # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息
  152. #==============================================================================
复制代码
30# pudding
重新写过,请继续测试。
关于跳上跳下,是因为攻击频率过于密集,所以@_damage_sprite.y不停地重定位。现在用的办法是@can_be_hurt控制,使上一次伤害前消失不发生下一次伤害。效果么……感觉跳的情况得到缓解,为什么只是缓解……{:4_83:}
31# Eienshinken
嗯,感觉自己进入了无限死循环似的。之前用@character.is_a?(Game_Player)判断,不报错但无效果。所以用了开关,现在看起来,尽管伤害发生后立刻让开关复位,总是存在时间差。所以改回用@character判断,好像有效……所以之前大概是我拼写错误或是大小写有问题?但为什么不报错呢???
作者: pudding    时间: 2009-11-10 12:19
本帖最后由 pudding 于 2009-11-10 17:59 编辑

32# well

把的脚本负数 改成 显示的都是MISS...并不增加生命

想个其他办法,使用物品恢复生命,地图显示恢复生命的那行   增加100点生命 就显示 100点生命(这个可以不设置...如果可以帮我做)

未命名.PNG (10.19 KB, 下载次数: 21)

未命名.PNG

作者: pudding    时间: 2009-11-10 19:55
帮我做好后,可以另加VIP...
作者: well    时间: 2009-11-11 09:33
32# well

把的脚本负数 改成 显示的都是MISS...并不增加生命

想个其他办法,使用物品恢复生命,地图显示恢复生命的那行   增加100点生命 就显示 100点生命(这个可以不设置...如果可以帮我做) ...
pudding 发表于 2009-11-10 12:19

……我看不懂。
是说现在负数显示不出来?
还是,现在有效果,希望改成负值无效……那,你不用负值不就行了。
然后是使用恢复品时,希望用美化数字显示是吧。会考虑的,不过不要对我这低手期待太多。
作者: pudding    时间: 2009-11-11 12:17
……我看不懂。
是说现在负数显示不出来?
还是,现在有效果,希望改成负值无效……那,你不用负值不就行了。
然后是使用恢复品时,希望用美化数字显示是吧。会考虑的,不过不要对我这低手期待太多。 ...
well 发表于 2009-11-11 09:33


把负数改为显示..MISS
比如..当敌人的攻击为10 减 角色1级防御力5....那就显示伤害5吧!
那角色防御力会随着装备增加  敌人的攻击为 10  减角色 穿了装备的防御力 100  
那敌人打角色   角色就增加90点生命了....  改为显示 MISS 不增加生命
作者: summer92    时间: 2009-11-11 14:29
楼主很有爱啊
作者: 许诺言    时间: 2009-11-11 14:35
LZ还在找啊,真是太强大了
如果游戏出来,有试玩吗?
作者: pudding    时间: 2009-11-12 17:33
有点想放弃了...
作者: Eienshinken    时间: 2009-11-12 17:40
放弃什么. 总会有高手来的.
我在等待原理学习中....
作者: 许诺言    时间: 2009-11-12 17:56
表放弃啊
看LZ对这游戏的投入和认真到每个效果都要达到
就知道这游戏不会是“凡凡之辈”
作者: pudding    时间: 2009-11-12 18:07
{:4_83:} 这么淡..令我感觉这效果做不出来..
作者: well    时间: 2009-11-12 18:52
在Game_Battler 3第50行可以看到这一句: atk = [attacker.atk - self.pdef / 2, 0].max
计算基本伤害的时候,如果攻击减防御的结果小于0,将攻击视为0。我不知道你用什么公式计算伤害。也不知道这个计算写在哪儿。因为这个地图伤害脚本使用的方式是在事件中直接设置。以角色为例,就是
$game_player.damage =计算结果。
计算中或最后加入 计算结果 = [计算结果, 0].max,可以令伤害最小为0。那就无需担心会出现负值了。
或者在事件里写成这样:
$game_player.damage =(计算结果 >= 0 ? 计算结果 : "miss")

关于使用恢复品的问题。在默认脚本里跳来跳去找了半天,头都大了。
首先,如果是在物品界面选择物品使用的话,就没必要显示什么动画了。直接在地图上使用的话,不知道你用的是什么方法。比如快捷键?因为是Arpg,那么假设队伍为1人,就能省略对象是单人还是全体的判断。然后是物品无效的判断。比如物品是否可以在平时使用,数量是否为0 等,还有使用后物品数量要减少……这些都不是我需要解决的问题……
总之,物品有效。
角色的话,脚本如下。
$game_party.actors[0].item_effect($data_items[物品ID])
#下面是地图伤害那三句。第一句如下,剩下照旧。
$game_player.damage =$game_party.actors[0].damage
...
因为使用HP恢复物品的话,$game_party.actors[0].damage就是负值,那么就会换到图片第二行了。

作者: pudding    时间: 2009-11-12 20:14
本帖最后由 pudding 于 2009-11-12 20:26 编辑
在Game_Battler 3第50行可以看到这一句: atk = [attacker.atk - self.pdef / 2, 0].max
计算基本伤害的时候,如果攻击减防御的结果小于0,将攻击视为0。我不知道你用什么公式计算伤害。也不知道这个计算写在哪儿。 ...
well 发表于 2009-11-12 18:52


我就是用变量来控制攻击 防御的...
例如:$game_variables[170] == 敌人攻击
      $game_variables[101] == 角色防御
t = $game_variables[170] -= $game_variables[101]    #t = 敌人攻击 减 角色防御
$game_player.damage = t #这就个t 就是伤害值...未知数
$game_player.damage =(当 t<=0   显示: "miss")   这个该怎么写?
             增加悬赏了,加了1倍
作者: well    时间: 2009-11-12 22:14
本帖最后由 well 于 2009-11-12 22:16 编辑
我就是用变量来控制攻击 防御的...
例如:$game_variables[170] == 敌人攻击
      $game_variables[101] == 角色防御
t = $game_variables[170] -= $game_variables[101]    #t = 敌人攻击 减 角色防御
$game_pla ...
pudding 发表于 2009-11-12 20:14

1、t = [$game_variables[170] - $game_variables[101], 0].max
$game_player.damage = t
这样伤害最小为0,因为0是显示的,所以所有负值的情况都显示0

2、t = $game_variables[170] -= $game_variables[101]
$game_player.damage = (t >= 0 ? t : "miss")
因为你那张图片的miss部分空白,所以负值就什么也不显示。0还是显示的。
作者: pudding    时间: 2009-11-12 22:48
本帖最后由 pudding 于 2009-11-12 22:54 编辑
1、t = [$game_variables[170] - $game_variables[101], 0].max
$game_player.damage = t
这样伤害最小为0,因为0是显示的,所以所有负值的情况都显示0

2、t = $game_variables[170] -= $game_variables[101]
$g ...
well 发表于 2009-11-12 22:14

可以把显示0改为显示MISS吗?...   
睡了... 明天中午看看
作者: well    时间: 2009-11-12 23:32
46# pudding
……我不相信你不会改……
t = $game_variables[170] -= $game_variables[101]
$game_player.damage = (t > 0 ? t : "miss")
去掉一个符号的事情,
作者: pudding    时间: 2009-11-13 12:27
46# pudding
……我不相信你不会改……
t = $game_variables[170] -= $game_variables[101]
$game_player.damage = (t > 0 ? t : "miss")
去掉一个符号的事情,
well 发表于 2009-11-12 23:32


  我真的不会改额...  帮我吧   是什么令你觉得我会的呢?  我完全不会脚本的... 我是事件派
作者: well    时间: 2009-11-13 12:32

可是我不是已经改了么……在上一贴
t = $game_variables[170] -= $game_variables[101]
$game_player.damage = (t > 0 ? t : "miss")
大于等于改成大于,这样t=0也显示“miss”了……
作者: pudding    时间: 2009-11-13 12:37
本帖最后由 pudding 于 2009-11-13 12:44 编辑

可是我不是已经改了么……在上一贴
t = $game_variables[170] -= $game_variables[101]
$game_player.damage = (t > 0 ? t : "miss")
大于等于改成大于,这样t=0也显示“miss”了…… ...
well 发表于 2009-11-13 12:32

没显示额...只显示伤害

内容:
ag = $game_variables[51]  #敌人攻击
bf = $game_actors[1].pdef #角色防御
t = ag -= bf    # t = 敌人攻击 - 角色防御
$game_switches[10] = true
$game_player.damage = (t > 0 ? t : "miss")
$game_player.damage_pop = true
作者: well    时间: 2009-11-13 14:56
我测试没问题……
真是古怪至极。
首先确认脚本用的是32#的
开关10已经不使用了。
我测试的事件脚本在这里

  1. ag = $game_variables[51]
  2. bf = $game_actors[1].pdef
  3. t = ag -= bf
  4. $game_player.damage = (t > 0 ? t : "miss")
  5. $game_player.damage_pop = true
复制代码
另外,如果"miss"小写,就是系统描绘字符,如果是"Miss",就引用图片第三行右侧。

作者: pudding    时间: 2009-11-13 16:41
本帖最后由 pudding 于 2009-11-13 17:31 编辑

工程: 示范.rar (836.57 KB, 下载次数: 81)
作者: pudding    时间: 2009-11-13 17:39
本帖最后由 pudding 于 2009-11-13 17:47 编辑

把敌人攻击改为100  攻击角色显示的伤害是第1行...(并不是第3行)
把显示伤害的位置  移到人物头上显示
如果连续攻击的时候...像
这样多行显示..
作者: well    时间: 2009-11-13 23:18
本帖最后由 well 于 2009-11-13 23:19 编辑
把敌人攻击改为100  攻击角色显示的伤害是第1行...(并不是第3行)
把显示伤害的位置  移到人物头上显示
如果连续攻击的时候...像10804
这样多行显示.. ...
pudding 发表于 2009-11-13 17:39

我下了你的工程,然后……出离愤怒了
首先,我反复重复过用32#的脚本。但是你的工程里还是之前那个用10号开关的……
其次,你提供的两张伤害图片都是4行,因为照你的要求,敌人对角色的伤害要用第4行显示,所以之前我才费劲扒拉地来回改显示伤害数字那部分……但是你工程里的图片,居然是只有3行的……
最后,……给你脚本了吧,你也确实改了吧……拜托,你自己弄的分四个方向分歧,结果只改了一个方向的……
总之,我用你的工程改过了……你看看吧。
伤害数值出现位置已经调高了,如果要更高,自己改107行。
至于你希望出现的多个伤害数字重叠着出现嘛……我无能为力。

Data.rar

132.53 KB, 下载次数: 74


作者: pudding    时间: 2009-11-14 09:19
本帖最后由 pudding 于 2009-11-14 09:22 编辑
我下了你的工程,然后……出离愤怒了
首先,我反复重复过用32#的脚本。但是你的工程里还是之前那个用10号开关的……
其次,你提供的两张伤害图片都是4行,因为照你的要求,敌人对角色的伤害要用第4行显示 ...
well 发表于 2009-11-13 23:18


这不是我那个游戏.....只是临时做出来    忘记设置里面一些东西
...你试试 把敌人攻击设置成 50  然后测试   没有显示伤害?
作者: pudding    时间: 2009-11-15 18:36
没办法了...不能显示 多行   只好用回原来的那个了....
作者: well    时间: 2009-11-16 08:39
57# pudding
有点不能接受。这是用你那个示范工程改的。整个工程奉上……

示范.rar

374.24 KB, 下载次数: 92


作者: pudding    时间: 2009-11-16 12:25
...  你试试 被下面的那个打...然后按X键  看看你的生命    再被上面那个打  再按X键 看看生命
MISS 会加生命的.....
作者: well    时间: 2009-11-16 17:43
miss攻击的阿尔西斯事件里伤害部分脚本有这么一句
$game_actors[1].hp -= t  #角色生命-伤害值
改成
$game_actors[1].hp -= (t > 0 ? t : 0)
[line]1[/line]
你自己也加了注释在那里,虽然一直说不会脚本,可是这么一通折腾下来,这种程度的修改应该能作到吧……
好吧,是我没弄周全{:4_83:}
作者: pudding    时间: 2009-11-16 17:49
miss攻击的阿尔西斯事件里伤害部分脚本有这么一句
$game_actors[1].hp -= t  #角色生命-伤害值
改成
$game_actors[1].hp -= (t > 0 ? t : 0)
1
你自己也加了注释在那里,虽然一直说不会脚本,可是这么一通折腾下来, ...
well 发表于 2009-11-16 17:43


还是这样吖....你试试
作者: well    时间: 2009-11-16 18:14
本帖最后由 well 于 2009-11-16 18:16 编辑
……
……拜托,你自己弄的分四个方向分歧,结果只改了一个方向的……
……
well 发表于 2009-11-13 23:18

Map001.rar

2.65 KB, 下载次数: 93


作者: pudding    时间: 2009-11-16 21:52

well 发表于 2009-11-16 18:14

如果这脚本可以 显示一行伤害  然后接着 下一行伤害  
如:    
就能用了     为什么未修改之前的脚本 可以这样...修改后的脚本不可以这样?
作者: well    时间: 2009-11-17 08:40
这是照之前短消息里提到的帖子修改的。
感谢问问题的人。
感谢回答的紫苏。

Scripts.rar

130.76 KB, 下载次数: 113


作者: pudding    时间: 2009-11-17 12:27
太好了终于解决了...太感谢well 了...




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