Últimos temas
» [Sugerencia]Limpieza de recursos viejos en el foro.
por Cuyo1786 Hoy a las 9:52 am

» Busco grupo para un inexperta pero con ganas
por BACA Hoy a las 1:41 am

» Buscando pixel artista, trabajo pagado.
por pixeloid Ayer a las 11:33 pm

» [MV]Butterfly Paradox
por DopellSerch Ayer a las 9:44 pm

» LMD - Lunas de Magia Divina
por Zaabos Ayer a las 12:46 am

» LA BRÚJULA DE ZAZA [VXACE]
por Pocari Dom Oct 20, 2019 1:29 pm

» [VXA]Resident Evil Menu
por DorFenn Dom Oct 20, 2019 1:42 am

» (RMMV) Precognition
por JapoZero Jue Oct 17, 2019 11:40 pm

» Ayuda, duda
por BACA Miér Oct 16, 2019 7:38 pm

» Duda con ventana de comandos en Script
por DorFenn Lun Oct 14, 2019 1:46 am

» Índice Scripts RGSS3
por ZororoWhite Dom Oct 13, 2019 12:24 am

» [VX Ace] Script para duplicar tamaño y escala de ventana del juego
por ZororoWhite Dom Oct 13, 2019 12:23 am


[Ace] Theo Insane Antilag - ¡El mejor jamás creado antilag para el Ace!

Ir abajo

[Ace] Theo Insane Antilag - ¡El mejor jamás creado antilag para el Ace! Empty [Ace] Theo Insane Antilag - ¡El mejor jamás creado antilag para el Ace!

Mensaje por InvariableZ el Vie Nov 09, 2018 9:04 am

Título: Theo Insane Antilag.
Autor: TheoAllen, TheoRGSS3, o simplemente Theo.
Créditos: Theo, Tsukihime, KilloZapit, Galv

¿Cómo estáis? :) Llevo mucho tiempo viendo toda clase de scripts "antilags", que lo único que hacen es dejar de actualizar los eventos fuera de la pantalla. Esto realmente no soluciona sino el 10% del problema. Por ende, son inefectivos. Y, de hecho, en muchos casos aparte de siquiera reducir el lag, son incompatibles con muchas cosas. Pues bien, hace ya hará... ¿algunos años? no lo sé, ya no recuerdo bien, creo que en el script decía. Hace algunos años que salió este maravilloso script hecho por TheoAllen, un muchacho que se ha ganado su fama por ser un excelente scripter, y por hacer el mejor sistema de batalla lateral para el RPG Maker VX Ace que exista hasta el momento (y sí, ¡superando al mítico Takentai). Tiene plétora de scripts útiles; pero este, muchachos, este es una joya.

Es el mejor antilag que hasta ahora se ha hecho, y es que utiliza un peculiar algoritmo de "búsqueda por tablero" (table search) entre otras cuestiones técnicas que manejan distintas optimizaciones en el juego. Este script, os digo, simplemente desvanecerá el lag en mapas donde hayan muchos eventos, o bien sea muy grande. Tan fácil como eso, lo desvanece. ¿Lo mejor? Es altamente compatible, salvo por scripts de movimiento por píxeles.

Yo conozco a este scripter desde que surgiere en los antiguos foros de RMVXAce (ahora RPGMakerCentral), y hace tanto tiempo yo le había comentado si podía distribuir algunos de sus scripts traducidos al español. Él no tuvo problema, así que yo compartí algunos, aunque no recuerdo donde. Quizá de hecho pude haberlo hecho aquí. ¡En fin! Que, tomando esa misma palabra de algunos años hará ya, me tomé el atrevimiento de traducir este script al español para traéroslo hoy aquí, para vosotros. Y solo para vosotros, pues muy vago soy para estar copipegando este post en otros foros que ya ni siquiera concurro.

Sin más dilatación, muchachos, he aquí el script.

Código:
#===============================================================================
# TheoAllen - Insane Anti Lag
# Version : 1.1
# Language : English
#-------------------------------------------------------------------------------
# Con ayuda de las siguientes personas :
# - Tsukihime
# - KilloZapit
# - Galv
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Contacto :
#-------------------------------------------------------------------------------
# *> http://www.rpgmakerid.com
# *> http://www.rpgmakervxace.net
# *> http://www.theolized.com
#===============================================================================
($imported ||= {})[:Theo_AntiLag] = true
#===============================================================================
# Change Logs:
# ------------------------------------------------------------------------------
# 2015.02.20 - Añadida la mejora del chequeador de páginas para poder trabajar con procesos paralelos.
# 2015.01.25 - Compatibilidad con "Shaz's Mouse Script". Ahora def events_xy siempre deberían
               #retornar un array.
#            - Arreglado el error 'undefined method delete_sprite for nilClass'
# 2015.01.01 - Arreglado el error inesperado 'undefined method spriteset for scene'
# 2014.12.05 - Completado
#===============================================================================
=begin

  ------------------------------------------
  *) Introducción :
  ------------------------------------------
  Como muchos de vosotros sabréis, el lag es un problema común en los juegos del RPG Maker.
  Quizá hayáis creído que se originaba por tener muchos eventos en el mapa. Y así, para evitar
  el lag, separasteis vuestro mapa y habéis limitado la cantidad de eventos.
  
  Y no estáis del todo errados, pues cuando tienes un montón de eventos el
  programa necesita chequearlos todos. Pero el motor no lo hace eficientemente. Este
  script incrementa la eficiencia de cómo los scripts predeterminados trabajan y 
  previene actualizaciones innecesarias en los eventos cuando no es requerido en pos
  de hacerlo más rápido.
  
  Sin embargo, no puedo garantizar que este script tenga alta compatibilidad debido a que
  sobreescribí casi todos los scripts predeterminados. Probablemente sea compatible con mis
  propios scripts, pero no estoy seguro del resto.
  
  #Nota del traductor: sí es ALTAMENTE compatible :P testeado con alrededor de 70
  scripts de toda índole y distintos autores a su vez.
  
  ------------------------------------------
  *) Método de uso :
  ------------------------------------------
  Coloca este script debajo de "Materials" pero arriba de "Main". Es recomendado
  colocarlo arriba de la mayoría de los otros scripts.
  
  #Nota del traductor: debe estar en el tope para mayor compatibilidad. Si acaso
  utilizáis el YEA - Core Engine de Yanfly, colocadlo justo debajo, pero hasta allí.
  Si utilizáis también algún script de la clase de "Fullscreen ++", también colocadlo debajo.
  Sin embargo, haced vuestras pruebas pertinentes. Usualmente cualquier problema de incompatibi-
  lidad se resuelve simplemente cambiando la prioridad del script, es decir, moviéndolo
  arriba o abajo.
  
  Selecciona el tipo de optimización disponible en la configuración.
  Puedes deshabilitar algunas optimizaciones si tienes problemas de compatibilidad.
  
  ------------------------------------------
  *) Términos de Uso : 
  ------------------------------------------
  Acredita a TheoAllen. Eres libre de editar este script por tu cuenta, mientras
  no lo clames como tuyo. Para uso comercial, no olvides enviarle una copia gratis.
  (A Theo)
  
  Otras personas adicionales que podrías colocar en los créditos están listados
  en el encabezado arriba. Deberías también darles una copia gratuita si tu juego
  será comercial ;)
  
=end
#==============================================================================
# Configuración :
#==============================================================================
module Theo
  module AntiLag
    
  #=============================================================================
  # *) Optimización usual
  #-----------------------------------------------------------------------------
  # Esta clase de optimziación es para uso normal. Esta configuración funcionará
  # SI la totalidad de eventos en el mapa ronda los 200 a 300.
  #=============================================================================
  
  #-----------------------------------------------------------------------------
    Optimize_XY     = true
  #-----------------------------------------------------------------------------
  # Por defecto, el chequeo de la posición de los eventos se realiza chequeándolos
  # a TODOS los que estén en el mapa. Si quieres chequear un evento en su posición
  # X, Y, revisará CADA evento si su posición concuerda. Usando esta optimización
  # todos los eventos serán registrados en el 'tablero del mapa' de manera que
  # el motor no chequee cada evento en el mapa, en cambio revisando sólo si está
  # en cierto tablero
  #
  # Se recomienda activar esta optimización colocándo su valor como "true". Sin
  # embargo, puede NO ser compatible con scripts de movimientos por píxeles debido
  # a éstos utilizando colisión por caja en vez de la cuadrilla.
  # Nota del traductor: terminología adecuada: hitbox o box collider, grid.
  #-----------------------------------------------------------------------------
  
  #-----------------------------------------------------------------------------
    Optimize_Event  = true
  #-----------------------------------------------------------------------------
  # Por defecto, si el motor necesita revisar si un evento ha iniciado, va a
  # revisar TODOS los eventos en el mapa. Y lo hace cada frame. Si tienes 200
  # eventos en el mapa, chequeará 60 x 200 eventos por segundo.
  #
  # Usando esta optimización, si el evento es iniciado, se añadirá a un registro.
  # Y luego el motor revisará si el evento está dentro de dicho registro.
  #-----------------------------------------------------------------------------
  
  #-----------------------------------------------------------------------------
    Optimize_Sprite = true
  #-----------------------------------------------------------------------------
  # By default, the engine still update every sprites which located off screen.
  # This might waste the time since updating it is not necessary sometimes. By
  # using this optimization, it ignores character sprite that already off screen
  # Por defecto, el motor actualiza los sprites incluso si están fuera de la
  # pantalla. Esto desperdicia tiempo ya que actualizarlos muchas veces no es
  # necesario. Utilizando esta optimización, el motor ignorará los sprites que
  # se encuentren fuera de la pantalla.
  #-----------------------------------------------------------------------------
    
  #=============================================================================
  # *) INSANE OPTIMIZATION (Optimización insana)
  #-----------------------------------------------------------------------------
  # This kind of optimization is to overcome the problem of using event beyond
  # 230 on the map which normal optimization is failed to do. This optimization
  # uses insane algorithm like table search and dispose any unecessary sprite on
  # the fly.
  # Esta optimización es para sobreponerse al problema de tener muchos eventos en
  # un mismo mapa. Para ello utiliza el algoritmo de búsqueda en tablero, y
  # elimina cualquier sprite innecesario en tiempo real.
  #=============================================================================
    
  #-----------------------------------------------------------------------------
    Table_Limit_Search = 90
  #-----------------------------------------------------------------------------
  # La búsqueda en tablero es su algoritmo personalizado para coger los eventos
  # que se hallen en el tablero del mapa. En vez de iterar todos los eventos y
  # chequear si están en la pantalla, revisará el tablero del mapa visible en vez.
  # Así, eventos localizados muy lejos del jugador no serán actualizados.
  # No obstante, cualquier evento cuya forma de inicio sea Proceso Paralelo o 
  # Inicio Automático, o que tengan una Ruta de Movimiento, seguirán siendo
  # actualizados.
  #
  # "Table limit search" (Límite de búsqueda en tablero) significa que si la
  # totalidad de eventos en el mapa sobrepasa el límite, este script modificará
  # su método al ya mencionado "búsqueda en tablero del mapa" Así no te preocuparás
  # de tener 999 e incluso 10.000 eventos en el mapa.
  #
  # Esta opción necesita que el valor "Optimize_XY" ubicado arriba sea "true".
  # Sin las comillas.
  #
  # Si no quieres utilizar este algoritmo, simplemente coloca su valor a "nil".
  # Sin las comillas.
  #-----------------------------------------------------------------------------
  
  #-----------------------------------------------------------------------------
    Table_Range_Search = 2
  #-----------------------------------------------------------------------------
  # Determina qué tan lejos se realizará la búsqueda en el tablero. Colocar 3
  # significará que buscará 3 tiles fuera de la pantalla, y así sucesivamente.
  #
  # Recordad que entre más alto sea el número, más afectará el rendimiento.
  # Valores recomendados circundan 2 a 4.
  #-----------------------------------------------------------------------------
  
  #-----------------------------------------------------------------------------
    Dispose_Sprite  = true
  #-----------------------------------------------------------------------------
  # Algunas veces, limitar los eventos que son actualizados no es suficiente.
  # Los objetos del sprite (???) aún así matan el rendimiento. Eliminar sprites
  # que se encuentran fuera de la pantalla afectará muy posivitivamente al
  # rendimiento. Esta optimización sólo se activa si se está usando el algoritmo
  # de búsqueda en tablero.
  #
  # Eliminar sprites en tiemp oreal puede ser problemático en ocasiones. Cuando
  # algo malo ocurra, si es que ocurre, sólo coloca este valor en "false".
  #-----------------------------------------------------------------------------
  
  #-----------------------------------------------------------------------------
    PageCheck_Enchancer = false
  #-----------------------------------------------------------------------------
  # Cuando un montón de eventos son puestos en un mismo mapa, y cada uno tiene, por
  # ejemplo, 20 páginas, y tienes procesos paralelos que cambian variables y/o
  # interruptores, de inmediato te darás cuenta del lag que provoca.
  #
  # Esta mejora solo refresca los eventos visibles en la pantalla o cuando el
  # evento está en un rango visible (???). De esta manera previene que se
  # actualicen todos los eventos. El jugador no se percatará de nada de esto pues
  # no podrá ver nada que no esté en su rango :p
  # ¡Aunque! Esta opción puede arruinar algunos sistemas, pues aún es experimental.
  #
  # #Nota del traductor: yo he preferido dejarla en false. Es una opción
  # dispensable, pero si aún así la queréis activar para ver qué tal va, adelante.
  #-----------------------------------------------------------------------------
  
  end
end

#===============================================================================

#-------------------------------------------------------------------------------
# *) Below this line is sacred place to visit. Unless you have enough skill,
# do not try to enter or any risk is yours.
#===============================================================================

#===============================================================================
# ** MapTable
#-------------------------------------------------------------------------------
#  This class used to register the event into 2D table to increase performance
#===============================================================================

class MapTable
  #-----------------------------------------------------------------------------
  # * Initialize
  #-----------------------------------------------------------------------------
  def initialize
    @table = []
    ($game_map.width + 1).times do |x|
      @table[x] = []
      ($game_map.height + 1).times do |y|
        @table[x][y] = []
      end
    end
  end
  #-----------------------------------------------------------------------------
  # * Set value
  #-----------------------------------------------------------------------------
  def set(x,y,val)
    @table[x][y] << val
  end
  #-----------------------------------------------------------------------------
  # * Get array
  #-----------------------------------------------------------------------------
  def get(x,y)
    @table[x][y]
  end
  
end

#===============================================================================
# ** Array
#===============================================================================

class Array
  
  # Just a fool proof
  def values
    return self
  end
  
end

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

class Game_Map
  #-----------------------------------------------------------------------------
  # * Public attributes
  #-----------------------------------------------------------------------------
  attr_accessor :event_redirect     # Redirect events
  attr_reader :forced_update_events # To keep force move route updated
  attr_reader :keep_update_events   # To keep parallel process updated
  attr_reader :cached_events        # To store event that need to be updated
  attr_reader :starting_events      # To store activated event
  attr_reader :table                # 2D Map table
  #-----------------------------------------------------------------------------
  # * Constant
  #-----------------------------------------------------------------------------
  EVENT_LIMIT = Theo::AntiLag::Table_Limit_Search
  RANGE = Theo::AntiLag::Table_Range_Search
  #-----------------------------------------------------------------------------
  # * Alias method : Setup Events
  #-----------------------------------------------------------------------------
  alias theo_antilag_setup_events setup_events
  def setup_events
    @table = MapTable.new
    @forced_update_events = []
    @keep_update_events = []
    @starting_events = []
    @refreshed_events = []
    theo_antilag_setup_events
    select_on_screen_events
  end
  #-----------------------------------------------------------------------------
  # * Overwrite method : Events
  #-----------------------------------------------------------------------------
  def events
    @event_redirect ? @cached_events : @events
  end
#///////////////////////////////////////////////////////////////////////////////
  if Theo::AntiLag::Optimize_XY
#///////////////////////////////////////////////////////////////////////////////
  #-----------------------------------------------------------------------------
  # * Overwrite method : Event XY
  #-----------------------------------------------------------------------------
  def events_xy(x, y)
    @table.get(x,y) || []
  end
  #-----------------------------------------------------------------------------
  # * Overwrite method : Event XY nt
  #-----------------------------------------------------------------------------
  def events_xy_nt(x, y)
    @table.get(x,y).select do |event| 
      event.pos_nt?(x, y) 
    end
  end
#///////////////////////////////////////////////////////////////////////////////
  end
#///////////////////////////////////////////////////////////////////////////////
  if Theo::AntiLag::Optimize_Event
#///////////////////////////////////////////////////////////////////////////////
  #-----------------------------------------------------------------------------
  # * Overwrite method : Setup starting event
  #-----------------------------------------------------------------------------
  def setup_starting_map_event
    event = @starting_events[0]
    event.clear_starting_flag if event
    @interpreter.setup(event.list, event.id) if event
    event
  end
  #-----------------------------------------------------------------------------
  # * Overwrite method : Any event starting?
  #-----------------------------------------------------------------------------
  def any_event_starting?
    !@starting_events.empty?
  end
#///////////////////////////////////////////////////////////////////////////////
  end
#///////////////////////////////////////////////////////////////////////////////
  #-----------------------------------------------------------------------------
  # * Overwrite method : Refresh
  #-----------------------------------------------------------------------------
  def refresh
    return table_refresh if table_update? && Theo::AntiLag::PageCheck_Enchancer
    @events.each_value {|event| next if event.never_refresh; event.refresh }
    @common_events.each {|event| event.refresh }
    refresh_tile_events
    @need_refresh = false
  end
  #-----------------------------------------------------------------------------
  # * New method : Refresh event by table search
  #-----------------------------------------------------------------------------
  def table_refresh
    @refreshed_events = []
    @tile_events = []
    @common_events.each {|event| event.refresh }
    @need_refresh = false
  end
  #-----------------------------------------------------------------------------
  # * Overwrite method : Update events
  #-----------------------------------------------------------------------------
  def update_events
    last_events = (@cached_events.dup rescue @events.values)
    select_on_screen_events
    events = @cached_events | @keep_update_events | @forced_update_events
    if Theo::AntiLag::Dispose_Sprite
      offscreen_events = last_events - events
      offscreen_events.each {|event| event.delete_sprite}
    end
    events.each {|event| event.update}
    @common_events.each {|event| event.update}
  end
  #-----------------------------------------------------------------------------
  # * New method : Select on screen events
  #-----------------------------------------------------------------------------
  def select_on_screen_events
    unless table_update?
      @cached_events = @events.values
      return
    end
    #---------------------------------------------------------------------------
    # * Table search algorithm
    #---------------------------------------------------------------------------
    new_dpx = display_x.to_i
    new_dpy = display_y.to_i
    dpx = loop_horizontal? ? new_dpx - RANGE : [new_dpx - RANGE, 0].max
    dpy = loop_vertical? ? new_dpy - RANGE : [new_dpy - RANGE, 0].max
    sw = (Graphics.width >> 5) + RANGE * 2
    sh = (Graphics.height >> 5) + RANGE * 2
    @cached_events = []
    sw.times do |x|
      sh.times do |y|
        xpos = loop_horizontal? ? (x + dpx) % width : x + dpx
        ypos = loop_vertical? ? (y + dpy) % height : y + dpy
        next if xpos >= width || ypos >= height
        ary = @table.get(xpos, ypos)
        ary.each do |ev| 
          unless @refreshed_events.include?(ev.id)
            ev.refresh
            @tile_events << ev if ev.tile?
            @refreshed_events << ev.id
          end
        end if Theo::AntiLag::PageCheck_Enchancer
        @cached_events += ary
      end
    end
    @cached_events.uniq!
  end
  #-----------------------------------------------------------------------------
  # * Check if table search need to be performed or not
  #-----------------------------------------------------------------------------
  def table_update?
    EVENT_LIMIT && @events.size > EVENT_LIMIT && Theo::AntiLag::Optimize_XY
  end
  
end

#===============================================================================
# ** Game_Temp
#===============================================================================

class Game_Temp
  attr_reader :event_sprites
  #-----------------------------------------------------------------------------
  # * Alias method : Initialize
  #-----------------------------------------------------------------------------
  alias theo_antilag_init initialize
  def initialize
    theo_antilag_init
    @event_sprites = {}
  end
  
end

#===============================================================================
# ** Game_CharacterBase
#===============================================================================

class Game_CharacterBase
  #-----------------------------------------------------------------------------
  # * Empty method : Sprite
  #-----------------------------------------------------------------------------
  def sprite
    return nil
  end
  #-----------------------------------------------------------------------------
  # * Empty method : Sprite = 
  #-----------------------------------------------------------------------------
  def sprite=(spr)
  end
  
end

#===============================================================================
# ** Game_Event
#===============================================================================

class Game_Event
  #-----------------------------------------------------------------------------
  # * Never refesh flag
  #-----------------------------------------------------------------------------
  attr_reader :never_refresh
  #-----------------------------------------------------------------------------
  # * Alias method : Initialize
  #-----------------------------------------------------------------------------
  alias theo_antilag_init initialize
  def initialize(map_id, event)
    theo_antilag_init(map_id, event)
    $game_map.table.set(x,y,self)
    @last_x = @x
    @last_y = @y
  end
  #-----------------------------------------------------------------------------
  # * Alias method : Update
  #-----------------------------------------------------------------------------
  alias theo_antilag_update update
  def update
    if (sprite && sprite.disposed?) || sprite.nil?
      spriteset = SceneManager.scene.spriteset
      return unless spriteset
      spriteset.add_sprite(self)
    end
    theo_antilag_update
    if Theo::AntiLag::Optimize_XY && (@last_x != @x || @last_y != @y)
      $game_map.table.get(@last_x, @last_y).delete(self)
      $game_map.table.set(@x,@y,self)
      @last_x = @x
      @last_y = @y
    end
  end
  #-----------------------------------------------------------------------------
  # * Alias method : Start
  #-----------------------------------------------------------------------------
  alias theo_antilag_start start
  def start
    theo_antilag_start
    return unless Theo::AntiLag::Optimize_Event
    $game_map.starting_events << self if @starting
  end
  #-----------------------------------------------------------------------------
  # * Alias method : Clear starting flag
  #-----------------------------------------------------------------------------
  alias theo_antilag_clear_start clear_starting_flag
  def clear_starting_flag
    theo_antilag_clear_start
    return unless Theo::AntiLag::Optimize_Event
    $game_map.starting_events.delete(self)
  end
  #-----------------------------------------------------------------------------
  # * Alias method : Setup page setting
  #-----------------------------------------------------------------------------
  alias theo_antilag_setup_page_settings setup_page_settings
  def setup_page_settings
    theo_antilag_setup_page_settings
    if @event.pages.size == 1 && no_condition?(@event.pages[0].condition)
      @never_refresh = true
    end
    if @trigger == 3 || @interpreter
      $game_map.keep_update_events << self
      $game_map.keep_update_events.uniq!
    else
      $game_map.keep_update_events.delete(self)
    end
  end
  #-----------------------------------------------------------------------------
  # * Check if the events has no page condition
  #-----------------------------------------------------------------------------
  def no_condition?(page)
    !page.switch1_valid && !page.switch2_valid && !page.variable_valid &&
      !page.self_switch_valid && !page.item_valid && !page.actor_valid
  end
  #-----------------------------------------------------------------------------
  # * Delete sprite
  #-----------------------------------------------------------------------------
  def delete_sprite
    sprset = SceneManager.scene.spriteset
    return unless sprset
    SceneManager.scene.spriteset.delete_sprite(sprite)
  end
  #-----------------------------------------------------------------------------
  # * Overwrite method : Force move route
  #-----------------------------------------------------------------------------
  def force_move_route(move_route)
    super
    $game_map.forced_update_events << self
    $game_map.forced_update_events.uniq!
  end
  #-----------------------------------------------------------------------------
  # * Overwrite method : Restore move route
  #-----------------------------------------------------------------------------
  def restore_move_route
    super
    $game_map.forced_update_events.delete(self)
  end
  #-----------------------------------------------------------------------------
  # * Overwrite method : Sprite
  #-----------------------------------------------------------------------------
  def sprite
    $game_temp.event_sprites[@id]
  end
  #-----------------------------------------------------------------------------
  # * Overwrite method : Sprite =
  #-----------------------------------------------------------------------------
  def sprite=(spr)
    $game_temp.event_sprites[@id] = spr
  end
  
end

#===============================================================================
# ** Sprite Character
#===============================================================================

class Sprite_Character
  #-----------------------------------------------------------------------------
  # * Alias method : Initialize
  #-----------------------------------------------------------------------------
  alias theo_antilag_init initialize
  def initialize(viewport, character = nil)
    character.sprite = self if character
    theo_antilag_init(viewport, character)
  end
  #-----------------------------------------------------------------------------
  # * Alias method : Update
  #-----------------------------------------------------------------------------
  alias theo_antilag_update update
  def update
    @sx = @character.screen_x
    @sy = @character.screen_y
    if Theo::AntiLag::Optimize_Sprite && !need_update?
      self.visible = false
      return
    end  
    theo_antilag_update
  end
  #-----------------------------------------------------------------------------
  # * New method : Determine if on screen
  #-----------------------------------------------------------------------------
  def need_update?
    return true if graphic_changed?
    return true if @character.animation_id > 0
    return true if @balloon_sprite
    return true if @character.balloon_id != 0
    w = Graphics.width
    h = Graphics.height
    cw = @cw || 32
    ch = @ch || 32
    @sx.between?(-cw,w+cw) && @sy.between?(0,h+ch)
  end
  #-----------------------------------------------------------------------------
  # * Overwrite update position.
  # To limit screen_x and screen_y to be called many times
  #-----------------------------------------------------------------------------
  def update_position
    move_animation(@sx - x, @sy - y)
    self.x = @sx
    self.y = @sy
    self.z = @character.screen_z
  end
  #-----------------------------------------------------------------------------
  # * Overwrite animation origin
  # Since X and Y axis of sprite is not updated when off screen
  #-----------------------------------------------------------------------------
  def set_animation_origin
    if @animation.position == 3
      if viewport == nil
        @ani_ox = Graphics.width / 2
        @ani_oy = Graphics.height / 2
      else
        @ani_ox = viewport.rect.width / 2
        @ani_oy = viewport.rect.height / 2
      end
    else
      @ani_ox = @sx - ox + width / 2
      @ani_oy = @sy - oy + height / 2
      if @animation.position == 0
        @ani_oy -= height / 2
      elsif @animation.position == 2
        @ani_oy += height / 2
      end
    end
  end
  
end

#===============================================================================
# ** Spriteset_Map
#===============================================================================

class Spriteset_Map
  #-----------------------------------------------------------------------------
  # * Alias method : create character
  #-----------------------------------------------------------------------------
  alias theo_antilag_create_characters create_characters
  def create_characters
    $game_map.event_redirect = Theo::AntiLag::Dispose_Sprite
    theo_antilag_create_characters
    $game_map.event_redirect = false
  end
  #-----------------------------------------------------------------------------
  # * New method : delete sprite
  #-----------------------------------------------------------------------------
  def delete_sprite(spr)
    return unless spr
    return if spr.disposed?
    @character_sprites.delete(spr)
    spr.dispose
  end
  #-----------------------------------------------------------------------------
  # * New method : add sprite
  #-----------------------------------------------------------------------------
  def add_sprite(char)
    spr = Sprite_Character.new(@viewport1, char)
    @character_sprites.push(spr)
  end
  
end

#===============================================================================
# ** Scene_Base
#===============================================================================

class Scene_Base
  attr_reader :spriteset
end

He añadido algunas notas en el script a modo de indicaciones. Si aún así necesitáis alguna ayuda, no dudéis en decirme :) Pero tened en cuenta que yo no soy scripter ni mucho menos, así que nada de "este script no me sirve con este otro", porque lamentablemente no os podré ayudar. Para lo que os puedo servir es sobre la utilización del script mismo.

Oh, y acoto que en algunos lados ha sido difícil traducir esto, pues Theo no tiene como lengua nativa el inglés, y en esos tiempos aún le costaba (aunque ahora ha mejorado bastante más jaja). Así que nada, disfrutad, al verdad. Para mí es un must-have (de tener sí o sí) en todos los proyectos.
InvariableZ
InvariableZ
PJ de Quest
PJ de Quest

Venezuela
RPG Maker : Ace
Mensajes : 33
Monedas : 786
Reputación : 27

Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.