Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[Ayuda] Character Shadow y Z en las animaciones

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [Ayuda] Character Shadow y Z en las animaciones

Mensaje por Ledai el 2015-11-25, 18:56

Código:
=begin
OZ Character Shadow v0.1
====================
Pone una sombra bajo el personaje. La sombra se separa del personaje si este salta.

Instrucciones:
  Colocar sobre main en un script aparte.
  Pueden cambiarse los valores predeterminados en este script para el nombre del
  gráfico de sombra, y el "offset" en las coordenadas X/Y.
  
  Para cambiar gráfico de sombra en un evento, utilizar una ruta de movimiento:
    <>Mover evento: -Script: shadow_name="sombra_nueva"
  
  También se puede cambiar usando un Llamar Script normal con lo siguiente:
  
    Eventos:
      ev = $game_map.events[@event_id]
      ev.shadow_name = "sombra_nueva"
    Personaje:
      $game_player.shadow_name = "sombra_nueva"
      
  Por último, se puede especificar una sombra por página de evento. Basta con
  poner una anotación en los comandos del evento que diga lo siguiente:
    
    SPRITE_SHADOW nombre_sombra_nueva
  
=end

#==============================================================================
#                INICIO DE CONFIGURACIÓN
#==============================================================================

class Game_Character
  
  #Valor por defecto para el nombre del gráfico de sombra.
  SPRITE_SHADOW = "shadow_char"
  
  #Desplazamiento en coordenada X (horizontal, en pixeles) respecto a la posición
  #actual del evento.
  SPRITE_OFFSET_X = 0
  
  #Desplazamiento en coordenada Y (vertical, en pixeles) respecto a la posición
  #actual del evento.
  SPRITE_OFFSET_Y = 20
  
  #Arreglo Z. Cambia a false si la sombra se te pone sobre cosas que no debía.
  SHADOW_ZFIX = false
end

#==============================================================================
#                    FIN DE CONFIGURACIÓN
#==============================================================================

#==============================================================================
# ** Game_Character (part 1)
#------------------------------------------------------------------------------
#  This class deals with characters. It's used as a superclass for the
#  Game_Player and Game_Event classes.
#==============================================================================

class Game_Character
  
  attr_accessor :shadow_name
  attr_accessor :shadow_offset_x
  attr_accessor :shadow_offset_y
  
  alias ozwecshadow_ini initialize unless $@
  def initialize
    ozwecshadow_ini
    @shadow_name =    SPRITE_SHADOW
    @shadow_offset_x = SPRITE_OFFSET_X
    @shadow_offset_y = SPRITE_OFFSET_Y
  end

  #--------------------------------------------------------------------------
  # * Get Screen Y-Coordinates with no jump variation
  #--------------------------------------------------------------------------
  def raw_screen_y
    return (@real_y - $game_map.display_y + 3) / 4 + 32
  end
end

class Game_Event < Game_Character
  attr_reader :page
end

#==============================================================================
# ** Sprite_Character
#------------------------------------------------------------------------------
#  This sprite is used to display the character.It observes the Game_Character
#  class and automatically changes sprite conditions.
#==============================================================================

class Sprite_Shadow < RPG::Sprite
  
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :character                # character
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    viewport  : viewport
  #    character : character (Game_Character)
  #--------------------------------------------------------------------------
  def initialize(viewport, character = nil)
    super(viewport)
    @character = character
    @page = nil
    update
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    ev = @character.page rescue nil
    if (ev != nil)
      check_page_note if (@page != ev)
    end
    
    # If tile ID, file name, or hue are different from current ones
    if (@tile_id != @character.tile_id ||
        check_character_properties ||
        check_shadow_properties)
      
      reset_character_properties
      
      # If tile ID value is valid
      if (@tile_id != nil) && (@tile_id >= 384)
        self.opacity = 0
      # If tile ID value is invalid
      else
        self.bitmap = RPG::Cache.character(@shadow_name, 0) rescue nil
        return if self.bitmap.nil?
        @cw = bitmap.width
        @ch = bitmap.height
        self.ox = @cw / 2
        self.oy = @ch
      end
    end
    
    # Set visible situation
    self.visible = (not @character.transparent)
    
    if @character.character_name == "" or @character.opacity == 0
      self.visible = false
    end
    
    # Set sprite coordinates
    self.x = @character.screen_x + @shadow_offset_x
    self.y = @character.raw_screen_y + @shadow_offset_y
    self.z = Game_Character::SHADOW_ZFIX ? @character.screen_z(16) : 0
    
    # Set opacity level, blend method, and bush depth
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
  end
  
  #=============================================================================
  #Helpers
  #=============================================================================
  def check_character_properties
    return (@character_name != @character.character_name ||
            @character_hue != @character.character_hue)
  end
  
  def check_shadow_properties
    return (@shadow_name != @character.shadow_name ||
            @shadow_offset_x != @character.shadow_offset_x ||
            @shadow_offset_y != @character.shadow_offset_y )
  end
  
  def reset_character_properties
    @character_name = @character.character_name
    @character_hue = @character.character_hue
    @shadow_name = @character.shadow_name
    @shadow_offset_x = @character.shadow_offset_x
    @shadow_offset_y = @character.shadow_offset_y
  end
  
  def check_page_note
    @character.page.list.each { |eventcommand|
      next unless (eventcommand.code==108 || eventcommand.code==408)
      eventcommand.parameters[0].gsub(/SPRITE_SHADOW[ ](.+)/) { @character.shadow_name=$1 }
    }
    @page = @character.page
  end
end

#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
#  This class brings together map screen sprites, tilemaps, etc.
#  It's used within the Scene_Map class.
#==============================================================================

class Spriteset_Map
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  alias oz_shadow_initialize initialize unless $@
  def initialize
    oz_shadow_initialize
    for i in $game_map.events.keys.sort
      sprite = Sprite_Shadow.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
    end
    @character_sprites.push(Sprite_Shadow.new(@viewport1, $game_player))
    update
  end
end
Solucionado: Error de prioridad en los Script  Sweat
Resulta que este script de Orochi funciona bien casi todo, pero la opción de cambiar las sombras mediante una llamada a sript dentro de un mover evento no veo que funcione... y la verdad es que sería util poder usarlo para no tener que configurar cada ID de evento que necesita un cambio... En fin, que no sé si el error es mío, pero pruebo a ejecutar el cambio y no ocurre nada (?)



Pendiente:
¿Se puede saber porqué este script me da error de sintaxis al usar una variable como especificación de Z en las animaciones?

http://www.mundo-maker.com/t6544-rmxp-z-de-animacion


Última edición por Leda el 2015-11-26, 00:23, editado 2 veces
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 4844

Gracias : 196

Volver arriba Ir abajo

RPG Maker XP Re: [Ayuda] Character Shadow y Z en las animaciones

Mensaje por Wecoc el 2015-11-25, 23:23

Recuerdo éste script, y estoy bastante seguro de que cuando lo probé funcionaba, así que probablemente sea una incompatibilidad con otro script.

Además éste script no reescribe nada sin usar alias así que deduzco que se trata de un script que tienes abajo de éste y modifica algo del Spriteset_Map o de los eventos, como un antilag. Una vez detectado éste script, si mis deducciones son correctas, poniéndolo encima en vez de debajo se debería solucionar el problema.

Spoiler:
avatar
Wecoc
Administrador
Administrador



Créditos 12385

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [Ayuda] Character Shadow y Z en las animaciones

Mensaje por Ledai el 2015-11-25, 23:39

Pues sí, tus deducciones son correctas Sherlock; pero no del todo... Ya que sí, el conflicto se produce con un Antilag, pero al subirlo sobre este, el problema empeora, ya que en ese caso ninguna sombra es visible... así que vamos a ir muy mal >.<
PD: Creo que ya conoces el Antilag al que me refiero...

Edt: La verdad es que me interesaría solo la función por llamada a script que sí funciona al estar debajo, solo que necesitaría que la llamada y el cambio pudiera efectuarse sobre el evento en el que está siendo ejecutado sin tener que configurar manualmente la ID, ya que la función está en un evento común al que lo laman bastantes eventos en distintos mapas... así que por eso lo de no tener que configurar la Id manualmente.
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 4844

Gracias : 196

Volver arriba Ir abajo

RPG Maker XP Re: [Ayuda] Character Shadow y Z en las animaciones

Mensaje por Wecoc el 2015-11-25, 23:58

Edt: La verdad es que me interesaría solo la función por llamada a script que sí funciona al estar debajo, solo que necesitaría que la llamada y el cambio pudiera efectuarse sobre el evento en el que está siendo ejecutado sin tener que configurar manualmente la ID, ya que la función está en un evento común al que lo laman bastantes eventos en distintos mapas... así que por eso lo de no tener que configurar la Id manualmente.

Pero si lo he entendido bien, eso puede hacerse sin cambiar ningún script, hay un atajo para ésto.

En vez de $game_map.events[ID] usas get_character(0) y ya funcionará con el evento actual (es decir el que llamó el evento común)

Ejemplo: get_character(0).shadow_name = (nombre)

Aún así no es muy... "pulcro" así que los scripters quisquillosos recomiendan obtener la id del evento con get_character y luego usar $game_map.events[id] para la llamada.

Ejemplo:

Código:
id = get_character(0).id
$game_map.events[id].shadow_name =
"001-Fighter01"
avatar
Wecoc
Administrador
Administrador



Créditos 12385

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [Ayuda] Character Shadow y Z en las animaciones

Mensaje por Ledai el 2015-11-26, 00:15

OK, solucionado por el método "pulcro" creo que ahora todo funciona bien, solo que temo que más adelante de algún tipo de conflicto con el antilag... (?)

Y ahora otra pregunta que no tiene que ver con el tema anterior el cual por ahora está resuelto:


¿Se puede saber porqué este script me da error de sintaxis al usar una variable como especificación de Z en las animaciones?

http://www.mundo-maker.com/t6544-rmxp-z-de-animacion
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 4844

Gracias : 196

Volver arriba Ir abajo

RPG Maker XP Re: [Ayuda] Character Shadow y Z en las animaciones

Mensaje por Wecoc el 2015-11-26, 16:29

Cambié el título del tema para que no haya confusión con el del script de Z en animación.

En fin, voy a ponerlo por puntos, porque con el comentario que hice antes (lo he borrado) no se entendía del todo el rompecabezas que tienes ahora mismo xD

1. El script de Orochii tiene un fallo en el initialize de Spriteset_Map que hace que el update se llame dos veces, causando lag al cargar la pantalla con el mapa (si tiene muchos eventos). No es un problema muy grave, se puede ignorar, pero mi consejo es cambiarlo.
Para arreglarlo habría que quitarle el alias y reescribir el initialize, lo cual es inviable porque también usas el script de antilag que lo modifica.
Otra opción es hacer un añadido al update de modo que se aborte si no hay las sombras definidas, solución que no me gusta.
De modo que lo mejor sería juntar el script de las sombras y el antilag en uno solo.

2. El script de Pokepik sería más adecuado rehacerlo de modo que la z de animación sea la que hay por defecto (2000), pero con opción via script de de definir otra z distinta. El método animation no se usa directamente por script, sinó animation_id, lo que complica bastante las cosas, habría que rehacer un poco el Game_Character para arreglar eso.
En todo caso, para que ese script funcione tiene que reescribir (sin alias) el update de Sprite_Character.
El problema es que el antilag casi seguro estará modificando éste update, de modo que si es así habría que juntar el script de Z en animación y el antilag en uno solo.

3. Si tienes algún otro script que modifique con o sin alias los initialize o update de Sprite_Character y Spriteset_Map, el nudo puede volverse desenredable.

En resumen, si me pasas el antilag intentaré juntar los tres scripts en uno, pero eso solo servirá si son los únicos scripts conflictivos.
avatar
Wecoc
Administrador
Administrador



Créditos 12385

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [Ayuda] Character Shadow y Z en las animaciones

Mensaje por Wecoc el 2015-11-26, 18:46

Gracias por mandármelo.

Buenas notícias, éste antilag no reescribe nada de Sprite_Character, lo recordaba mal.
En ese caso se puede dejar en dos scripts separados.

Junté el de Orochii y el antilag.
El de animación será un poco más difícil de arreglar pero también lo intentaré...

= EDIT ==============================================================

Bueno, ya lo hice xD

Código:
#==============================================================================
# ** [XP] Z de animación
#------------------------------------------------------------------------------
# Autor: Wecoc (inspirado en un script de Pokepik)
#==============================================================================

module RPG
  class Sprite < ::Sprite
    unless $@
      alias wec_zfix_ini initialize
      alias wec_zfix_ani animation
      alias wec_zfix_loop_ani loop_animation
    end
    
    def initialize(viewport = nil)
      wec_zfix_ini(viewport)
      @_animation_z = 2000
    end
    
    def animation(animation, hit, animation_z = 2000)
      wec_zfix_ani(animation, hit)
      @_animation_z = animation_z
    end

    def loop_animation(animation, animation_z = 2000)
      wec_zfix_loop_ani(animation)
      @_animation_z = animation_z
    end
    
    def animation_set_sprites(sprites, cell_data, position)
      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 = true
        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 = @_animation_z
        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

class Game_Character
  
  attr_accessor :animation_z
  
  alias wec_zfix_ini initialize unless $@
  def initialize
    wec_zfix_ini
    @animation_id = 0
    @animation_z = 2000
  end
  
  def animation(animation_id, animation_z = 2000)
    @animation_id = animation_id
    @animation_z = animation_z
  end
end

class Sprite_Character < RPG::Sprite
  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
    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_z)
      @character.animation_id = 0
    end
  end
end

class Interpreter
  def command_207
    character = get_character(@parameters[0])
    return true if character == nil
    character.animation_id = @parameters[1]
    character.animation_z = 2000
    return true
  end
end

Funciona así: Puedes usar las animaciones como siempre, y su z será 2000 (valor por defecto).

Pero también puedes aplicar una animación al jugador o a un evento así:

$game_player.animation(ID, Z)
$game_map.events[ID].animation(ID, Z)

Nuevamente puedes usar lo de get_character(0) para aplicar al evento actual.

En los dos métodos anteriores la Z es opcional, si solo pones la ID valdrá 2000 directamente.
avatar
Wecoc
Administrador
Administrador



Créditos 12385

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [Ayuda] Character Shadow y Z en las animaciones

Mensaje por Ledai el 2015-11-26, 21:44

¡Pues acabo de probarlo todo y está perfecto como siempre!
Por lo que hemos decidido darte las gracias desde el equipo Ahura al completo, no solo por esto, si no por tantas otras ocasiones...

http://ahurallg.blogspot.com.es/2015/11/creditos-para-wecoc.html

Muchas gracias y hasta otro día que regrese con más dudas muahahah XDD
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 4844

Gracias : 196

Volver arriba Ir abajo

RPG Maker XP Re: [Ayuda] Character Shadow y Z en las animaciones

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.