Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Simple Damage Delay

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Simple Damage Delay

Mensaje por Wecoc el 2017-05-03, 12:28

Ví un pedido de ésto en otro foro y dije meh, voy a hacerlo xD Éste script modifica el modo en el que se muestran los números de daño.
Normalmente aparecen de golpe y hacen un "salto", moviéndose hacia arriba y luego hacia abajo, a la vez. Con éste script hacen el mismo salto pero uno por uno, con un efecto más de ola. A parte de eso va como siempre.

Es un modo bastante habitual de mostrar el daño en los RPG así que seguramente haya otro script muy parecido por ahí, pero no lo supe encontrar así que aquí está el mío. No requiere créditos. Por desgracia no es compatible con otros scripts que modifiquen el método damage de RPG::Sprite, entre ellos el Number Flood de Silvanash. Tendréis que adaptarlo si usáis varias modificaciones a la vez.

Código:
#==============================================================================
# ** [XP] Simple Damage Delay
#------------------------------------------------------------------------------
#  Autor: Wecoc (no requiere créditos)
#==============================================================================

module RPG
  class Sprite < ::Sprite
    #------------------------------------------------------------------------
    # * Damage
    #------------------------------------------------------------------------
    def damage(value, critical)
      dispose_damage
      @_damage_sprites = []
      if value.is_a?(Numeric)
        damage_string = value.abs.to_s
      else
        damage_string = value.to_s
      end
      # Value Sprites
      font_name = "Arial Black"
      font_size = 32
      bitmap = Bitmap.new(1, 1)
      bitmap.font.name = font_name
      bitmap.font.size = font_size
      damage_width = bitmap.text_size(damage_string).width
      for i in 0...damage_string.size
        sprite = ::Sprite.new(self.viewport)
        bitmap = Bitmap.new(1, 1)
        bitmap.font.name = font_name
        bitmap.font.size = font_size
        w = bitmap.text_size(damage_string[i].chr).width + 2
        h = bitmap.text_size(damage_string[i].chr).height + 2
        sprite.bitmap = Bitmap.new(w, h)
        sprite.bitmap.font.name = font_name
        sprite.bitmap.font.size = font_size
        sprite.bitmap.font.color.set(0, 0, 0)
        sprite.bitmap.draw_text(-1, -1, w, h, damage_string[i].chr, 1)
        sprite.bitmap.draw_text(+1, -1, w, h, damage_string[i].chr, 1)
        sprite.bitmap.draw_text(-1, +1, w, h, damage_string[i].chr, 1)
        sprite.bitmap.draw_text(+1, +1, w, h, damage_string[i].chr, 1)
        if value.is_a?(Numeric) and value < 0
          sprite.bitmap.font.color.set(176, 255, 144)
        else
          sprite.bitmap.font.color.set(255, 255, 255)
        end
        sprite.bitmap.draw_text(0, 0, w, h, damage_string[i].chr, 1)
        @_damage_sprites.push(sprite)
      end
      # Critical Sprite
      critical_string = "CRITICAL"
      font_name = "Arial Black"
      font_size = 20
      bitmap = Bitmap.new(1, 1)
      bitmap.font.name = font_name
      bitmap.font.size = font_size
      critical_width = bitmap.text_size(critical_string).width
      if critical
        sprite = ::Sprite.new(self.viewport)
        bitmap = Bitmap.new(1, 1)
        bitmap.font.name = font_name
        bitmap.font.size = font_size
        w = bitmap.text_size(critical_string).width + 2
        h = bitmap.text_size(critical_string).height + 2
        sprite.bitmap = Bitmap.new(w, h)
        sprite.bitmap.font.name = font_name
        sprite.bitmap.font.size = font_size
        sprite.bitmap.font.color.set(0, 0, 0)
        sprite.bitmap.draw_text(-1, -1, w, h, critical_string, 1)
        sprite.bitmap.draw_text(+1, -1, w, h, critical_string, 1)
        sprite.bitmap.draw_text(-1, +1, w, h, critical_string, 1)
        sprite.bitmap.draw_text(+1, +1, w, h, critical_string, 1)
        sprite.bitmap.font.color.set(255, 255, 255)
        sprite.bitmap.draw_text(0, 0, w, h, critical_string, 1)
        @_damage_sprites.push(sprite)
      end
      # Sprite positions
      dx = 0
      for i in 0...damage_string.size
        @_damage_sprites[i].x = self.x - damage_width / 2 + dx
        dx += @_damage_sprites[i].bitmap.width - 2
        @_damage_sprites[i].y = self.y - self.oy / 2 - 16
        @_damage_sprites[i].z = 3000
        @_damage_sprites[i].visible = false
      end
      if critical
        @_damage_sprites[-1].x = self.x - critical_width / 2
        @_damage_sprites[-1].y = self.y - self.oy / 2 - 32
        @_damage_sprites[-1].z = 3000
        @_damage_sprites[-1].visible = false
      end
      @_damage_duration = 40
    end
    #------------------------------------------------------------------------
    # * Dispose Damage
    #------------------------------------------------------------------------
    def dispose_damage
      @_damage_sprites = [] if @_damage_sprites.nil?
      for i in 0...@_damage_sprites.size
        @_damage_sprites[i].bitmap.dispose
        @_damage_sprites[i].dispose
      end
      @_damage_sprites = []
      @_damage_duration = 0
    end
    #------------------------------------------------------------------------
    # * Update
    #------------------------------------------------------------------------
    def update
      super
      update_whiten
      update_appear
      update_escape
      update_collapse
      update_damage
      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
      update_blink
      @@_animations.clear
    end
    #------------------------------------------------------------------------
    # * Update Whiten
    #------------------------------------------------------------------------
    def update_whiten
      if @_whiten_duration > 0
        @_whiten_duration -= 1
        self.color.alpha = 128 - (16 - @_whiten_duration) * 10
      end
    end
    #------------------------------------------------------------------------
    # * Update Appear
    #------------------------------------------------------------------------
    def update_appear
      if @_appear_duration > 0
        @_appear_duration -= 1
        self.opacity = (16 - @_appear_duration) * 16
      end
    end
    #------------------------------------------------------------------------
    # * Update Escape
    #------------------------------------------------------------------------
    def update_escape
      if @_escape_duration > 0
        @_escape_duration -= 1
        self.opacity = 256 - (32 - @_escape_duration) * 10
      end
    end
    #------------------------------------------------------------------------
    # * Update Collapse
    #------------------------------------------------------------------------
    def update_collapse
      if @_collapse_duration > 0
        @_collapse_duration -= 1
        self.opacity = 256 - (48 - @_collapse_duration) * 6
      end
    end
    #------------------------------------------------------------------------
    # * Update Blink
    #------------------------------------------------------------------------
    def update_blink
      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
    end
    #------------------------------------------------------------------------
    # * Update Damage
    #------------------------------------------------------------------------
    def update_damage
      if @_damage_duration > 0
        index = 40 - @_damage_duration
        @_damage_duration -= 1
        if index < @_damage_sprites.size
          @_damage_sprites[index].visible = true
        end
        for i in 0...@_damage_sprites.size
          next if @_damage_sprites[i].visible == false
          case (index - i)
          when 0..1
            @_damage_sprites[i].y -= 4
          when 2..3
            @_damage_sprites[i].y -= 2
          when 4..5
            @_damage_sprites[i].y += 2
          when 6..10
            @_damage_sprites[i].y += 4
          end
          if (index - i) > 1
            @_damage_sprites[i].opacity = 256 - (12 - @_damage_duration) * 32
          else
            @_damage_sprites[i].opacity = 128
          end
        end
        if @_damage_duration == 0
          dispose_damage
        end
      end
    end
  end
end
avatar
Wecoc
Administrador
Administrador



Créditos 12388

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Simple Damage Delay

Mensaje por xXIsrael0499Xx el 2017-05-03, 12:43

Delay en rpg maker (?)
Genial, es un detallito bastante agradable para la vista, esperemos que los jugadores aprecien eso...

Yo no suelo usar este tipo de Scripts, pero me pareció interesante como estos pequeños detalles pueden embellecer a la batalla por defecto del maker...

Muchas gracias por el aporte :3

Cuando tenga tiempo lo probare con mas calma, aver si hay algún fallo (Que lo dudo XD)
avatar
xXIsrael0499Xx
Veterano
Veterano

0/3

Créditos 1233

Gracias : 97

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Simple Damage Delay

Mensaje por BlazeCrimson el 2017-05-03, 19:09

Gracias por el aporte, con algunos ajustes adicionales es de gran ayuda para descendencia Carmesí, pudiendo dejar atrás el "MOG" que es excesivamente utilizado (y de paso me quito de encima el único script de esa serie que tenia).

Un saludo gcool

_________________
Image and video hosting by TinyPic
avatar
BlazeCrimson
Analista
Analista

0/3

Créditos 1127

Gracias : 111

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Simple Damage Delay

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.