Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3768 miembros registrados.
El último usuario registrado es lMac.

Nuestros miembros han publicado un total de 85831 mensajes en 12224 argumentos.

[XP] Script de evento que suelta items

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Script de evento que suelta items

Mensaje por Wecoc el 2017-03-07, 01:57

Éste script permite a un evento, normalmente un cofre, soltar items cerca de modo de el personaje pueda recogerlos. La fórmula que determina dónde cae el item es de lo más rudimentaria, y es ampliable, pero al menos por ahora lo dejaré así. Ya puse donde cambiarla en las instrucciones, para quien quiera hacer pruebas. No es un script muy complicado, solo hay varias cosas a tener en cuenta...

Para que un cofre suelte objetos, en éste hay que poner en Llamar Script:
drop_item(ID del item)
drop_weapon(ID del arma)
drop_armor(ID del protector)


Eso se sustituiría por los comandos "Cambiar objetos", "Cambiar armamento" y "Cambiar protector" respectivamente, es decir el engine del cofre al abrirse en sí, queda igual. Probadlo, veréis que es fácil de usar. Por cierto puede dropaer tantos objetos como se quiera pero puse la posibilidad de asignar un rango máximo, quedaría raro que te lo soltara muy lejos en el mapa. Con la fórmula por defecto ese rango son 2 tiles de distancia respecto al cofre.

Ponedlo encima de main. No requiere créditos.

Código:
#==============================================================================
# ** [XP] Drop items in map
#------------------------------------------------------------------------------
#  Éste script permite hacer que un cofre suelte items cerca.
#  La fórmula que determina dónde cae el item es de lo más rudimentaria, y es
#  ampliable. Viene definida dentro del método :nearest_passable.
#
#  Para que evento suelte un item, arma o protector:
#    drop_item(ID del item)
#    drop_weapon(ID del arma)
#    drop_armor(ID del protector)
#
# * Autor: Wecoc (no requiere créditos)
#==============================================================================

#==============================================================================
# * Game_System
#==============================================================================

class Game_System
 
  attr_accessor :dropped_items
  attr_accessor :drop_range
 
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  alias dropped_items_ini initialize unless $@
  def initialize
    dropped_items_ini
    # Hash con los eventos creados, por mapa (uso interno, no cambiar)
    @dropped_items = {}
    # Rango máximo hasta el que llegan los items. Pon 0 para desactivar.
    @drop_range = 0
  end
  #--------------------------------------------------------------------------
  # * Obtener valor @dropped_items a partir de un Game_Event
  #--------------------------------------------------------------------------
  def get_dropped_event(event)
    return if @dropped_items[$game_map.map_id] == nil
    return @dropped_items[$game_map.map_id].select {|ev| ev[0] == event}[0]
  end
end

#==============================================================================
# * Interpreter
#==============================================================================

class Interpreter
  #--------------------------------------------------------------------------
  # * Soltar item
  #--------------------------------------------------------------------------
  def drop_item(item_id)
    item = $data_items[item_id]
    return false if item.nil?
    drop_object(item)
    @wait_count = 4
  end
  #--------------------------------------------------------------------------
  # * Soltar arma
  #--------------------------------------------------------------------------
  def drop_weapon(weapon_id)
    item = $data_weapons[weapon_id]
    return false if item.nil?
    drop_object(item)
    @wait_count = 4
  end
  #--------------------------------------------------------------------------
  # * Soltar protector
  #--------------------------------------------------------------------------
  def drop_armor(armor_id)
    item = $data_armors[armor_id]
    return false if item.nil?
    drop_object(item)
    @wait_count = 4
  end
  #--------------------------------------------------------------------------
  # * Soltar objeto (uso interno)
  #--------------------------------------------------------------------------
  def drop_object(item)
    event = $game_map.events[@event_id]
    d = 10 - $game_player.direction
    dx = event.x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    dy = event.y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    nx, ny = *$game_player.nearest_passable(dx, dy)
    return false if nx == nil or ny == nil
    dx, dy = nx - event.x, ny - event.y
    event = RPG::Event.new(event.x, event.y)
    event.id = $game_map.events.size + 1
    new_event = Game_Event.new(@map_id, event)
    new_event.item = item
    new_event.instance_eval("@through = true")
    new_event.instance_eval("@trigger = #{Game_Character::ITEM_TRIGGER}")
    new_event.jump(dx, dy)
    new_event.set_item_commands
    if $game_system.dropped_items[@map_id].nil?
      $game_system.dropped_items[@map_id] = []
    end
    $game_system.dropped_items[@map_id].push([new_event, nx, ny])
    $game_map.events[event.id] = new_event
    refresh_map
  end
  #--------------------------------------------------------------------------
  # * Refrescar el mapa (uso interno)
  #--------------------------------------------------------------------------
  def refresh_map
    $game_map.refresh
    if $scene.is_a?(Scene_Map)
      $scene.instance_eval("@spriteset.dispose rescue nil")
      $scene.instance_eval("@spriteset = Spriteset_Map.new")
    end
  end
end

#==============================================================================
# * Game_Map
#==============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  # * Obtener información del mapa
  #--------------------------------------------------------------------------
  alias dropped_items_setup setup unless $@
  def setup(*args)
    dropped_items_setup(*args)
    setup_map_items
  end
  #--------------------------------------------------------------------------
  # * Vaciar items almacenados al entrar en el mapa
  #--------------------------------------------------------------------------
  def setup_map_items
    items = $game_system.dropped_items[@map_id]
    if !items.nil? && items.size > 0
      $game_system.dropped_items[@map_id] = []
    end
  end
end

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

class Sprite_Character < RPG::Sprite
  #--------------------------------------------------------------------------
  # * Update (nuevo bitmap con soporte para iconos)
  #--------------------------------------------------------------------------
  alias dropped_items_upd update unless $@
  def update
    dropped_items_upd
    if @character.item != nil
      self.bitmap = Bitmap.new(24 * 4, 24 * 4)
      icon_name = @character.item.icon_name
      if FileTest.exist?(icon_name + "_chr")
        src_bitmap = RPG::Cache.icon(icon_name + "_chr")
      else
        src_bitmap = RPG::Cache.icon(icon_name)
      end
      src_rect = Rect.new(0, 0, 24, 24)
      self.bitmap.blt(0, 0, src_bitmap, src_rect)
      self.ox = 12
      self.oy = 24
    end
  end
end

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

class Game_Character
 
  attr_accessor :item
 
  ITEM_SE      = "016-Jump02" # Sonido al recoger un item del suelo
  ITEM_TRIGGER  = 0 # Trigger del item (0: enter, 1: toparse, 2: colisionar)
 
  #--------------------------------------------------------------------------
  # * Definir los comandos propios del item (al recogerlo del suelo)
  #--------------------------------------------------------------------------
  def set_item_commands
    page = @event.pages[0]
    page.list.clear
    # Añadir item, arma o protector
    command = RPG::EventCommand.new
    command.code = case item
      when RPG::Item  then 126
      when RPG::Weapon then 127
      when RPG::Armor  then 128
    end
    command.parameters = [@item.id, 0, 0, 1]
    page.list.push(command)
    # Reproducir sonido
    command = RPG::EventCommand.new
    command.code = 250
    se = RPG::AudioFile.new(ITEM_SE, 80, 100)
    command.parameters = [se]
    page.list.push(command)
    # Llamar a script (borrar evento)
    command = RPG::EventCommand.new
    command.code = 355
    command.parameters = ["
    event = $game_map.events[@event_id]
    ev = $game_system.get_dropped_event(event)
    $game_system.dropped_items[$game_map.map_id].delete(ev)
    event.item = nil
    refresh_map
    event.instance_eval('@event.pages[0].list.clear')"]
    page.list.push(command)
    # Comando vacío (fin de evento)
    command = RPG::EventCommand.new
    command.code = 0
    page.list.push(command)
  end
  #--------------------------------------------------------------------------
  # * Comprobar si el objeto puede caer a una determinada coordenada
  #--------------------------------------------------------------------------
  def strict_passable?(x, y)
    return false if !passable?(x, y, 0)
    items = $game_system.dropped_items[$game_map.map_id]
    if !items.nil?
      if items.any? {|i| i[1] == x && i[2] == y}
        return false
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # * Fórmula para obtener la coordenada donde cae el item [mejorable]
  #--------------------------------------------------------------------------
  def nearest_passable(x, y)
    checked = []
    return [x, y] if strict_passable?(x, y)
    n = 0 ; checked.push([x, y])
    loop do
      n += 1
      for iy in (y - n)..(y + n)
        for ix in (x - n)..(x + n)
          next if checked.include?([ix, iy])
          return [ix, iy] if strict_passable?(ix, iy)
          checked.push([ix, iy])
        end
      end
      if $game_system.drop_range != 0
        return [nil, nil] if n >= $game_system.drop_range
      end
      return [nil, nil] if n >= [$game_map.width, $game_map.height].max
    end
  end
end

PD.- Sé que PTG hizo algo por el estilo, pero tampoco se parecen mucho, el mío es más estilo Action RPG.


Última edición por Wecoc el 2017-03-08, 23:49, editado 2 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12083

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Script de evento que suelta items

Mensaje por xXIsrael0499Xx el 2017-03-07, 09:39

Mmmm mola....bastante..gracias por el aporte...
e estado probando el script y e notado algunas cosas...

**  Para agarrar X Objeto debes pararte encima de el...pero cuando estas caminando y vas pulsando ENTER..no agarra ningún objeto...

Voy a tratar de explicarme mejor...imaginemos que estoy caminando y veo un objeto y como no me detengo a agarrarlo no puedo agarrarlo...
Se entiende? Perdón por mi vaga explicación....

Personalmente no considero esto como un error...pero si como algo a añadir en un futuro.. dependiendo de la persona que utilice el script...

Esto es un consejo para los que usan el Script
**  Dropando Objetos...me di cuenta de que era necesario tener un orden en los gráficos..ya que me paso que cuando puse...

Código:
drop_weapon(2)
drop_weapon(4)

Salieron dos espadas completamente iguales..y es que el maker es así...XD..
mi consejo es que trata de evitar tener gráficos idénticos...

** Cuando sueltas muchos Objetos.. lagea un poco..
Eso depende de la PC...

Cosas Que me Gustaron:

** Me gusto el hecho de que cada ves que te soltaba un objeto se iba organizando...
personalmente ese detalle me gusto...

** Me gusta la sencillez del script.. ya que cualquier puede modificarlo...
El que sabe XD

PD: más Action RPG XD
avatar
xXIsrael0499Xx
Principiante
Principiante

0/3

Créditos 1108

Gracias : 56

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Script de evento que suelta items

Mensaje por Wecoc el 2017-03-07, 11:50

Lo primero es porque los objetos resultantes son eventos normales con opción atravesar, para cambiar algo así hay que cambiar el modo en el que se activan los eventos atravesables. Puede interesar hacer que los recojas al pulsar una tecla distinta de enter por ejemplo, entonces necesitarás algo como el Event Trigger Keys.

Lo mismo con el lag; no causan más lag que un evento normal, y normalmente sin uso de antilag se empieza a notar a unos 50 eventos o así. No creo que ningún mapa tenga tantos cofres que dropeen tantas cosas xD

Me dejé de comentar que se puede usar un gráfico distinto al icono que usa el item. Debe ser otro icono que tenga el mismo nombre pero acabado con _chr, si existe carga ese en vez del gráfico normal.

Gracias por probarlo.
avatar
Wecoc
Administrador
Administrador



Créditos 12083

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Script de evento que suelta items

Mensaje por Producciones The Golden el 2017-03-07, 15:58

Mágicamente no puedo verificar si al agarrar el "item" va al inventario ya que me da un error el programa (rgss player ha dejado de funcionar) pero confío en que funciona bien. Por el resto... el item que bota del cofre... ejem ejem... bueno, no diré nada, ya que has hecho algo mucho más práctico que mi engine y con más utilidad ya que se pueden poner varios por mapa sin posibilidad de error...
Te felicito Wecoc, si no fuera porque ya hice mi propio engine este sería el primero de tus scripts que realmente implementaría en un proyecto.
Me resulta extraño que en tan corto script esté el salto del item, la verificación de pasabilidad por el tile, la adopción de sprite y demás... XD
Eso fue todo... hasta pronto! Warrior
avatar
Producciones The Golden
Veterano
Veterano

0/3

Créditos 637

Gracias : 60

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Script de evento que suelta items

Mensaje por Ledai el 2017-03-07, 17:38

Lo he probado y queda fenomenal!! solo he encontrado un micro Bug... pero no es en sí un bug, tiene que ver con un Error que sucede en algunos momentos al usar el maker. Me explico, tiene que ver con los ID de eventos, las cuales al crear un evento en el editor se van sumando, pero que luego al posteriormente borrarlo, la lista de ID de eventos se queda "desactualizada". Pues en el caso de este script, por ejemplo, hace que cuando el ID del cofre real, no coincide con el ID "Actualizada" el item del cofre se borra...

Pero vamos, que es solo un bug que se arregla, copipasteando y copiando todos los items del mapa para que las listas de ID se actualicen a las reales.

Lo único que pediría es un modo de configurar en el propio script o algo, el modo de agarrar el Item soltado; pudiendo ser entre tocar entrer, por toparse, o por colisión. y estaría de 10!!

Ed: LoL!! Lo que sí hace es acumular las Pictures que se muestran en pantalla... +.+ pone una sobre otra sobre otra!
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 2965

Gracias : 174

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Script de evento que suelta items

Mensaje por Wecoc el 2017-03-08, 23:51

Vale, he estado mirando el script y ya descubrí por qué fallaba tanto el menú de PTG como las pictures de Leda; era un problema con Spriteset_Map que ya he arreglado.

He actualizado el script para implementar lo del trigger de los eventos (pulsar Enter, toparse con héroe o colisionar), buscad ITEM_TRIGGER = 0 y lo cambiáis ahí (ya puse qué es cada número).

No mencioné qué pasa cuando cambias de mapa y vuelves a éste si había items en el suelo: desaparecen. Normalmente ya es lo que pasa en éste tipo de juegos, pero hacer que reaparecieran (o mejor dicho, se quedaran donde los has dejado) no sería difícil, en algún otro momento seguramente explique cómo ampliar el script para hacerlo.
avatar
Wecoc
Administrador
Administrador



Créditos 12083

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP SCRIPT ÉPICO (RECOMENDADO)

Mensaje por Producciones The Golden el 2017-03-09, 00:00

Problema solucionado.
RECOMIENDO ENORMEMENTE ESTE SCRIPT, ES UN GRAN DETALLE PARA CUALQUIER CLASE DE JUEGO.
Hasta pronto Warrior
avatar
Producciones The Golden
Veterano
Veterano

0/3

Créditos 637

Gracias : 60

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Script de evento que suelta items

Mensaje por AsFzKakarotto el 2017-04-06, 16:25

Hola… “Producciones The Golden” tiene razón… el script tira error (rgss player ha dejado de funcionar) al momento de coger el artículo y abrir el menú o cambiar de Mapa, pero yo ya descubrí el por que. El Mapa en que se usa este llamado de script para soltar los objetos no debe haber ni siquiera 1 trozo de Autotile en el mapa en cuestión. No se si esto les sucede a ustedes pero yo cuando no añado ningún autotile funciona perfectamente.

@Wecoc escribió:PTG tenía razón pero volví a subir el script, y ahora al menos yo lo he probado con autotiles y no da ningún error. Si lo tenías subido de antes, vuelve a copiarlo al proyecto. Si aún te da error con eso tendrás que pasarme una demo con el problema, porque soy incapaz de recrearlo.

Lo siento ... esta vez si funciono perfecto gracias Nuevamente Wecoc


Última edición por AsFzKakarotto el 2017-04-06, 18:12, editado 1 vez
avatar
AsFzKakarotto
Novato
Novato

0/3

Créditos 98

Gracias : 19

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Script de evento que suelta items

Mensaje por Wecoc el 2017-04-06, 16:58

PTG tenía razón pero volví a subir el script, y ahora al menos yo lo he probado con autotiles y no da ningún error. Si lo tenías subido de antes, vuelve a copiarlo al proyecto. Si aún te da error con eso tendrás que pasarme una demo con el problema, porque soy incapaz de recrearlo... podría ser una incompatibilidad o algo, pero es raro.
avatar
Wecoc
Administrador
Administrador



Créditos 12083

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Script de evento que suelta items

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.