Registrarse

[Essentials] Configurar essentials (17.2) para que corra a 60 fps (BETA)

MUDKIP

Chiquitito y Pegajoso
Hola Comunidad de Whack a Hack! Saludos para todos, soy el amigo Mudkip y quiero compartir un post que a más de uno le puede resultar de utilidad.

Todos quienes usamos RPG Maker Xp y pokemon Essentials principalmente nos hemos topado con el hecho de que nuestros juegos corren a lo mucho a 40 FPS exprimiendo al máximo las capacidades de nuestras tostadoras, y a pesar de eso aún así hay caídas de frames que arruinan toda la magia de la experiencia a la hora de jugar. (Motivo principal diría yo por el que Essentials aún sigue siendo una segunda opción para quienes aman esto de desarrollar fan games de pokemon.)

Bueno, intrusiando por las mías entre la ensalada de letras y códigos del mismo essentials pude configurarlo de manera que al menos el ingame básico (Caminar por el mundo, los eventos, las animaciones, los NPC) puedan verse a 60 fps de una manera sobria, sin que todo se despilfarre y todos los NPC corran como locos por el mapa sin darnos tiempo a entender que acaba de suceder.

Para esto vamos a tener que reemplazar cifras dentro de los mismos scripts existentes en el juego para que todo vaya entonadito, bueno al Asunto:

(Recordar que todas las menciones se hacen en la version 17.2 de essentials, para vesriones anteriores pueden variar aunque en esencia es lo mismo me imagino)

1- Ir al script RGSS2Compatibility, en la línea 67 verán que hay un comando que dice Graphics.frame_rate=40, y oh sorpresa, es el comando que define los frames a los que andarán nuestros proyectos, entonces cambian ese 40 por un 60 y quedaría así





BRAVO! Ya tienes tu juego a 60 fps, pero aquí nacen más problemas, si pruban su juego verán que sus npc corren por el mapa con endemoniados (ni tanto), las batallas siguen lentas y todo va muy rápido lo cual puede resultar incomodo sin dar tiempo a nuestros amigos a que digieran la trama con calma y se enamoren de nuestra maravillosa narrativa cierto? Jajaja.

2- Ahora toca modificar los textos para que no parezca una carrera de quien lee más rápido, para esto vamos al script PScreen_Options, principalmente desde la línea 138 hasta la 144, ahí se encuentra nuestro objetivo.
A ustedes les aparecerá algo asi:

Código:
def pbSettingToTextSpeed(speed)
  return 2 if speed==0
  return 1 if speed==1
  return -2 if speed==2
  return MessageConfig::TextSpeed if MessageConfig::TextSpeed
  return (Graphics.frame_rate>40) ? -2 : 1
end
Pues reemplazen todo esto por esta preciosura:

Código:
def pbSettingToTextSpeed(speed)
  return 3 if speed==0
  return 1.1 if speed==1
  return -1 if speed==2
  return MessageConfig::TextSpeed if MessageConfig::TextSpeed
  return (Graphics.frame_rate>60) ? -2 : 1
end
Y listo, los textos del juego se leerán como corresponde :D

3- Ahora toca modificar la prisa de nuestro protagonista que corre más que cuando nos da diarrea (que mal chiste)
Ir al script Game_CHaracter, en la línea 241 hasta la 285 debería haber algo asi:

Código:
def update_pattern
    return if  [MENTION=13890]Lock[/MENTION]_pattern
     [MENTION=42437]ani[/MENTION]me_count = 20 if !@step_anime && @stop_count>0
    if  [MENTION=42437]ani[/MENTION]me_count > 18-@move_speed*3
      if !@step_anime && @stop_count>0
        @pattern =  [MENTION=40591]Origi[/MENTION]nal_pattern
      else
        @pattern = (@pattern+1)%4
      end
       [MENTION=42437]ani[/MENTION]me_count = 0
    end
  end

  def update_jump
    @jump_count -= 1
    @real_x = (@real_x*@jump_count+@x*Game_Map.realResX)/(@jump_count+1)
    @real_y = (@real_y*@jump_count+@y*Game_Map.realResY)/(@jump_count+1)
    if !jumping? && !moving?
      Events.onStepTakenFieldMovement.trigger(self,self)
    end
  end

  def update_move
    distance = 2**@move_speed
    realResX = Game_Map.realResX
    realResY = Game_Map.realResY
    @real_x = [@real_x-distance,@x*realResX].max if @x*realResX<@real_x
    @real_x = [@real_x+distance,@x*realResX].min if @x*realResX>@real_x
    @real_y = [@real_y+distance,@y*realResY].min if @y*realResY>@real_y
    @real_y = [@real_y-distance,@y*realResY].max if @y*realResY<@real_y
    if !jumping? && !moving?
      Events.onStepTakenFieldMovement.trigger(self,self)
    end
    if @walk_anime
       [MENTION=42437]ani[/MENTION]me_count += 1.5
    elsif @step_anime
       [MENTION=42437]ani[/MENTION]me_count += 1
    end
  end
pues reemplazen todo eso por esta belleza:

Código:
def update_pattern
    return if  [MENTION=13890]Lock[/MENTION]_pattern
     [MENTION=42437]ani[/MENTION]me_count = 20 if !@step_anime && @stop_count>0
    if  [MENTION=42437]ani[/MENTION]me_count > 25-@move_speed*3
      if !@step_anime && @stop_count>0
        @pattern =  [MENTION=40591]Origi[/MENTION]nal_pattern
      else
        @pattern = (@pattern+1)%4
      end
       [MENTION=42437]ani[/MENTION]me_count = 0
    end
  end

  def update_jump
    @jump_count -= 1
    @real_x = (@real_x*@jump_count+@x*Game_Map.realResX)/(@jump_count+1)
    @real_y = (@real_y*@jump_count+@y*Game_Map.realResY)/(@jump_count+1)
    if !jumping? && !moving?
      Events.onStepTakenFieldMovement.trigger(self,self)
    end
  end

  def update_move
    distance = 1.75**@move_speed
    realResX = Game_Map.realResX
    realResY = Game_Map.realResY
    @real_x = [@real_x-distance,@x*realResX].max if @x*realResX<@real_x
    @real_x = [@real_x+distance,@x*realResX].min if @x*realResX>@real_x
    @real_y = [@real_y+distance,@y*realResY].min if @y*realResY>@real_y
    @real_y = [@real_y-distance,@y*realResY].max if @y*realResY<@real_y
    if !jumping? && !moving?
      Events.onStepTakenFieldMovement.trigger(self,self)
    end
    if @walk_anime
       [MENTION=42437]ani[/MENTION]me_count += 1.5
    elsif @step_anime
       [MENTION=42437]ani[/MENTION]me_count += 1
    end
  end
y su personaje caminara como corresponde.

4- Y finalmente un pequeño arreglo para que las batallas anden a 60 fps de igual forma:
Ir al evento Pokebattle_Battle, entre las líneas 2336 y 2346 deberían tener algo como esto:

Código:
def pbStartBattle(canlose=false)
    PBDebug.log("")
    PBDebug.log("******************************************")
    begin
      pbStartBattleCore(canlose)
    rescue BattleAbortedException
      @decision=0
      @scene.pbEndBattle(@decision)
    end
    return @decision
  end
entonces, seleccionan todo eso y lo reemplaza por este bombon:

Código:
def pbStartBattle(canlose=false)
    Graphics.frame_rate = 60
    PBDebug.log("")
    PBDebug.log("******************************************")
    begin
      pbStartBattleCore(canlose)
    rescue BattleAbortedException
      @decision=0
      @scene.pbEndBattle(@decision)
    end
    Graphics.frame_rate = 60
    return @decision
  end
(Aclaro que esta ultima configuracion corresponde a Caeles Caelum aunque modificado para 60 fps)

Y listo, las batallas andan a 60 fps 8)


Y en fin, eso es todo lo que e podido pillar por el momento, si alguien que sepa de esto pudiera ayudar a que los demás aspectos del juego (capturar, revisar menus, etc) puedan verse con sus tiempos reales sería genial.

Prueben sus proyectos y notaran la gran diferencia!

Por mi parte me despido adiosin :D ¡!!
 
Última edición:

Jessie

What goes around, comes around
Honestamente, estas modificaciones las veo como un tipo de cambio "estético" por así decirlo.
Si, podrían ser de ayuda para dar una apariencia más fluida al juego, pero yo no lo consideraría como una solución a largo plazo.

Me da gusto ver que aún hay quienes están dispuesto a investigar y mejorar diferentes aspectos de la plataforma y sus componentes.

Saludos.
 

Jaizu

Usuario mítico
Estoy de acuerdo con Jess, el problema es el motor de ruby que usa. Puedes hacer que X cosas vayan a 60fps, pero nunca estará pulido o irá siempre a sesenta. Además que hay muchos componentes (frames, animaciones, eventos) que están hechos para que funcionen a 40fps. Quiero decir, si fuese tan fácil como este post ya estaría implementado en Pokémon essentials, al menos como una opción.

Y con este mensaje no te quiero desmotivar ni nada por el estilo, me alegro que te hayas esforzado en mejorar el código actual y buscar soluciones a tus problemas.
 

MUDKIP

Chiquitito y Pegajoso
Como solución parche funciona al menos, para los que busquen algo que les deje fluidez esta bien.

:D
 
Arriba