RMXP

음;; 데미지표시스크립트입니다만.. 이 스크립트를 어떻게 손대야 할 지 모르겠습니다.

by Lighna posted Feb 13, 2012
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

class Damage < Sprite
  def initialize(x, y, dealt_damage = 0, viewport = Viewport.new(0,0,640,480))
    super(viewport)
    @_damage_duration = 0
    self.x = x
    self.y = y
    @damage = dealt_damage
    damage(@damage)
  end
   
  def dispose
    dispose_damage
    super
  end

  def damage(value)
    dispose_damage
    if value.is_a?(Numeric)
      damage_string = value.abs.to_s
    else
      damage_string = value.to_s
    end
        dispose_damage
        if $fsize==nil
          $fsize=0
        end
    bitmap = Bitmap.new(160, 48)
    bitmap.font.name = "휴먼아미체"
    bitmap.font.size = 20+$fsize
    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)#
    @_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 = 9001
    @_damage_duration = 20
    end

  def dispose_damage
    if @_damage_sprite != nil
      @_damage_sprite.bitmap.dispose
      @_damage_sprite.dispose
      @_damage_sprite = nil
      @_damage_duration = 0
    end
  end
  def update
    super
    if @_damage_duration > 0
      @_damage_duration -= 1
      case @_damage_duration
      when 18..19
        @_damage_sprite.y -= 4
        $fsize=10
     
      when 16..17
        @_damage_sprite.y -= 2
        $fsize=7
      when 14..15
        @_damage_sprite.y -= 2
        $fsize=4
      when 8..13
        @_damage_sprite.y -= 2
        $fsize=1
        end
      @_damage_sprite.opacity = 256 - (12 - @_damage_duration) * 32
      if @damage_duration == 0
        dispose
      end
    end
  end
end

 

class Scene_Map
  alias trickster_update update
  def update
    if $damage != nil
      if $damage.disposed?
        $damage = nil
      else
        $damage.update
      end
    end
    trickster_update
  end
end

 

class Interpreter
  def command_338
    # Get operate value
    value = operate_value(0, @parameters[2], @parameters[3])
    # Process with iterator
    iterate_battler(@parameters[0], @parameters[1]) do |battler|
      # If battler exists
      if battler.exist?
        # Change HP
        battler.hp -= value
        # If in battle
        if $game_temp.in_battle
          # Set damage
          battler.damage = value
          battler.damage_pop = true
        else
          if battler.is_a?(Game_Actor)
            x = $game_player.screen_x
            y = $game_player.screen_y
          else
            x = battler.screen_x
            y = battler.screen_y
          end
          viewport = Viewport.new(0,0,640,480)
          damage = value
          $damage = Damage.new(x,y,viewport,damage)
        end
      end
    end
    # Continue
    return true
  end
end

 

 

 

 

======================================================================

 

백호님께서 올려주신 데미지표시 스크립트이며 제가 처음 심플액알을 받았을 당시부터 같이 들어가 있었습니다.

문제는 이녀석이 평소에는 멀쩡하게 작동하다가 공격을 짧은 주기로 여러번 하게 되면 바보가 된다는 겁니다..

 

예를들어 공격을 한번 하면 x프레임동안 보인다음 사라진다고 가정했을 때,

한번 화면상에 출력 된 다음 x프레임이 지나기 전에 또다시 출력되면, 이전에 출력되던 녀석은 바로 멈춰버리고(사라지지도 않습니다.)

가장 최근에 출력된 데미지만 정상적으로 위로 올라가면서 사라집니다. . . . . ...............................

 

물론 @damage 이자식을 글로벌변수로 바꿔버릴수도 있겠지만,..... 위와같은 상황이 발생하였을 때,

이전에 출력되던 녀석들은 바로바로 날라가버리기때문에 눈으로 볼 수가 없습니다...

 

크.......... 너무 해매고있습니다. 어떻게 해야 할 지 정말 대첵이 안서는군요.. ㅍ....

헬프!! ㅠㅠ