Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[RMXP] Animaciones con Eval v1.2

Ver el tema anterior Ver el tema siguiente Ir abajo

[RMXP] Animaciones con Eval v1.2

Mensaje por Wecoc el 2014-06-16, 00:59

Por defecto en las animaciones puedes asignar un sonido, flash de pantalla, flash de objetivo o borrar objetivo en un frame específico.

Éste script permite añadir eval, es decir "Llamar Script" en las animaciones.
Hacer eso es difícil pero permite cosas hasta el momento no posibles.
Añadí además una serie de Atajos para que ese eval sea un poco más ameno; la parte Skill_Shortcuts está destinada a eso.

Instrucciones y atajos en el script. Agradezco los cerditos.

Pegad encima de main:

Código:

Código:
#------------------------------------------------------------------------------
# Game_Animation with Eval Support
# Versión: 1.2
# Autor: Wecoc
#------------------------------------------------------------------------------
# o DESCRIPCIÓN
#
# Por defecto en las animaciones puedes asignar un sonido, flash de pantalla,
# flash de objetivo o borrar objetivo en un frame específico.
#
# Éste script permite añadir eval, es decir "Llamar Script" en las animaciones.
# Hacer eso es difícil pero permite cosas hasta el momento no posibles.
# Añadí además una serie de Atajos para que ese eval sea un poco más ameno;
# la parte Skill_Shortcuts está destinada a eso.
#------------------------------------------------------------------------------
# o INSTRUCCIONES
#
# En ésta nueva versión del script, los cambios que efectúes seran guardados.
# Así que si justo al primer mapa asignas los evals que estaran a lo
# largo del juego ya no tendrás que preocuparte más de eso.
#
# Además había un bug interno del RPG maker relacionado con las animaciones,
# éste script era incompatible con su bugfix así que lo he integrado en él.
#
# ATENCIÓN - Si usas otros scripts puede haber incompatibilidades de dos tipos:
#
# 1) Reescritura de métodos
#
#    - RPG::Sprite (toda la parte de animación)!
#    - Scene_Battle#update_phase4_step4
#    - Game_Battler#initialize (alias)
#    - Scene_Title#command_new_game (alias)
#    - Scene_Title#battle_test (alias)
#    - Scene_Save#write_save_data (alias)
#    - Scene_Load#read_save_data (alias)
#    - Sprite_Character#initialize (alias)
#    - Sprite_Character#update
#    - Sprite_Battler#initialize (alias)
#    - Sprite_Battler#update
#
# 2) $data_animations
#
#    Aunque $data_animations sigue funcionando lo hará sin los evals.
#    Para que funcione habrá que cambiarlo por $game_animations a todos los
#    scripts que se hayan añadido.
#
# $game_animations[id].add_effect(frame, 'text', condition)
#  id - ID de la animación a la que añades el efecto
#  frame - Frame de la animación (de 0 hasta el número que tenga - 1)
#          Si pones un valor no válido de frame no saltará error pero no se
#          aplicará el efecto.
#  text - Código a ejecutar
#  condition - (Opcional, por defecto 0) 0 - Siempre, 1 - Golpe, 2 - Error
#
# /Por ejemplo: $game_animations[1].add_effect(5, '$game_switches[1] = true', 1)
#
# Para limpiar todos los efectos añadidos:
# $game_animations[id].clear_effects
#  id - ID de la animación a la que quitas los efectos
#------------------------------------------------------------------------------
# o ATAJOS
#
# Los atajos se definen dentro de Skill_Shortcuts y puedes añadir los que quieras
# Es lo que se usará dentro de lo antes descrito como 'text' pero en realidad
# puedes usar cualquier eval que sea válido tanto para mapa como para batalla.
#
#==============================================================================

#==============================================================================
# Skill_Shortcuts
#==============================================================================

module Skill_Shortcuts
 
  # Atajos para el eval de las skills, puedes añadir los que quieras
  # (por ejemplo cosas relacionadas con weather, pictures...)
 
  # Reproducir sonido
  def se_play(name, volume, pitch)
    Audio.se_play("Audio/SE/" + name, volume, pitch)
  end
 
  # Flash de pantalla
  def flash_screen(color, time)
    self.viewport.flash(color, time)
  end
 
  # (Usa flash para el flash de objetivo)
 
  # Borrar objetivo
  def hide(time)
    self.flash(nil, time)
  end
 
  # Sacudir pantalla
  def shake(power, speed, duration)
    $game_screen.start_shake(power, speed, duration)
  end
 
  # Memorizar el tono actual de pantalla
  def get_tone
    @screen_tone = $game_screen.tone.clone
  end
 
  # Cambiar el tono de pantalla
  def set_tone(tone, time)
    $game_screen.start_tone_change(tone, time)
  end
 
  # Recuperar el tono de pantalla memorizado
  def restore_tone(time)
    if @screen_tone.nil?
      @screen_tone = Tone.new(0, 0, 0, 0)
    end
    $game_screen.start_tone_change(@screen_tone, time)
  end
 
  # Cambiar el tono de pantalla según el tono memorizado
  def change_tone(tone, time)
    if @screen_tone.nil?
      @screen_tone = Tone.new(0, 0, 0, 0)
    end
    new_tone = @screen_tone.clone
    new_tone.red += tone.red
    new_tone.green += tone.green
    new_tone.blue += tone.blue
    new_tone.gray += tone.gray
    $game_screen.start_tone_change(new_tone, time)
  end
 
  # Cambiar la x del sprite
  def change_ani_x(new_x, duration=0)
    if duration == 0
      @ani_x = new_x
      return new_x
    end
    @ani_x_new = new_x
    @ani_x_duration = duration
  end
 
  # Cambiar la y del sprite
  def change_ani_y(new_y, duration=0)
    if duration == 0
      @ani_y = new_y
      return new_y
    end
    @ani_y_new = new_y
    @ani_y_duration = duration
  end
end

#==============================================================================
# RPG::Animation & RPG::Sprite Edits
#==============================================================================

module RPG
  class Animation
    class Frame
      def text_array
        if @text_array == nil
          @text_array = []
        end
        return @text_array
      end
      def text_array=(value)
        @text_array = value
      end
    end
  end
end

module RPG
  class Sprite < ::Sprite
    def animation(animation, hit=true, show=true)
      dispose_animation
      @_animation = animation
      return if @_animation == nil
      @_animation_hit = hit
      @_animation_duration = @_animation.frame_max
      animation_name = @_animation.animation_name
      animation_hue = @_animation.animation_hue
      bitmap = RPG::Cache.animation(animation_name, animation_hue)
      if @@_reference_count.include?(bitmap)
        @@_reference_count[bitmap] += 1
      else
        @@_reference_count[bitmap] = 1
      end
      @_animation_sprites = []
      if @_animation.position != 3 or not @@_animations.include?(animation)
        for i in 0..15
          sprite = ::Sprite.new(self.viewport)
          sprite.bitmap = bitmap
          sprite.visible = false
          @_animation_sprites.push(sprite)
        end
        unless @@_animations.include?(animation)
          @@_animations.push(animation)
        end
      end
      update_animation(show)
    end
   
    def loop_animation(animation, show=true)
      return if animation == @_loop_animation
      dispose_loop_animation
      @_loop_animation = animation
      return if @_loop_animation == nil
      @_loop_animation_index = 0
      animation_name = @_loop_animation.animation_name
      animation_hue = @_loop_animation.animation_hue
      bitmap = RPG::Cache.animation(animation_name, animation_hue)
      if @@_reference_count.include?(bitmap)
        @@_reference_count[bitmap] += 1
      else
        @@_reference_count[bitmap] = 1
      end
      @_loop_animation_sprites = []
      for i in 0..15
        sprite = ::Sprite.new(self.viewport)
        sprite.bitmap = bitmap
        sprite.visible = false
        @_loop_animation_sprites.push(sprite)
      end
      update_loop_animation(show)
    end
   
    def update_animation(show=true)
      if @_animation_duration > 0
        frame_index = @_animation.frame_max - @_animation_duration
        cell_data = @_animation.frames[frame_index].cell_data
        position = @_animation.position
        animation_set_sprites(@_animation_sprites, cell_data, position, show)
        text_array = @_animation.frames[frame_index].text_array
        for text_pair in text_array
          text = text_pair[0]
          condition = text_pair[1]
          hit = @_animation_hit
          if (condition == 0) or (condition == 1 and hit == true) or
            (condition == 2 and hit == false)
            result = eval(text)
          end
        end
        for timing in @_animation.timings
          if timing.frame == frame_index
            animation_process_timing(timing, @_animation_hit)
          end
        end
      else
        dispose_animation
      end
    end
 
    def update_loop_animation(show=true)
      frame_index = @_loop_animation_index
      cell_data = @_loop_animation.frames[frame_index].cell_data
      position = @_loop_animation.position
      animation_set_sprites(@_loop_animation_sprites, cell_data, position, show)
      text_array = @_animation.frames[frame_index].text_array
      for text_pair in text_array
        text = text_pair[0]
        condition = text_pair[1]
        hit = @_animation_hit
        if (condition == 0) or (condition == 1 and hit == true) or
          (condition == 2 and hit == false)
          class_eval(text)
        end
      end
      for timing in @_loop_animation.timings
        if timing.frame == frame_index
          animation_process_timing(timing, true)
        end
      end
    end
   
    def animation_set_sprites(sprites, cell_data, position, show=true)
      for i in 0..15
        sprite = sprites[i]
        pattern = cell_data[i, 0]
        if sprite == nil or pattern == nil or pattern == -1
          sprite.visible = false if sprite != nil
          next
        end
        sprite.visible = show
        sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
        if position == 3
          if self.viewport != nil
            sprite.x = self.viewport.rect.width / 2
            sprite.y = self.viewport.rect.height - 160
          else
            sprite.x = 320
            sprite.y = 240
          end
        else
          sprite.x = self.x - self.ox + self.src_rect.width / 2
          sprite.y = self.y - self.oy + self.src_rect.height / 2
          sprite.y -= self.src_rect.height / 4 if position == 0
          sprite.y += self.src_rect.height / 4 if position == 2
        end
        sprite.x += cell_data[i, 1]
        sprite.y += cell_data[i, 2]
        sprite.z = 2000
        sprite.ox = 96
        sprite.oy = 96
        sprite.zoom_x = cell_data[i, 3] / 100.0
        sprite.zoom_y = cell_data[i, 3] / 100.0
        sprite.angle = cell_data[i, 4]
        sprite.mirror = (cell_data[i, 5] == 1)
        sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
        sprite.blend_type = cell_data[i, 7]
      end
    end
  end
end

#==============================================================================
# Game_Animation & Game_Animations ($game_animations)
#==============================================================================

class Game_Animation
  attr_reader :animation_id
  attr_reader :name
  attr_reader :animation_name
  attr_reader :animation_hue
  attr_reader :position
  attr_reader :frame_max
  attr_reader :timings
  attr_reader :frames
 
  def initialize(animation_id)
    setup(animation_id)
  end
 
  def setup(animation_id)
    @animation_id = animation_id
    animation = $data_animations[animation_id]
    @name = animation.name
    @animation_name = animation.animation_name
    @animation_hue = animation.animation_hue
    @position = animation.position
    @frame_max = animation.frame_max
    @timings = animation.timings
    @frames = animation.frames
  end
 
  def id
    return @animation_id
  end
 
  def add_effect(frame, text, condition=0)
    return false if frame > @frame_max
    @frames[frame].text_array.push([text, condition])
    @frames[frame].text_array.uniq!
    return true
  end

  def clear_effects(frame=nil)
    if frame == nil # All frames
      for frame in 0...@frame_max
        @frames[frame].text_array = []
      end
    else
      @frames[frame].text_array = []
    end
    return true
  end
end

class Game_Animations
  def initialize
    @data = []
  end

  def [](animation_id)
    if animation_id > 999 or $data_animations[animation_id] == nil
      return nil
    end
    if @data[animation_id] == nil
      @data[animation_id] = Game_Animation.new(animation_id)
    end
    return @data[animation_id]
  end
end

#==============================================================================
# $game_animations load/save
#==============================================================================

class Game_Battler
  attr_accessor :show_animation
  alias show_animation_ini initialize unless $@
  def initialize(*args)
    show_animation_ini(*args)
    @show_animation = true
  end
end

class Scene_Battle
  def update_phase4_step4
    if @animation2_id != 0 and $data_animations[@animation2_id].position == 3
      for target in @target_battlers
        target.show_animation = false
      end
    else
      for target in @target_battlers
        target.show_animation = true
      end
    end
    for target in @target_battlers
      target.animation_id = @animation2_id
      target.animation_hit = (target.damage != "Miss")
    end
    @wait_count = 8
    @phase4_step = 5
  end
end

class Scene_Title
  alias animation_fix_new_game command_new_game unless $@
  def command_new_game
    $game_animations = Game_Animations.new
    animation_fix_new_game
  end
 
  alias animation_fix_battle battle_test unless $@
  def battle_test
    $game_animations = Game_Animations.new
    animation_fix_battle
  end
end

class Scene_Save < Scene_File
  alias animation_fix_write write_save_data unless $@
  def write_save_data(file)
    animation_fix_write(file)
    Marshal.dump($game_animations, file)
  end
end

class Scene_Load < Scene_File
  alias animation_fix_read read_save_data unless $@
  def read_save_data(file)
    animation_fix_read(file)
    $game_animations = Marshal.load(file)
  end
end

#==============================================================================
# Sprite_Character & Sprite_Battler Edits
#==============================================================================

class Sprite_Character < RPG::Sprite
  include Skill_Shortcuts
 
  attr_accessor :ani_x
  attr_accessor :ani_y
 
  alias animation_fix_ini initialize unless $@
  def initialize(*args)
    @ani_x = 0
    @ani_y = 0
    @ani_x_new = 0
    @ani_y_new = 0
    @ani_x_duration = 0
    @ani_y_duration = 0
    animation_fix_ini(*args)
  end
 
  def update
    super
    if @tile_id != @character.tile_id or
      @character_name != @character.character_name or
      @character_hue != @character.character_hue
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_hue = @character.character_hue
      if @tile_id >= 384
        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
          @tile_id, @character.character_hue)
        self.src_rect.set(0, 0, 32, 32)
        self.ox = 16
        self.oy = 32
      else
        self.bitmap = RPG::Cache.character(@character.character_name,
          @character.character_hue)
        @cw = bitmap.width / 4
        @ch = bitmap.height / 4
        self.ox = @cw / 2
        self.oy = @ch
      end
    end
    self.visible = (not @character.transparent)
    if @tile_id == 0
      sx = @character.pattern * @cw
      sy = (@character.direction - 2) / 2 * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
    end
    ## ------ EDIT -------
    if @character.animation_id != 0
      animation = $game_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
    if @ani_x_duration >= 1
      d = @ani_x_duration
      @ani_x = (@ani_x * (d - 1) + @ani_x_new) / d
      @ani_x_duration -= 1
    end
    if @ani_y_duration >= 1
      d = @ani_y_duration
      @ani_y = (@ani_y * (d - 1) + @ani_y_new) / d
      @ani_y_duration -= 1
    end
    return if @character.nil?
    self.x = @character.screen_x + @ani_x
    self.y = @character.screen_y + @ani_y
    self.z = @character.screen_z(@ch)
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
  end
end

class Sprite_Battler < RPG::Sprite
  include Skill_Shortcuts

  attr_accessor :ani_x
  attr_accessor :ani_y
 
  alias animation_fix_ini initialize unless $@
  def initialize(*args)
    @ani_x = 0
    @ani_y = 0
    @ani_x_new = 0
    @ani_y_new = 0
    @ani_x_duration = 0
    @ani_y_duration = 0
    animation_fix_ini(*args)
  end
 
  def update
    super
    if @battler == nil
      self.bitmap = nil
      loop_animation(nil)
      return
    end
    if @battler.battler_name != @battler_name or
      @battler.battler_hue != @battler_hue
      @battler_name = @battler.battler_name
      @battler_hue = @battler.battler_hue
      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
      if @battler.dead? or @battler.hidden
        self.opacity = 0
      end
    end
    # Loop animation
    if @battler.damage == nil and
      @battler.state_animation_id != @state_animation_id
      @state_animation_id = @battler.state_animation_id
      animation = $game_animations[@state_animation_id] ## EDIT
      loop_animation(animation)
    end
    if @battler.is_a?(Game_Actor) and @battler_visible
      if $game_temp.battle_main_phase
        self.opacity += 3 if self.opacity < 255
      else
        self.opacity -= 3 if self.opacity > 207
      end
    end
    # Blink
    if @battler.blink
      blink_on
    else
      blink_off
    end
    # If invisible
    unless @battler_visible
      # Appear
      if not @battler.hidden and not @battler.dead? and
        (@battler.damage == nil or @battler.damage_pop)
        appear
        @battler_visible = true
      end
    end
    # If visible
    if @battler_visible
      # Escape
      if @battler.hidden
        $game_system.se_play($data_system.escape_se)
        escape
        @battler_visible = false
      end
      # White flash
      if @battler.white_flash
        whiten
        @battler.white_flash = false
      end
      # Animation ## EDIT
      if @battler.animation_id != 0
        animation = $game_animations[@battler.animation_id]
        animation(animation, @battler.animation_hit, @battler.show_animation)
        @battler.animation_id = 0
      end
      # Damage
      if @battler.damage_pop
        damage(@battler.damage, @battler.critical)
        @battler.damage = nil
        @battler.critical = false
        @battler.damage_pop = false
      end
      # Collapse
      if @battler.damage == nil and @battler.dead?
        if @battler.is_a?(Game_Enemy)
          $game_system.se_play($data_system.enemy_collapse_se)
        else
          $game_system.se_play($data_system.actor_collapse_se)
        end
        collapse
        @battler_visible = false
      end
    end
    ## ------ EDIT -------
    if @ani_x_duration >= 1
      d = @ani_x_duration
      @ani_x = (@ani_x * (d - 1) + @ani_x_new) / d
      @ani_x_duration -= 1
    end
    if @ani_y_duration >= 1
      d = @ani_y_duration
      @ani_y = (@ani_y * (d - 1) + @ani_y_new) / d
      @ani_y_duration -= 1
    end
    return if @battler.nil?
    self.x = @battler.screen_x + @ani_x
    self.y = @battler.screen_y + @ani_y
    self.z = @battler.screen_z
  end
end


Demo:
Animaciones con Eval 1.0.zip


Nueva Demo:
Animaciones con Eval 1.2.zip

Si es que si no fuera por mis abundantes aportes éste foro no se mantendría a flote... xDD

Saludos ;D


Última edición por Wecoc el 2014-07-15, 16:01, editado 1 vez
avatar
Wecoc
Administrador
Administrador



Créditos 12308

Gracias : 653

Volver arriba Ir abajo

Re: [RMXP] Animaciones con Eval v1.2

Mensaje por Wecoc el 2014-07-15, 04:33

¡UPDATE (1.1) y otra vez UPDATE (1.2)! xD

En ésta nueva versión del script, los cambios que efectúes seran guardados (antes no, fue un fallo técnico bastante grave...)

Ahora si justo al primer mapa asignas los evals que estaran a lo largo del juego ya no tendrás que preocuparte más de eso.

Además había un bug interno del RPG maker relacionado con las animaciones, éste script era incompatible con su bugfix así que lo he integrado en él.

ATENCIÓN - Si usas otros scripts puede haber incompatibilidades de dos tipos:

1) Reescritura de métodos:

    RPG::Sprite (toda la parte de animación)!
    Scene_Battle#update_phase4_step4
    Game_Battler#initialize (alias)
    Scene_Title#command_new_game (alias)
    Scene_Title#battle_test (alias)
    Scene_Save#write_save_data (alias)
    Scene_Load#read_save_data (alias)
    Sprite_Character#initialize (alias)
    Sprite_Character#update
    Sprite_Battler#initialize (alias)
    Sprite_Battler#update

Son un montón así que cuidadín.

2) $data_animations

Aunque $data_animations sigue funcionando lo hará sin los evals añadidos.
Para que funcione habrá que cambiarlo por $game_animations a todos los scripts que se hayan añadido. A los que hay por defecto no. A parte de ese cambio necesario de "data" a "game" no hay más cambios, sigue funcionando igual el índice y todo. Si hubiera algún problema contactad conmigo.

PD.- Sí, el script no es ni la mitad de compacto, "amigable" y ordenado que antes, pero miradlo así, ahora es más pro.
avatar
Wecoc
Administrador
Administrador



Créditos 12308

Gracias : 653

Volver arriba Ir abajo

Re: [RMXP] Animaciones con Eval v1.2

Mensaje por Ledai el 2014-07-15, 12:05

Me da erro al batallar, atacando o con habilidades:

404 Método indefinido Show_Animation o algo así
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 5217

Gracias : 217

Volver arriba Ir abajo

Re: [RMXP] Animaciones con Eval v1.2

Mensaje por Wecoc el 2014-07-15, 15:58

Ahhh me equivoqué con el orden allí, ya lo veo. Se me pasó porque no probé la batalla antes de hacer los cambios en las animaciones.

Ya lo he arreglado, era solo que faltaba un for pero bueno ahora lo resubo. ¡Perdón!

El internet me va tan mal que hasta en el maker me salta Error 404 (??) xD

Ya está. Gracias por testearlo, cualquier otro bug me lo dices.
avatar
Wecoc
Administrador
Administrador



Créditos 12308

Gracias : 653

Volver arriba Ir abajo

Re: [RMXP] Animaciones con Eval v1.2

Mensaje por Eron el 2014-09-15, 13:33

¡Cuanto tiempo! He tenido una idea para aplicar a las animaciones pero no sé hacerla, a ver si tú sabes... Se parece un poco a lo que hiciste aquí así que quizá x'D

La idea era a parte de aplicarles eval aplicarles hit-points, de modo que a ciertos puntos de la animación se calcule y muestre un daño, haciendo así un Multi-hit con tiempo definido.

A ver si se me entiende, tú aplicarías en un frame concreto un porcentaje del daño real que hace lo que sea que haya causado la animación:

animation.hit_point(frame, porcentaje)
por ejemplo (5, 50)

Así en batalla justo en ese frame se aplicaría el daño del ataque * porcentaje / 100 (arreglado con floats y eso)
Al terminar la animación si aún no se ha llegado al 100% se aplicaría el último daño de siempre con el porcentaje restante.

Hice un script para la base de todo ésto, para usarlo juntamente con todo lo que tú les aplicaste porque le va bien, mira:
Código:
#==============================================================================
# Animation's Hit-points Eval
#------------------------------------------------------------------------------
#  Autor: Eron
#  Éste script requiere el script "Game_Animation with Eval Support" de Wecoc
#==============================================================================

class Game_Animation
  alias eron_hpe_initialize initialize unless $@
  def initialize(animation_id)
    eron_hpe_initialize(animation_id)
    @hit_points = []
  end
 
  def add_hit_point(frame, ratio)
    @hit_points.push([frame, ratio])
    hit_points_sort
  end
 
  def hit_points_sort
    @hit_points.uniq!
    @hit_points.each do |point|
      loop do
        selected_points = @hit_points.select{|hp| hp[0] == point[0]}
        if selected_points.size > 1
          @hit_points.delete(selected_points[0])
        else
          break
        end
      end
    end
    @hit_points.sort!{|a, b| b[0] - a[0]}
  end
 
  def last_hit_ratio
    ratio = 100
    @hit_points.each do |point|
      ratio -= point[1]
    end
    return [ratio, 0].max
  end
 
  def clear_hit_points
    @hit_points = []
  end
end



Pero no sé hacer todo lo de mostrar daño cuando toca ni todo eso.
Tendría que retocarse alguno de los steps de la phase4 de la batalla.

¿Podrías mirarlo a ver si tú puedes, porfa? =((
avatar
Eron
Principiante
Principiante

0/3

Créditos 3599

Gracias : 60

Volver arriba Ir abajo

Re: [RMXP] Animaciones con Eval v1.2

Mensaje por Wecoc el 2014-09-15, 16:25

Creo que justo al mostrar la animación, animation_id vuelve a 0, y la animación va completamente a parte de todo lo que es el update de la escena en sí. Entonces una vez iniciada la animación ésta pasaría a segundo plano (y si vuelve a 0 al terminar tampoco hay mucha diferencia xD)

Podrías crear dos variables, una para un contador reiniciado al mismo tiempo que la animación y que se vaya sumando en un update a parte, sería la forma de obtener el frame actual de la animación sin la propia animación (y así hasta frame_max), y uno segundo que guardara la id de la $game_animation que se inició, para obtener los hit-points de ese frame y para obtener frame_max.

El primer problema que veo es que por una parte si por ejemplo el scope es para más de un target (sea enemigo o actor) a la vez habrá más de una animación cada una con su damage...

El segundo, que mostrar un damage en el maker no es una llamada con un número y ya está, tiene su complicación.

Y el tercero que todo lo que es el tipo de ataque, el daño de ese ataque y todo eso creo que no se guarda mientras se está ejecutando la animación y por lo tanto también habría que guardarlo a parte. Además supongo que si ataca a más de uno a la vez no querrás que les haga a todos exactamente el mismo daño, habrá una variación a tener en cuenta al igual que el daño normal.

En resumen, no te puedo ayudar más que con lo que te he dicho. Ojalá con éstas pautas consigas lo que buscas.
avatar
Wecoc
Administrador
Administrador



Créditos 12308

Gracias : 653

Volver arriba Ir abajo

Re: [RMXP] Animaciones con Eval v1.2

Mensaje por Wecoc el 2014-10-05, 01:27

Se ha detectado un bug en la demo cuando hablas con uno de los dos tipos con armadura gris dos o más veces muy seguidas, sin dar tiempo a la animación de ser finalizada. La pantalla se oscurece más de lo debido, y no vuelve a su tono real.

Eso es porque cuando hablas con el evento él reestablece el tono de pantalla actual (oscuro debido a la animación siendo ejecutada) como el tono final, calculado mal todos los tonos que vienen a continuación.

Es un bug en la demo que os puede pasar también en vuestro proyecto si no vigiláis, pero es fácil de evitar. En principio no causará problemas dentro de la batalla ni en los eventos si les pones un Esperar x frames dándole tiempo a la animación a ser finalizada.

Si pudiera, fijaría el bug pero no veo que haya ninguna solución definitiva sencilla que lo arregle.
avatar
Wecoc
Administrador
Administrador



Créditos 12308

Gracias : 653

Volver arriba Ir abajo

Re: [RMXP] Animaciones con Eval v1.2

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.