Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[RMXP/VX] Sceen Tone + Shake en Ataques

Ver el tema anterior Ver el tema siguiente Ir abajo

[RMXP/VX] Sceen Tone + Shake en Ataques

Mensaje por Wecoc el 2013-06-08, 21:25

Este script te permite poner tonos de pantalla mientras aparece cierta animación (en batalla)
El script es más largo de lo que debería, porque le puse los siguientes addons:

- Hasta ahora podías comprobar cuando un RPG::Sprite estaba mostrando damage, o una animación, o cuando estaba seleccionado... pero no podías detectar ni el inicio ni el final de cada cosa. Implementé eso (y el script lo usa de manera que al iniciar la animación cambia de tono y al acabar cambia otra vez al que estaba)

- Añadí tone_memorize y tone_restore al Game_Screen, para usarlo es tan facil como poner $game_screen.tone_memorize y $game_screen.tone_restore(tiempo).

- Es configurable el tono de cada animación, para ello tenéis que ir al script en la parte del module WecocSettings, hay un Hash, TONE, allí ponéis ID de animación => Tono, por defecto puse un color verdoso a la habiliadad Cura y uno rojo a la habilidad Fuego.

- Es configurable el shake de cada animación, aunque el efecto personalmente no es que me guste mucho porque se ve el battleback como cortado... Pero en fin, para ello tenéis que ir al script en la parte del module WecocSettings, hay un Hash, SHAKE, allí ponéis ID de animación => [power, speed, duration].

Probadlo y me decís qué tal os funciona

Código:
#==============================================================================
# [RMXP] Wecoc Attacks AddOns
#==============================================================================


module WecocSettings
  TONE = {15 => Tone.new(-50,50,-20,10), # Animation ID => Tone
          27 => Tone.new(50,-50,-50,20)
          # etc
          }
  SHAKE = {27 => [5, 5, 20] # Animation ID => [power, speed, duration]
          # etc
          }
end

#==============================================================================
# RPG::Sprite AddOn 1
#==============================================================================

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
      @_animation_duration = 0
      @_blink = false
    
     @_whiten_start = false
      @_whiten_end = false
      @_appear_start = false
      @_appear_end = false
      @_escape_start = false
      @_escape_end = false
      @_collapse_start = false
      @_collapse_end = false
      @_damage_start = false
      @_damage_end = false
      @_animation_start = false
      @_animation_end = false
      @_loop_animation_start = false
    end

    def whiten?
      return @_whiten_duration > 0
    end
    def appear?
      return @_appear_duration > 0
    end
    def escape?
      return @_escape_duration > 0
    end
    def collapse?
      return @_collapse_duration > 0
    end
    def damage?
      return @_damage_duration > 0
    end
    def animation?
      return (@_animation != nil and (Graphics.frame_count % 2 == 0))
    end
    def animation_id
      return @_animation.id
    end
    def loop_animation?
      return (@_loop_animation != nil and (Graphics.frame_count % 2 == 0))
    end
    def whiten_start?
      return @_whiten_start
    end
    def whiten_end?
      return @_whiten_end
    end
    def appear_start?
      return @_appear_start
    end
    def appear_end?
      return @_appear_end
    end
    def escape_start?
      return @_escape_start
    end
    def escape_end?
      return @_escape_end
    end
    def collapse_start?
      return @_collapse_start
    end
    def collapse_end?
      return @_collapse_end
    end
    def damage_start?
      return @_damage_start
    end
    def damage_end?
      return @_damage_end
    end
    def animation_start?
      if (Graphics.frame_count % 2 == 0)
        return @_animation_start
      else
        return false
      end
    end
    def animation_end?
      if (Graphics.frame_count % 2 == 0)
        return @_animation_end
      else
        return false
      end
    end
    def loop_animation_start?
      return @_loop_animation_start
    end
  
   def update
      super
      if @_whiten_duration > 0
        @_whiten_start = false
        @_whiten_end = false
      
       @_whiten_start = true if @_whiten_duration == 16
        @_whiten_end = true if @_whiten_duration == 2
      
       @_whiten_duration -= 1
        self.color.alpha = 128 - (16 - @_whiten_duration) * 10
      end
      if @_appear_duration > 0
        @_appear_start = false
        @_appear_end = false
      
       @_appear_start = true if @_appear_duration == 16
        @_appear_end = true if @_appear_duration == 2
      
       @_appear_duration -= 1
        self.opacity = (16 - @_appear_duration) * 16
      end
      if @_escape_duration > 0
        @_escape_start = false
        @_escape_end = false
      
       @_escape_start = true if @_escape_duration == 32
        @_escape_end = true if @_escape_duration == 2
      
       @_escape_duration -= 1
        self.opacity = 256 - (32 - @_escape_duration) * 10
      end
      if @_collapse_duration > 0
        @_collapse_start = false
        @_collapse_end = false
      
       @_collapse_start = true if @_collapse_duration == 48
        @_collapse_end = true if @_collapse_duration == 2
      
       @_collapse_duration -= 1
        self.opacity = 256 - (48 - @_collapse_duration) * 6
      end
      if @_damage_duration > 0
        @_damage_start = false
        @_damage_end = false
      
       @_damage_start = true if @_collapse_duration == 40
        @_damage_end = true if @_collapse_duration == 2
      
       @_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
      if @_animation != nil and (Graphics.frame_count % 2 == 0)
        @_animation_start = false
        @_animation_end = false
      
       @_animation_start = true if @_animation_duration == @_animation.frame_max
        @_animation_end = true if @_animation_duration == 2
      
       @_animation_duration -= 1
        update_animation
      end
      if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
        @_loop_animation_start = false
        @_animation_start = true if @_loop_animation_index == 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

#==============================================================================
# ** Game_Screen
#==============================================================================

class Game_Screen
  def tone_memorize
    @memorized_tone = @tone.clone
  end
  def tone_restore(duration=20)
    start_tone_change(@memorized_tone, duration)
  end
end

#==============================================================================
# ** Spriteset_Battle
#==============================================================================

class Scene_Battle
  def initialize
    $game_screen.tone_memorize
  end
end

class Spriteset_Battle
  alias upd_wecoc update unless $@
  def update
    upd_wecoc
    for i in 0...@actor_sprites.size
      if @actor_sprites[i].animation_start?
        if WecocSettings::TONE.include?(@actor_sprites[i].animation_id)
          tone = WecocSettings::TONE[@actor_sprites[i].animation_id]
          $game_screen.start_tone_change(tone, 10)
        end
        if WecocSettings::SHAKE.include?(@actor_sprites[i].animation_id)
          array = WecocSettings::SHAKE[@actor_sprites[i].animation_id]
          power = array[0]
          speed = array[1]
          duration = array[2]
          $game_screen.start_shake(power, speed, duration)
        end
      end
      if @actor_sprites[i].animation_end?
        $game_screen.tone_restore(10)
      end
    end
    for i in 0...@enemy_sprites.size
      if @enemy_sprites[i].animation_start?
        if WecocSettings::TONE.include?(@enemy_sprites[i].animation_id)
          tone = WecocSettings::TONE[@enemy_sprites[i].animation_id]
          $game_screen.start_tone_change(tone, 10)
        end
        if WecocSettings::SHAKE.include?(@enemy_sprites[i].animation_id)
          array = WecocSettings::SHAKE[@enemy_sprites[i].animation_id]
          power = array[0]
          speed = array[1]
          duration = array[2]
          $game_screen.start_shake(power, speed, duration)
        end
      end
      if @enemy_sprites[i].animation_end?
        $game_screen.tone_restore(10)
      end
    end
  end
end

No hace falta darme créditos porque es un script muy chorra en realidad xD

Recomendación personal 1: Dejad frames vacías antes y después en las Animaciones (Base de Datos) con las que queráis jugar con el tono, en general quedará mejor visualmente.

Recomendación personal 2: No os paséis con esto tampoco, yo lo pensé solo para habilidades especiales.


Última edición por Wecoc el 2013-06-16, 16:22, editado 3 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12385

Gracias : 595

Volver arriba Ir abajo

Re: [RMXP/VX] Sceen Tone + Shake en Ataques

Mensaje por orochii el 2013-06-08, 21:40

Pos guay, eso sería en lugar de poner un chorro de Flash de pantalla xDD, uno por cada frame xD. Aparte hace blending por su cuenta en lugar de uno tener que calcularlo ajaja.

Hay una cosa que podrías agregar al script, una cosa que se perdió con el tiempo. El efecto de temblor, antes se podía usar en animaciones. No se me ocurre dónde tirarlo xd, supongo que en un hash...

En fin bonito aporte,
Orochii Zouveleki
avatar
orochii
Reportero

0/3

Créditos 7614

Gracias : 415

Volver arriba Ir abajo

Re: [RMXP/VX] Sceen Tone + Shake en Ataques

Mensaje por Wecoc el 2013-06-08, 21:59

Pos guay, eso sería en lugar de poner un chorro de Flash de pantalla xDD, uno por cada frame xD. Aparte hace blending por su cuenta en lugar de uno tener que calcularlo ajaja.
Ten en cuenta a parte que Tone y Flash no son lo mismo xD Se puede poner un tono determinado con éste script y luego además poner flashes.

Hay una cosa que podrías agregar al script, una cosa que se perdió con el tiempo. El efecto de temblor, antes se podía usar en animaciones. No se me ocurre dónde tirarlo xd, supongo que en un hash...
Ya puse lo del Shake, eso fue aún más fácil xD
avatar
Wecoc
Administrador
Administrador



Créditos 12385

Gracias : 595

Volver arriba Ir abajo

Re: [RMXP/VX] Sceen Tone + Shake en Ataques

Mensaje por carlos55 el 2013-06-08, 22:08

Se podria adaptar este script a VX
seria buenisimo poder hacer los temblores en VX le da ese efecto de que los golpes son brutales :D

Saludos
avatar
carlos55
Moderador
Moderador

0/3

Créditos 1130

Gracias : 10

Volver arriba Ir abajo

Re: [RMXP/VX] Sceen Tone + Shake en Ataques

Mensaje por Wecoc el 2013-06-08, 22:39

No puedo pasarte el script porque esa parte va muy distinta, lo que sí puedo hacerte es lo del shake solo. Aquí lo tienes, para VX

Código:
#==============================================================================
# [RMVX] Wecoc Animation AddOns
#==============================================================================


module WecocSettings
  SHAKE = {27 => [10, 10, 20] # Animation ID => [power, speed, duration]
          # etc
          }
end

#==============================================================================
# ** Sprite_Base
#==============================================================================

class Scene_Battle < Scene_Base
  def display_normal_animation(targets, animation_id, mirror = false)
    animation = $data_animations[animation_id]
    if animation != nil
      if WecocSettings::SHAKE.include?(animation.id)
        array = WecocSettings::SHAKE[animation.id]
        power = array[0]
        speed = array[1]
        duration = array[2]
        $game_troop.screen.start_shake(power, speed, duration)
      end
      to_screen = (animation.position == 3)      # Is the positon "screen"?
      for target in targets.uniq
        target.animation_id = animation_id
        target.animation_mirror = mirror
        wait(20, true) unless to_screen          # If for one, wait
      end
      wait(20, true) if to_screen                # If for all, wait
    end
  end
end

Por si acaso, recuerda que va por ID de animación, no por ID de skill xD
avatar
Wecoc
Administrador
Administrador



Créditos 12385

Gracias : 595

Volver arriba Ir abajo

Re: [RMXP/VX] Sceen Tone + Shake en Ataques

Mensaje por Gabriquel el 2014-03-25, 23:16

Acabo de probarlo con Behemoth y no funciona Wecoc, ya lo puse antes y despues del script de batalla y me sale error, solo si lo coloco despues del sistema de batalla, pero si lo coloco antes no funciona Sweat ¿Como le hago?
avatar
Gabriquel
Novato
Novato

0/3

Créditos 66

Gracias : 2

Volver arriba Ir abajo

Re: [RMXP/VX] Sceen Tone + Shake en Ataques

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.