Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Definir animaciones de ataque, defensa y otros en los charas [BETA]

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Definir animaciones de ataque, defensa y otros en los charas [BETA]

Mensaje por Wecoc el 2015-10-22, 19:06

Hace unos meses hice éste script, y creo que puede resultar interesante a más de uno. No lo subí hasta ahora porque tenía un fallo pero creo que ya está todo listo.

El script permite usar los charas como siempre, pero con un gráfico que se llame igual que el gráfico actual pero con algo añadido detrás (lo típico, por ejemplo 001-Fighter01_jump) se pueden definir animaciones extra. Sirve tanto para el jugador como los eventos, pero no en todos es necesario tener cada uno de los gráficos posibles, no da error por faltar el archivo.

El script permite éstas animaciones extra:

idle --> Por si quieres que cuando está parado haya cierto movimiento (como respirar). Puedes controlar la velocidad con $game_player.breathe_frames
walk --> Se usa si quieres que al andar tenga un gráfico distinto a cuando está parado, pero cuando se está moviento y está en la posición exacta del tile, sale el gráfico parado, así que en general no es demasiado útil. Si está parado pero tiene la opción "Animación parado" se lee el gráfico como si se estuviera moviendo.
jump --> Animación de salto. La duración de los frames viene calculada directamente según la distancia del salto.
attack --> Animación de ataque.
defense --> Gráfico de defensa. Solo usa el primer frame del chara.
use_skill --> Animación de usar skill.
use_item --> Animación de usar item. Hay una opción para usar la use_skill en ésta situación.

Se pueden definir más pero hay que toquetear bastante el script para ello.

Aquí tenéis el script:

Spoiler:

Código:
#==============================================================================
# ** [XP] New Character Movement v0.5 [BETA]
#------------------------------------------------------------------------------
# Autor: Wecoc
#==============================================================================
# - Métodos para $game_player y $game_map.events[ID]
#     attack
#     defense
#     use_skill
#     use_item
#
#     attacking?
#     defending?
#     using_skill?
#     using_item?
#
#     breathe_frames
#     breathe_frames=(frames)
#------------------------------------------------------------------------------
# - Gráficos opcionales para Characters:
#     (nombre)_idle
#     (nombre)_walk
#     (nombre)_jump
#     (nombre)_attack
#     (nombre)_defense
#     (nombre)_skill
#     (nombre)_item
#==============================================================================

module New_Movement
  
  # En vez de andar con velocidad normal, hace exactamente dos pasos por tile
  TWO_STEPS_PER_TILE = false
  
  # Si no hay gráfico (nombre)_item, carga el (nombre)_skill
  ITEM_WITH_SKILL_G = false
  
end

#==============================================================================
# ** Game_Character
#==============================================================================

class Game_Character
  
  attr_reader :original_pattern
  attr_reader :walk_anime
  attr_reader :step_anime
  
  attr_accessor :breathe_frames
  
  alias new_movement_ini initialize unless $@
  def initialize
    new_movement_ini
    @attack_count = 0
    @defense_count = 0
    @skill_count = 0
    @item_count = 0
    @breathe_frames = 32
    @moving = false
    @left_foot = false
  end

  def attacking?
    return @attack_count > 0
  end
  
  def defending?
    return @defense_count > 0
  end
  
  def using_skill?
    return @skill_count > 0
  end
  
  def using_item?
    return @item_count > 0
  end
  
  def straighten
    @pattern = @original_pattern
    @attack_count = 0
    @defense_count = 0
    @skill_count = 0
    @item_count = 0
    @anime_count = 0
    @prelock_direction = 0
  end
  
  def update
    if jumping?
      update_jump
    elsif moving?
      update_move
    elsif attacking?
      update_attack
    elsif defending?
      update_defense
    elsif using_skill?
      update_skill
    elsif using_item?
      update_item
    else
      update_stop
    end
    if @wait_count > 0
      @wait_count -= 1
      return
    end
    if @move_route_forcing
      move_type_custom
      return
    end
    if @starting or lock?
      return
    end
    if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
      case @move_type
      when 1  # Random
        move_type_random
      when 2  # Approach
        move_type_toward_player
      when 3  # Custom
        move_type_custom
      end
    end
  end

  def update_jump
    @jump_count -= 1
    @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
    @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
    jump_perc = 100 - ((@jump_count.to_f / (@jump_peak * 2)) * 100).to_i
    if jump_perc < 25
      @pattern = 0
    elsif jump_perc < 50
      @pattern = 1
    elsif jump_perc < 75
      @pattern = 2
    else
      @pattern = 3
    end
    @anime_count = 0
  end
  
  def update_move
    distance = 2 ** @move_speed
    if @y * 128 > @real_y
      @real_y = [@real_y + distance, @y * 128].min
    end
    if @x * 128 < @real_x
      @real_x = [@real_x - distance, @x * 128].max
    end
    if @x * 128 > @real_x
      @real_x = [@real_x + distance, @x * 128].min
    end
    if @y * 128 < @real_y
      @real_y = [@real_y - distance, @y * 128].max
    end
    if @moving == false
      @pattern = 0
      @anime_count = 0
    end
    @moving = true
    if New_Movement::TWO_STEPS_PER_TILE == false
      if @anime_count > 18 - @move_speed * 2
        @pattern = (@pattern + 1) % 4
        @anime_count = 0
      end
      if @walk_anime
        @anime_count += 1.5
      elsif @step_anime
        @anime_count += 1
      end
    else
      dx = (@real_x - @x * 128).abs
      dy = (@real_y - @y * 128).abs
      move_perc = [dx, dy].max
      move_perc = 100 - ((move_perc.to_f / 128) * 100).to_i
      if move_perc == 100
        @left_foot = !@left_foot
      end
      if move_perc < 50
        @pattern = @left_foot ? 0 : 2
      else
        @pattern = @left_foot ? 1 : 3
      end
      @anime_count = 0
    end
  end
  
  def update_stop
    if @moving == true
      @pattern = 0
      @anime_count = 0
    end
    @left_foot = false
    @moving = false
    @anime_count += 1
    if @step_anime
      anime_frames = 18 - @move_speed * 2
    else
      anime_frames = @breathe_frames
    end
    if @anime_count > anime_frames
      @pattern = (@pattern + 1) % 4
      @anime_count = 0
    end
    unless @starting or lock?
      @stop_count += 1
    end
  end
  
  def update_attack
    if @anime_count > 4
      @attack_count -= 1
      @pattern = @attack_count
      @anime_count = 0
    end
    @anime_count += 1
  end
  
  def update_defense
    @defense_count -= 1
    @pattern = 0
    @anime_count = 0
  end
  
  def update_skill
    if @anime_count > 4
      @skill_count -= 1
      @pattern = @skill_count
      @anime_count = 0
    end
    @anime_count += 1
  end
  
  def update_item
    if @anime_count > 4
      @item_count -= 1
      @pattern = @item_count
      @anime_count = 0
    end
    @anime_count += 1
  end
  
  def attack
    @attack_count = 4
    @anime_count = 0
  end
  
  def defense
    @defense_count = 20
  end
  
  def use_skill
    @skill_count = 4
    @anime_count = 0
  end
  
  def use_item
    @item_count = 4
    @anime_count = 0
  end

  def increase_steps
    @stop_count = 0
    @attack_count = 0
    @skill_count = 0
    @item_count = 0
  end
end
  
#==============================================================================
# ** Sprite_Character
#==============================================================================

class Sprite_Character < RPG::Sprite
    
  def idle?
    if moving? or jumping? or attacking? or defending? or using_skill? or
      using_item?
      return false
    else
      return true
    end
  end
  
  def moving?
    return (@character.moving? or @character.step_anime)
  end
  
  def jumping?
    return @character.jumping?
  end
  
  def attacking?
    return @character.attacking?
  end
  
  def defending?
    return @character.defending?
  end
  
  def using_skill?
    return @character.using_skill?
  end
  
  def using_item?
    return @character.using_item?
  end
  
  def update
    super
    
    @tile_id = @character.tile_id
    @character_name = @character.character_name
    @character_hue = @character.character_hue
    
    if @character.tile_id >= 384
      self.bitmap = RPG::Cache.tile($game_map.tileset_name,
        @tile_id, @character_hue)
      self.src_rect.set(0, 0, 32, 32)
      self.ox = 16
      self.oy = 32
      update_character
      return
    end
    
    idle_name   = "#{@character_name}_idle"
    walk_name   = "#{@character_name}_walk"
    jump_name   = "#{@character_name}_jump"
    attack_name = "#{@character_name}_attack"
    def_name    = "#{@character_name}_defense"
    skill_name  = "#{@character_name}_skill"
    item_name   = "#{@character_name}_item"
    
    self.bitmap = nil
    
    if idle?
      if chara_exist?(idle_name)
        self.bitmap = RPG::Cache.character(idle_name, @character_hue)
      end
    end
    if moving?
      if chara_exist?(walk_name)
        self.bitmap = RPG::Cache.character(walk_name, @character_hue)
      end
    end
    if jumping?
      if chara_exist?(jump_name)
        self.bitmap = RPG::Cache.character(jump_name, @character_hue)
      end
    end
    if attacking?
      if chara_exist?(attack_name)
        self.bitmap = RPG::Cache.character(attack_name, @character_hue)
      end
    end
    if defending?
      if chara_exist?(def_name)
        self.bitmap = RPG::Cache.character(def_name, @character_hue)
      end
    end
    if using_skill?
      if chara_exist?(skill_name)
        self.bitmap = RPG::Cache.character(skill_name, @character_hue)
      end
    end
    if using_item?
      if chara_exist?(item_name)
        self.bitmap = RPG::Cache.character(item_name, @character_hue)
      else
        if New_Movement::ITEM_WITH_SKILL_G == true
          if chara_exist?(skill_name)
            self.bitmap = RPG::Cache.character(skill_name, @character_hue)
          end
        end
      end
    end
    
    if bitmap.nil?
      self.bitmap = RPG::Cache.character(@character_name, @character_hue)
    end

    @cw = bitmap.width / 4
    @ch = bitmap.height / 4
    self.ox = @cw / 2
    self.oy = @ch
        
    pattern = @character.pattern
    if idle?
      if not chara_exist?(idle_name)
        pattern = @character.original_pattern
      end
    end
    if moving? and not @character.walk_anime
      if not chara_exist?(idle_name)
        pattern = @character.original_pattern
      end
    end
    if jumping?
      if not chara_exist?(jump_name)
        pattern = @character.original_pattern
      end
    end
    if attacking?
      if not chara_exist?(attack_name)
        pattern = @character.original_pattern
      end
    end
    if using_skill?
      if not chara_exist?(skill_name)
        pattern = @character.original_pattern
      end
    end
    if using_item?
      if not chara_exist?(item_name)
        pattern = @character.original_pattern
      end
    end
    
    sx = pattern * @cw
    sy = (@character.direction - 2) / 2 * @ch
    self.src_rect.set(sx, sy, @cw, @ch)
    
    update_character
  end
  
  def chara_exist?(filename)
    bitmap = RPG::Cache.character(filename, @character_hue) rescue nil
    return !bitmap.nil?
  end
  
  def update_character
    self.visible = (not @character.transparent)
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    if @character.animation_id != 0
      animation = $data_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
  end
end

FAQ

¿Cual es la diferencia entre usar un chara para el ataque (como el script) y usar una animación de batalla encima del jugador/evento?

1 - El gráfico tiene dirección, como cualquier otro chara.
2 - Evita espacio en la base de datos y tener que hacer algunos engines molestos.
3 - El gráfico ocupa mucho menos.
4 - Permite usar una animación de batalla encima (por ejemplo si quieres añadir la animación de espada cuando usas attack)
5 - Puedes checkar directamente si se está efectuando, por ejemplo usando $game_player.attacking?
6 - Limitado a 4 frames :(

¿Cual es la diferencia entre usar un método que te cambia el gráfico y usar un engine con Mover Ruta y cambiarlo desde ahí?

Simplicidad a la hora de enginear; se reduce a un método para hacer la animación y a uno para comprobar si se está haciendo. Además haciéndolo por engine no puedes traspasarlo a script en el caso de que quieras hacer ciertas virguerías. Parece una tontería pero tengo pensado hacer al menos un script que use éste para añadir bastantes funcionalidades imposibles de recrear por engine.

¿Todos los gráficos deben tener el mismo tamaño?

No, pero todos deben respetar la plantilla de los charas (4 x 4)

¿Cómo hago que una de las animaciones sea más rápida o lenta?

La de idle se controla usando los breathe_frames, con $game_player.breathe_frames = (valor)
Por defecto son 32 frames por frame.

En las de ataque, skill e item tienes que ir dentro de su update (update_attack, update_skill, update_item), y cambiar el número de frames necesarios para pasar de un frame al siguiente. Por defecto son 4 frames por frame.

La de defensa como solo es un gráfico se cambia el valor final dentro del def defense directamente. Por defecto son 20 frames.

¿Dónde consigo los gráficos necesarios o plantillas para hacerlos?

Mhm... Seguramente tendrás que hacértelos tú mismo.

En algunos mapas me da más lag del habitual. ¿Los antilag me sirven para compensarlo?

En general el aumento del lag no es muy considerable, pero en mapas grandes con muchos eventos sí puede que se note la diferencia.
Los antilag no sirven para compensarlo pero se podría hacer un antilag concreto para éste script que consistiera en hacer todas éstas comprobaciones nuevas solo a los eventos que de entrada se haya detectado que tienen algún gráfico de animación especial. Como he dicho el lag no es habitual por lo que no está en mis planes hacer eso.

¿Con qué scripts es incompatible?

Con los que alteren el update de Sprite_Character y el update (más sus partes update_move, update_stop y update_jump) de Game_Character.
Suelen ser scripts que alteran el modo en el que anda, se mueve o salta el personaje.

¿Se puede pasar a VX/Ace?

No creo que sea excesivamente complicado, pero yo no lo haré.

¿No deberías estar estudiando?

Pues casi que sí x_x Pero la mayoría de los que estáis leyendo ésto también, así que haremos como que somos buenos estudiantes y ya xD


Última edición por Wecoc el 2015-10-23, 17:18, editado 1 vez
avatar
Wecoc
Administrador
Administrador



Créditos 12203

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Definir animaciones de ataque, defensa y otros en los charas [BETA]

Mensaje por Ledai el 2015-10-22, 19:34

Parece que se ve muy interesante... solo tengo una pregunta... el uso del Script, es automático en algunas cosas (ejem:supongo que con el salto; el pararse o andar), pero yo quiero saber cómo hago para que se efectúe el cambio de gráfico (Ejem: Ataque) cuando le he dicho al personaje que realice dicha acción( Ejem: ese Ataque) Es decir, yo en mapa tengo configurado que al apretar X el personaje ataque y salga la animación y haga el daño en el evento enemigo (enguine de batalla estardar XD) ... etc... y ahora quiero que cambie automáticamente con el scrip los graficos de cada acción... ¿Cómo lo hago? o ¿Cómo sabe el Script que mi personaje está atacando para que efectué el cambio de gráfico? NO sé si se me entiende, pero con los otras acciones sí lo entiendo ya que son cosas preestablecidas del maker, correr, pararse, saltar, etc... pero con el atacar o el defenderse no lo entiendo, ya que no sé cómo decirle al script en qué momento está atacando... ¿Me expliqué?
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 5490

Gracias : 211

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Definir animaciones de ataque, defensa y otros en los charas [BETA]

Mensaje por Wecoc el 2015-10-22, 20:17

Está a las instrucciones del script:

Atacar
$game_player.attack
Mirar si está atacando
$game_player.attacking?

Defenderse
$game_player.defense
Mirar si se está defendiendo
$game_player.defending?

Usar habilidad
$game_player.use_skill
Mirar si está usando habilidad
$game_player.using_skill?

Usar objeto
$game_player.use_item
Mirar si está usando objeto
$game_player.using_item?

Y el nombre de los gráficos es éste:
Código:
#     (nombre)_attack
#     (nombre)_defense
#     (nombre)_skill
#     (nombre)_item
avatar
Wecoc
Administrador
Administrador



Créditos 12203

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Definir animaciones de ataque, defensa y otros en los charas [BETA]

Mensaje por Ledai el 2015-10-22, 20:36

Y otra cosita... ¿Las animaciones de ataque, objeto etc... duran 4 frames no? Es decir, ¿usan los cuatro frames de su chara respectivo y terminan de procesarse? o se quedan como si fueran un mover evento en parado hasta que vuelves a lanzar la llamada? (Supongo que es lo primero)

Siento preguntar, pero es que me ha gustado mucho el Script y no puedo probarlo en este momento... sin embargo si veo que me sirve, sería muy práctico a la hora de terminar lo que ando haciendo en este momento sin tanto enguine.

Gracias de verdad por estos aportes, que yo considero son MUY prácticos y funcionales.
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 5490

Gracias : 211

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Definir animaciones de ataque, defensa y otros en los charas [BETA]

Mensaje por Wecoc el 2015-10-22, 20:54

Los únicos que loopean son el idle (parado) y el walk (moverse). Y como dije el defense solo usa el primer frame, consideré que con un gráfico había suficiente, aunque es bastante fácil cambiar eso.

Spoiler:
Encontré un chara interesante en internet, las poses de magias pueden servir de referencia. Y los de arriba hacen gracia porque son las poses de los battlers xDDD

avatar
Wecoc
Administrador
Administrador



Créditos 12203

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Definir animaciones de ataque, defensa y otros en los charas [BETA]

Mensaje por Ledai el 2015-10-23, 16:55

Siento volver a la carga con esto, pero he podido probar el script, y la verdad es que lo he usado sin configurar ningún gráfico por ahora, es decir, están los gráficos que usaba antes y he notado que los personajes realizan movimientos espasmodicos al andar o caminar..., es decir, los graficos se translapan uno sobre otro... como liados y muy rápido; además de que parece que afecta al rendimiento ya que noto bajadas de fps que antes no estaban; no sé si será por no usar gráficos al andar y tal, pero lo advierto, por si son detalles a corregir.

Seguiré comprobando y ya contaré...
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 5490

Gracias : 211

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Definir animaciones de ataque, defensa y otros en los charas [BETA]

Mensaje por Wecoc el 2015-10-23, 17:18

@Wecoc escribió:No lo subí hasta ahora porque tenía un fallo pero creo que ya está todo listo.

Me refería a lo de los espasmos, creía haberlo arreglado pero no x_x"

Leda escribió:(...) además de que parece que afecta al rendimiento ya que noto bajadas de fps que antes no estaban

Veo que lo mejor será hacerle ese antilag como decía, pero ya desde el propio script. Todo el lag viene del update del Sprite_Character, pero para minimizarlo tendré que cambiar esa parte mucho, así que no sé cuanto tardaré en finalizarlo... De momento no uses ésta versión. Le he cambiado el nombre a versión 0.5 [BETA]

Para solucionar de raiz lo de los espasmos quitaré el idle (al fin y al cabo era de los menos interesantes, creo). Es el conflicto entre el idle y andar, sea con gráfico walk o no, lo que causa que hagan ese bailoteo loco.

El script en su versión 1.0 dejará pie a hacer el idle de nuevo de algún otro modo (creo que ya hay scripts que hacen eso), pero no lo tendrá por defecto.
avatar
Wecoc
Administrador
Administrador



Créditos 12203

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Definir animaciones de ataque, defensa y otros en los charas [BETA]

Mensaje por Ledai el 2015-10-23, 17:21

De todos modos, lo del idle es medio facil de hacer sin Script, usando el gráfico origen con animación en parado y que el dibujo del chara tenga la animación pertinente... así al andar cambia al gráfico de andando y si no anda, pues se está quietecito con su gráfico origen.

Me alegra que no sea problema mío, ya pensé que me lo había cargado yo XDD
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 5490

Gracias : 211

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Definir animaciones de ataque, defensa y otros en los charas [BETA]

Mensaje por Wecoc el 2015-10-27, 13:06

Bueno, lo he continuado un poco, está a la versión 0.6
Ya no hay el bug porque ya no hay el idle ni el walk... pero sigue habiendo lag.
Lo pongo para que testeéis otros bugs.

Además hice una versión ampliada del mismo script pero no funciona, si alguien logra hacerlo funcionar lo continuaría a partir de éste y no del otro.
El problema está dentro del def refresh_movements, eso seguro. La idea de éste nuevo script era poder definir un nuevo movimiento con una simple llamada.
Por ejemplo usarías ésto:

$game_system.define_movement("attack", 4)

Y ya a partir de ese momento podrías usar:

$game_player.attack
$game_map.events[ID].attack
$game_player.attack?
$game_map.events[ID].attack?


El 4 es el número de frames entre un frame y el siguiente. Luego se podría añadir otra opción de solo el primer frame como en la defensa actual y otra de concatenar como en lo del items com la animación de skill.

Ejemplo:

$game_system.define_movement("item", 4, false, "skill")

Está todo lo básico hecho y no da ningún error en la llamada, pero los métodos nuevos no se crean xDD (kill me please)

En fin, aquí las dos versiones.

Versión 0.6 normal:

Código:
#==============================================================================
# ** New Character Movement v0.6
#------------------------------------------------------------------------------
# Autor: Wecoc
#==============================================================================
# - Métodos para $game_player y $game_map.events[ID]
#     attack
#     defense
#     use_skill
#     use_item
#
#     attacking?
#     defending?
#     using_skill?
#     using_item?
#------------------------------------------------------------------------------
# - Gráficos opcionales para Characters:
#     (nombre)_jump
#     (nombre)_attack
#     (nombre)_defense
#     (nombre)_skill
#     (nombre)_item
#==============================================================================

module New_Movement
    
  # Si no hay gráfico (nombre)_item, carga el (nombre)_skill
  ITEM_WITH_SKILL_G = false
  
end

#==============================================================================
# ** Game_Character
#==============================================================================

class Game_Character
  
  attr_reader :original_pattern
  attr_reader :walk_anime
  attr_reader :step_anime
    
  alias new_movement_ini initialize unless $@
  def initialize
    new_movement_ini
    @attack_count = 0
    @defense_count = 0
    @skill_count = 0
    @item_count = 0
  end

  def attacking?
    return @attack_count > 0
  end
  
  def defending?
    return @defense_count > 0
  end
  
  def using_skill?
    return @skill_count > 0
  end
  
  def using_item?
    return @item_count > 0
  end
  
  def straighten
    @pattern = @original_pattern
    @attack_count = 0
    @defense_count = 0
    @skill_count = 0
    @item_count = 0
    @anime_count = 0
    @prelock_direction = 0
  end
  
  def update
    if jumping?
      update_jump
    elsif moving?
      update_move
    elsif attacking?
      update_attack
    elsif defending?
      update_defense
    elsif using_skill?
      update_skill
    elsif using_item?
      update_item
    else
      update_stop
    end
    if @anime_count > 18 - @move_speed * 2
      if not @step_anime and @stop_count > 0
        @pattern = @original_pattern
      else
        @pattern = (@pattern + 1) % 4
      end
      @anime_count = 0
    end
    if @wait_count > 0
      @wait_count -= 1
      return
    end
    if @move_route_forcing
      move_type_custom
      return
    end
    if @starting or lock?
      return
    end
    if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
      case @move_type
      when 1  # Random
        move_type_random
      when 2  # Approach
        move_type_toward_player
      when 3  # Custom
        move_type_custom
      end
    end
  end

  def update_jump
    @jump_count -= 1
    @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
    @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
    jump_perc = 100 - ((@jump_count.to_f / (@jump_peak * 2)) * 100).to_i
    if jump_perc < 25
      @pattern = 0
    elsif jump_perc < 50
      @pattern = 1
    elsif jump_perc < 75
      @pattern = 2
    else
      @pattern = 3
    end
    @anime_count = 0
  end
  
  def update_attack
    if @anime_count > 4
      @attack_count -= 1
      @pattern = @attack_count
      @anime_count = 0
    end
    @anime_count += 1
  end
  
  def update_defense
    @defense_count -= 1
    @pattern = 0
    @anime_count = 0
  end
  
  def update_skill
    if @anime_count > 4
      @skill_count -= 1
      @pattern = @skill_count
      @anime_count = 0
    end
    @anime_count += 1
  end
  
  def update_item
    if @anime_count > 4
      @item_count -= 1
      @pattern = @item_count
      @anime_count = 0
    end
    @anime_count += 1
  end
  
  def attack
    @attack_count = 4
    @anime_count = 0
  end
  
  def defense
    @defense_count = 20
  end
  
  def use_skill
    @skill_count = 4
    @anime_count = 0
  end
  
  def use_item
    @item_count = 4
    @anime_count = 0
  end

  def increase_steps
    @stop_count = 0
    @attack_count = 0
    @skill_count = 0
    @item_count = 0
  end
end


#==============================================================================
# ** Sprite_Character
#==============================================================================

class Sprite_Character < RPG::Sprite
  def jumping?
    return @character.jumping?
  end
  
  def attacking?
    return @character.attacking?
  end
  
  def defending?
    return @character.defending?
  end
  
  def using_skill?
    return @character.using_skill?
  end
  
  def using_item?
    return @character.using_item?
  end
  
  def update
    super
    @tile_id = @character.tile_id
    @character_name = @character.character_name
    @character_hue = @character.character_hue
    if @character.tile_id >= 384
      self.bitmap = RPG::Cache.tile($game_map.tileset_name,
        @tile_id, @character_hue)
      self.src_rect.set(0, 0, 32, 32)
      self.ox = 16
      self.oy = 32
      update_character
      return
    end
    
    jump_name   = "#{@character_name}_jump"
    attack_name = "#{@character_name}_attack"
    def_name    = "#{@character_name}_defense"
    skill_name  = "#{@character_name}_skill"
    item_name   = "#{@character_name}_item"
    
    self.bitmap = nil
    
    if jumping?
      if chara_exist?(jump_name)
        self.bitmap = RPG::Cache.character(jump_name, @character_hue)
      end
    end
    if attacking?
      if chara_exist?(attack_name)
        self.bitmap = RPG::Cache.character(attack_name, @character_hue)
      end
    end
    if defending?
      if chara_exist?(def_name)
        self.bitmap = RPG::Cache.character(def_name, @character_hue)
      end
    end
    if using_skill?
      if chara_exist?(skill_name)
        self.bitmap = RPG::Cache.character(skill_name, @character_hue)
      end
    end
    if using_item?
      if chara_exist?(item_name)
        self.bitmap = RPG::Cache.character(item_name, @character_hue)
      else
        if New_Movement::ITEM_WITH_SKILL_G == true
          if chara_exist?(skill_name)
            self.bitmap = RPG::Cache.character(skill_name, @character_hue)
          end
        end
      end
    end
    
    if bitmap.nil?
      self.bitmap = RPG::Cache.character(@character_name, @character_hue)
    end

    @cw = bitmap.width / 4
    @ch = bitmap.height / 4
    self.ox = @cw / 2
    self.oy = @ch
        
    pattern = @character.pattern
    if jumping?
      if not chara_exist?(jump_name)
        pattern = @character.original_pattern
      end
    end
    if attacking?
      if not chara_exist?(attack_name)
        pattern = @character.original_pattern
      end
    end
    if using_skill?
      if not chara_exist?(skill_name)
        pattern = @character.original_pattern
      end
    end
    if using_item?
      if not chara_exist?(item_name)
        pattern = @character.original_pattern
      end
    end
    
    sx = pattern * @cw
    sy = (@character.direction - 2) / 2 * @ch
    self.src_rect.set(sx, sy, @cw, @ch)
    
    update_character
  end
  
  def chara_exist?(filename)
    bitmap = RPG::Cache.character(filename, @character_hue) rescue nil
    return !bitmap.nil?
  end
  
  def update_character
    self.visible = (not @character.transparent)
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    if @character.animation_id != 0
      animation = $data_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
  end
end

Versión 0.6 Lunatic:

Código:
#==============================================================================
# ** New Character Movement v0.6 - Lunatic Version -
#------------------------------------------------------------------------------
# Autor: Wecoc
#------------------------------------------------------------------------------
# $game_system.define_movement("attack", 4) ==> $game_player.attack
#==============================================================================

class Game_System
  attr_accessor :moves
  alias new_movement_ini initialize unless $@
  def initialize
    new_movement_ini
    @moves = []
  end
  
  def define_movement(name, frames, concat=nil)
    @moves.delete_if{|x| x[0] == name}
    @moves.push([name, frames, concat])
  end
end

#==============================================================================
# ** Game_Character
#==============================================================================

class Game_Character
  alias new_movement_ini initialize unless $@
  def initialize
    new_movement_ini
    refresh_movements
  end
  
  def refresh_movements
    if @moves == $game_system.moves
      return
    end
    @moves = $game_system.moves
    for move in @moves
      name = move[0]
      frames = move[1]
      set_variable_instance("#{name}_counter".to_sym, 0)
      set_variable_instance("#{name}_frames".to_sym, frames)
      define_method("#{name}".to_sym) do
        eval("@#{name}_count = 0")
        @anime_count = 0
      end
      define_method("#{name}?".to_sym) do
        eval("@#{name}_count > 0")
      end
      define_method("update_#{name}".to_sym) do
        if @anime_count > eval("@#{name}_frames")
          eval("@#{name}_count -= 1")
          eval("@pattern = @#{name}_count")
          @anime_count = 0
        end
        @anime_count += 1
      end
    end
  end
  
  def straighten
    @pattern = @original_pattern
    for move in @moves
      name = move[0]
      eval("@#{name}_count = 0")
    end
    @anime_count = 0
    @prelock_direction = 0
  end
  
  def update
    if @moves != $game_system.moves
      refresh_movements
    end
    stop = true
    if jumping?
      update_jump
      stop = false
    elsif moving?
      update_move
      stop = false
    else
      for move in @moves
        name = move[0]
        if self.singleton_methods.include?("#{name}?".to_sym)
          if eval("#{name}?")
            eval("update_#{name}")
            stop = false
          end
        end
      end
    end
    if stop
      update_stop
    end
    if @anime_count > 18 - @move_speed * 2
      if not @step_anime and @stop_count > 0
        @pattern = @original_pattern
      else
        @pattern = (@pattern + 1) % 4
      end
      @anime_count = 0
    end
    if @wait_count > 0
      @wait_count -= 1
      return
    end
    if @move_route_forcing
      move_type_custom
      return
    end
    if @starting or lock?
      return
    end
    if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
      case @move_type
      when 1  # Random
        move_type_random
      when 2  # Approach
        move_type_toward_player
      when 3  # Custom
        move_type_custom
      end
    end
  end

  def update_jump
    @jump_count -= 1
    @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
    @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
    jump_perc = 100 - ((@jump_count.to_f / (@jump_peak * 2)) * 100).to_i
    if jump_perc < 25
      @pattern = 0
    elsif jump_perc < 50
      @pattern = 1
    elsif jump_perc < 75
      @pattern = 2
    else
      @pattern = 3
    end
    @anime_count = 0
  end
  
  def increase_steps
    @stop_count = 0
    for move in @moves
      name = move[0]
      eval("@#{name}_count = 0")
    end
  end
end


#==============================================================================
# ** Sprite_Character
#==============================================================================

class Sprite_Character < RPG::Sprite
  def update
    super
    if @moves != $game_system.moves
      @moves = $game_system.moves
    end
    @tile_id = @character.tile_id
    @character_name = @character.character_name
    @character_hue = @character.character_hue
    if @character.tile_id >= 384
      self.bitmap = RPG::Cache.tile($game_map.tileset_name,
        @tile_id, @character_hue)
      self.src_rect.set(0, 0, 32, 32)
      self.ox = 16
      self.oy = 32
      update_character
      return
    end
    
    self.bitmap = nil
    
    if @character.jumping?
      file_name = "#{@character_name}_jump"
      if chara_exist?(file_name)
        self.bitmap = RPG::Cache.character(file_name, @character_hue)
      end
    else
      for move in @moves
        name = move[0]
        if Game_Character.singleton_methods.include?("#{name}?".to_sym)
          if eval("@character.#{name}?")
            file_name = "#{@character_name}_#{name}"
            if chara_exist?(file_name)
              self.bitmap = RPG::Cache.character(file_name, @character_hue)
            end
            break
          end
        end
      end
    end
    if self.bitmap.nil?
      self.bitmap = RPG::Cache.character(@character_name, @character_hue)
    end
    
    @cw = self.bitmap.width / 4
    @ch = self.bitmap.height / 4
    self.ox = @cw / 2
    self.oy = @ch
    
    pattern = @character.pattern
    if @character.jumping?
      file_name = "#{@character_name}_jump"
      if not chara_exist?(file_name)
        pattern = @character.original_pattern
      end
    else
      for move in @moves
        name = move[0]
        if Game_Character.singleton_methods.include?("#{name}?".to_sym)
          if eval("@character.#{name}?")
            file_name = "#{@character_name}_#{name}"
            if not chara_exist?(file_name)
              pattern = @character.original_pattern
            end
            break
          end
        end
      end
    end
    sx = pattern * @cw
    sy = (@character.direction - 2) / 2 * @ch
    self.src_rect.set(sx, sy, @cw, @ch)
    update_character
  end
  
  def chara_exist?(filename)
    b = RPG::Cache.character(filename, @character_hue) rescue nil
    return !b.nil?
  end
  
  def update_character
    self.visible = (not @character.transparent)
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    if @character.animation_id != 0
      animation = $data_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
  end
end
avatar
Wecoc
Administrador
Administrador



Créditos 12203

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Definir animaciones de ataque, defensa y otros en los charas [BETA]

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.