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

Project1

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

[已经解决] 如何使damage方法能够顺次显示伤害?

 关闭 [复制链接]

Lv1.梦旅人

神之瞳

梦石
0
星屑
60
在线时间
5 小时
注册时间
2009-7-5
帖子
314
跳转到指定楼层
1
发表于 2009-11-17 00:01:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 上帝的眼睛 于 2009-11-17 00:02 编辑

RT
我用的是在地图上显示伤害
脚本如下
  1. #==============================================================================
  2. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  3. #==============================================================================
  4. #
  5. # 使用方法:
  6. #
  7. # ★、对角色显示伤害,如下3步:
  8. #
  9. # 1、设置伤害内容:$game_player.damage = 数值
  10. #    注意:如果数值是负数,就变成补血的颜色了。
  11. #
  12. # 2、设置是否会心一击:$game_player.critical = true/false
  13. #    如果不是会心一击,就不用这一步了
  14. #
  15. # 3、释放伤害:$game_player.damage_pop = true
  16. #
  17. #
  18. # ★、对普通NPC和事件进行伤害,类似的3步:
  19. #
  20. # 1、设置伤害内容:$game_map.events[事件编号].damage = 数值
  21. #
  22. # 2、设置是否会心一击:$game_map.events[事件编号].critical = true/false
  23. #
  24. # 3、释放伤害:$game_map.events[事件编号].damage_pop = true
  25. #
  26. # 注意,事件编号是事件的ID号,如果目标是“本事件”,那么在事件编号输入@event_id
  27. #
  28. #------------------------------------------------------------------------------
  29. # 预祝有人能早日做出华丽的ARPG来,别忘了到网站发布哦~
  30. #------------------------------------------------------------------------------
  31. class Sprite_Character < RPG::Sprite
  32.   alias carol3_66RPG_damage_pop_update update
  33.   def update
  34.     carol3_66RPG_damage_pop_update
  35.     if @character.damage_pop
  36.       damage(@character.damage, @character.critical)
  37.       @character.damage = nil
  38.       @character.critical = false
  39.       @character.damage_pop = false
  40.     end
  41.   end  
  42. end
  43. class Game_Character
  44.   attr_accessor :damage_pop
  45.   attr_accessor :damage
  46.   attr_accessor :critical
  47.   alias carol3_66RPG_damage_pop_initialize initialize
  48.   def initialize
  49.     @damage_pop = false
  50.     @damage = 0
  51.     @critical = false
  52.     carol3_66RPG_damage_pop_initialize
  53.   end
  54. end

  55. #==============================================================================
  56. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  57. #==============================================================================
复制代码
如果同时调用的话前面显示的伤害会被后面的覆盖而不显示
如何解决这个问题?

九月三日

  有时我真不理解,怎么有另一个人能够爱她,可以爱她,殊不知我爱她爱得如此真切,如此忘情,如此情意缱倦,除了她我什么也不了解,什么也不知道,什么也没有呀!
——摘自《少年维特之烦恼》

谨以 纪念一段消逝了的感情
ILY ZXY

NOIp什么的最讨厌了!

啊……讨厌,为什么我的网盘全部坏掉了……
zoomshare恢复了,虚惊一场
可恶的skydrive,我XX你的OO,竟把我的帐号封了!

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
2
发表于 2009-11-17 01:31:45 | 只看该作者
这个主要原因是 RPG::Sprite 中同时只会判断一个伤害动画的持续时间,而且当一个新的伤害显示时,旧的就会立刻被释放~解决方法是把伤害的精灵及其持续时间用一个容器组织起来,这样就可以同时存在多个伤害动画了,这个方法和以前的彩虹神剑所采用的方法基本相同……

注意红色部分是修改过的代码,灰色的是 RPG::Sprite 原本的内容:
module RPG
  class Sprite < ::Sprite
    def initialize(viewport = nil)
      super(viewport)
      @_whiten_duration = 0
      @_appear_duration = 0
      @_escape_duration = 0
      @_collapse_duration = 0
      #@_damage_duration = 0
      @_damage_sprites = {}
      @_animation_duration = 0
      @_blink = false
    end
    def dispose
      #dispose_damage
      @_damage_sprites.each_key { |key|
        dispose_damage(key)
      }

      dispose_animation
      dispose_loop_animation
      super
    end
    def damage(value, critical)
      #dispose_damage
      if value.is_a?(Numeric)
        damage_string = value.abs.to_s
      else
        damage_string = value.to_s
      end
      bitmap = Bitmap.new(160, 48)
      bitmap.font.name = "Arial Black"
      bitmap.font.size = 32
      bitmap.font.color.set(0, 0, 0)
      bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
      bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
      bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
      bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
      if value.is_a?(Numeric) and value < 0
        bitmap.font.color.set(176, 255, 144)
      else
        bitmap.font.color.set(255, 255, 255)
      end
      bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
      if critical
        bitmap.font.size = 20
        bitmap.font.color.set(0, 0, 0)
        bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
        bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
        bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
        bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
        bitmap.font.color.set(255, 255, 255)
        bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
      end
      #@_damage_sprites = ::Sprite.new(self.viewport)
      #@_damage_sprite.bitmap = bitmap
      #@_damage_sprite.ox = 80
      #@_damage_sprite.oy = 20
      #@_damage_sprite.x = self.x
      #@_damage_sprite.y = self.y - self.oy / 2
      #@_damage_sprite.z = 3000
      #@_damage_duration = 40

      _damage_sprite = ::Sprite.new(self.viewport)
      _damage_sprite.bitmap = bitmap
      _damage_sprite.ox = 80
      _damage_sprite.oy = 20
      _damage_sprite.x = self.x
      _damage_sprite.y = self.y - self.oy / 2
      _damage_sprite.z = 3000
      @_damage_sprites[_damage_sprite] = 40

    end
    def dispose_damage(_damage_sprite)
      #if @_damage_sprite != nil
      #  @_damage_sprite.bitmap.dispose
      #  @_damage_sprite.dispose
      #  @_damage_sprite = nil
      #  @_damage_duration = 0
      #end

      if @_damage_sprites[_damage_sprite]
        _damage_sprite.bitmap.dispose
        _damage_sprite.dispose
        @_damage_sprites.delete(_damage_sprite)
        _damage_sprite = nil
      end

    end
    def effect?
      @_whiten_duration > 0 or
      @_appear_duration > 0 or
      @_escape_duration > 0 or
      @_collapse_duration > 0 or
      #@_damage_duration > 0 or
      not @_damage_sprites.empty? or
      @_animation_duration > 0
    end
    def update
      super
      if @_whiten_duration > 0
        @_whiten_duration -= 1
        self.color.alpha = 128 - (16 - @_whiten_duration) * 10
      end
      if @_appear_duration > 0
        @_appear_duration -= 1
        self.opacity = (16 - @_appear_duration) * 16
      end
      if @_escape_duration > 0
        @_escape_duration -= 1
        self.opacity = 256 - (32 - @_escape_duration) * 10
      end
      if @_collapse_duration > 0
        @_collapse_duration -= 1
        self.opacity = 256 - (48 - @_collapse_duration) * 6
      end
      #if @_damage_duration > 0
      #  @_damage_duration -= 1
      #  case @_damage_duration
      #  when 38..39
      #    @_damage_sprite.y -= 4
      #  when 36..37
      #    @_damage_sprite.y -= 2
      #  when 34..35
      #    @_damage_sprite.y += 2
      #  when 28..33
      #    @_damage_sprite.y += 4
      #  end
      #  @_damage_sprite.opacity = 256 - (12 - @_damage_duration) * 32
      #  if @_damage_duration == 0
      #    dispose_damage
      #  end
      #end

      @_damage_sprites.each_pair { |key, val|
        if val > 0
          @_damage_sprites[key] -= 1
          case val - 1
          when 38..39
            key.y -= 4
          when 36..37
            key.y -= 2
          when 34..35
            key.y += 2
          when 28..33
            key.y += 4
          end
          key.opacity = 256 - (12 - val) * 32
          if val - 1 == 0
            dispose_damage(key)
          end
        end
      }

      if @_animation != nil and (Graphics.frame_count % 2 == 0)
        @_animation_duration -= 1
        update_animation
      end
      if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
        update_loop_animation
        @_loop_animation_index += 1
        @_loop_animation_index %= @_loop_animation.frame_max
      end
      if @_blink
        @_blink_count = (@_blink_count + 1) % 32
        if @_blink_count < 16
          alpha = (16 - @_blink_count) * 6
        else
          alpha = (@_blink_count - 16) * 6
        end
        self.color.set(255, 255, 255, alpha)
      end
      @@_animations.clear
    end
  end
end
回复 支持 反对

使用道具 举报

Lv1.梦旅人

神之瞳

梦石
0
星屑
60
在线时间
5 小时
注册时间
2009-7-5
帖子
314
3
 楼主| 发表于 2009-11-17 15:42:33 | 只看该作者
这样做在事件里用等待1帧可以实现这样的效果 ,可是在脚本如何实现呢?

九月三日

  有时我真不理解,怎么有另一个人能够爱她,可以爱她,殊不知我爱她爱得如此真切,如此忘情,如此情意缱倦,除了她我什么也不了解,什么也不知道,什么也没有呀!
——摘自《少年维特之烦恼》

谨以 纪念一段消逝了的感情
ILY ZXY

NOIp什么的最讨厌了!

啊……讨厌,为什么我的网盘全部坏掉了……
zoomshare恢复了,虚惊一场
可恶的skydrive,我XX你的OO,竟把我的帐号封了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-27 10:46

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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