Augmenter/Diminuer progressivement le zoom de la map en fonction d'une variable

4 Réponses • 120 Vues

Mud'

Graphiste

Hey !
Pour pouvoir faire des petites transitions sympa et fluides (scroll de la caméra + zoom), je me suis dit qu'augmenter/diminuer progressivement le zoom de la map (et non le changer de 0.1 toutes les x frames) pouvait bien rendre. J'ai essayé un truc pour le zoom est sans cesse remis à 1.

Ce que je voulais faire est : le zoom de la map s'incrémente ou se décrémente de 0.01 à chaque frame pour s'arrêter sur la valeur d'une variable spécifique pour faire un truc fluide. :)

Voici ce que j'ai fait :
# Dans Game_Map.update
if $scene.is_a?(Scene_Map) && $scene.spriteset.map_viewport.zoom != $map_zoom
  if $scene.spriteset.map_viewport.zoom > $map_zoom
    $scene.spriteset.map_viewport.zoom -= 0.01
  elsif $scene.spriteset.map_viewport.zoom < $map_zoom
    $scene.spriteset.map_viewport.zoom += 0.01
  end
end
(Rey m'a dit sur le Discord d'éviter d'utiliser des variables globales, mais j'ai juste pas encore changé car je sais pas par quoi)
En théorie, si la variable est supérieure au zoom, le zoom s'incrémente, et si la variable est inférieure au zoom, le zoom se décrémente. Mais ça a pas l'air d'être le cas...

Le rendu est un peu épileptique car ça zoom et ça dézoom à chaque frame...
Humain mais Gobou.
Doublure officielle de Gobou.

PSDK

Nuri Yuri

HostMaster

Salut, de mémoire la fonction de zoom du viewport retourne une valeur incorrecte (bug dans le LiteRGSS). De ce fait il faudrait utiliser une méthode intelligente pour changer le zoom: les énumérateurs ( https://ruby-doc.org/core-3.0.1/Enumerator.html )

# Dans Game_Map.update <= surtout pas !!!! ça doit au mieux être dans Spriteset_Map via un hook
if $scene.is_a?(Scene_Map) && $map_zoom_enumerator
  $scene.spriteset.map_viewport.zoom = (zoom = $map_zoom_enumerator.next)
  $map_zoom_enumerator = nil if $map_zoom_enumerator.last == zoom
end
Une fois que tu as ce code en place, si tu veux zoomer :
$map_zoom_enumerator = 1.1.step(2, 0.1)
Ca va zoomer de 1.1 jusqu'à 2 avec un step de 0.1
Si tu veux dezoomer:
$map_zoom_enumerator = 1.9.step(1, -0.1)
Ca va dézoomer de 1.9 jusqu'à 1 avec un step de -0.1

PS: Il vaudrait mieux utiliser un Yuki::Animation de type scalaire sur la propriété zoom=, ça sera beaucoup plus fluide et fps agnostic
ln(yo) = <3

Mud'

Graphiste

ah merci Yuri :)
pour Yuki::Animation, je verrai après la .25, vu que y a l'air d'avoir eu de grosses modifs' :)
Humain mais Gobou.
Doublure officielle de Gobou.

Mud'

Graphiste

Alors, j'ai fait ça :
class Spriteset_Map
  def update_map_zoom
    if $scene.is_a?(Scene_Map) && $map_zoom_enumerator
      $scene.spriteset.map_viewport.zoom = (zoom = $map_zoom_enumerator.next)
      $map_zoom_enumerator = nil if $map_zoom_enumerator.last == zoom
    end
  end
  Hooks.register(self, :update, 'Update Map Zoom') { update_map_zoom }
end
Et dès que j'exécute une des commandes que t'as mis plus haut, le jeu crash avec comme erreur :
================================Erreur de script================================
Message :
undefined method `last' for #<Enumerator: 1.0:step(2, 0.1)>

Type : NoMethodError
Script : 02000 Map Zoom.rb (user)
Ligne : 5
Date : 08/05/2021 15:28:05
Game Version : 256
Logiciel : Pokémon SDK 24.87
===================================Backtraces===================================
[21] : 02000 Map Zoom.rb (user) | ligne 5 update_map_zoom
[20] : 02000 Map Zoom.rb (user) | ligne 8 <class:Spriteset_Map>
[19] : 00010 Hooks.rb (PSDK) | ligne 51 instance_exec
[18] : 00010 Hooks.rb (PSDK) | ligne 51 exec_hooks
[17] : 00010 Hooks.rb (PSDK) | ligne 50 each
[16] : 00010 Hooks.rb (PSDK) | ligne 50 exec_hooks
[15] : 00600 Script_RMXP/03500 Spriteset_Map.rb (PSDK) | ligne 241 update
[14] : 01400 GamePlay/00200 Scene_Map.rb (PSDK) | ligne 28 update_graphics
[13] : 01400 GamePlay/00200 Scene_Map.rb (PSDK) | ligne 17 update
[12] : 01400 GamePlay/00000 GamePlay__Base.rb (PSDK) | ligne 294 main_process
[11] : 01400 GamePlay/00000 GamePlay__Base.rb (PSDK) | ligne 158 main
[10] : tools/GameLoader/Z_main.rb (PSDK) | ligne 17 <top (required)>
[9] : tools/GameLoader/3_load_extensions.rb (PSDK) | ligne 45 rgss_main
[8] : tools/GameLoader/50_load_game_uncompiled.rb (PSDK) | ligne 32 <top (required)>
[7] : /lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb (ruby) | ligne 59 require
[6] : /lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb (ruby) | ligne 59 require
[5] : ScriptLoad.rb (PSDK) | ligne 124 load_tool
[4] : tools/GameLoader/Z_load_uncompiled.rb (PSDK) | ligne 10 <top (required)>
[3] : /lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb (ruby) | ligne 59 require
[2] : /lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb (ruby) | ligne 59 require
[1] : ScriptLoad.rb (PSDK) | ligne 124 load_tool
[0] : Game.rb (RMXP) | ligne 24 <main>
===================================Fin du log===================================
Fallait définir $map_zoom_enumerator avant ?
Humain mais Gobou.
Doublure officielle de Gobou.

Nuri Yuri

HostMaster

AH bah du coup mon code ne fonctionne pas sur .24 ^^'
Parce que c'est du code valid en Ruby 3.0 et pas en 2.5
ln(yo) = <3

There was an error while thanking
Thanking...