Créer un fond de combat pour la caméra 3D
Ce guide explique comment construire un fond de combat pour la caméra de combat 3D dynamique de PSDK : une classe Ruby qui empile des couches de sprites, les anime, et est sélectionnée par le nom de fond du combat.
Ceci est un guide avancé. On suppose qu'on sait déjà ajouter un script personnalisé à son projet et écrire une petite classe Ruby. Il s'appuie sur la notion de fond de combat 2D classique, qui n'est qu'une image.
Activer la caméra 3D
La caméra de combat 3D dynamique est un réglage de projet, désactivé par défaut. Elle est exposée dans le code par Battle::BATTLE_CAMERA_3D, qui lit Configs.settings.is_use_battle_camera_3d (la clé isUseBattleCamera3d dans Data/configs/settings_config.json). On l'active dans les réglages de son projet.
Une fois activée, le combat utilise Battle::Visual3D à la place du Battle::Visual classique.
Comment fonctionne un fond de combat 3D
Sans la caméra 3D, un fond de combat est une simple image plate. Une fois activée, le combat est une scène 3D que la caméra parcourt en se déplaçant et en s'inclinant : une image plate ne suffit donc plus, le fond est reconstruit en une pile de couches de sprites, le ciel loin derrière, le sol au milieu, les arbres devant, et la caméra se déplace à travers elles pour créer de la profondeur.
Chaque fond de combat est donc une petite classe Ruby, une sous-classe de BattleUI::Battleback3D, qui fait jusqu'à trois choses :
- déclarer où vivent ses images, via
resource_path, - empiler ses couches de sprites, dans
create_graphicsavecadd_battleback_element, - et, en option, les animer dans
create_animations.
Le moteur fournit un exemple à étudier, BattleUI::BattleBackGrass, dans 5 Battle/01 Scene/0 BattleUI/700 BattleBackForest3D.rb. Ce guide construit la même structure, étape par étape.
Placer les ressources
On place ses images dans le dossier graphics/battlebacks/ de son projet. On garde un sous-dossier par fond de combat, ici graphics/battlebacks/animated_camera/BattleBack Forest/. Cela reste gérable une fois qu'un projet en compte des dizaines.
Un fond de combat minimal
On commence par le plus petit fond possible : une seule couche plein écran. On sous-classe Battleback3D, on pointe resource_path vers son sous-dossier (relatif à graphics/battlebacks/), et on ajoute un élément dans create_graphics :
module BattleUI
class BattleBackForest < Battleback3D
def resource_path
'animated_camera/BattleBack Forest/'
end
def create_graphics
@field = add_battleback_element(@path, 'field')
end
end
end
add_battleback_element(@path, 'field') charge field.png depuis son dossier comme une couche plein écran. On n'appelle jamais create_graphics soi-même : la classe de base l'exécute à la création du fond. (Si le fond a besoin de la scène de combat, on la stocke avec @scene = scene dans son propre initialize qui appelle super ; la classe de base ne la conserve pas.)
Cette classe existe mais aucun combat ne l'utilise encore. L'étape suivante la branche.
L'afficher dans un combat
Un fond de combat 3D est choisi par Battle::Visual3D#create_background, à partir du background_name du combat. Par défaut, la caméra 3D utilise le fond d'herbe intégré pour tous les combats ; donc pour afficher le sien, on préfixe create_background par prepend et on retourne sa classe pour le nom voulu, avec un repli sur le défaut via super :
module Battle
class Visual3D
module ForestBackground
def create_background
if background_name == 'back_grass' # le nom auquel répond votre fond de combat
@background = BattleUI::BattleBackForest.new(viewport, @scene)
else
super
end
end
end
prepend ForestBackground
end
end
On lance un combat sur de l'herbe et son fond à une couche apparaît. À partir de là, on ajoute profondeur et mouvement à la même classe.
Ajouter des couches
Un fond convaincant empile plusieurs couches. On les ajoute dans create_graphics, de l'arrière vers l'avant : chaque nouvel élément se place devant le précédent. On stocke chaque sprite dans une variable d'instance pour pouvoir l'animer plus tard :
def create_graphics
@field = add_battleback_element(@path, 'field')
@ground = add_battleback_element(@path, 'ground')
@sky = add_battleback_element(@path, 'sky')
@cloud1 = add_battleback_element(@path, 'cloud1')
@cloud2 = add_battleback_element(@path, 'cloud2')
@trees1 = add_battleback_element(@path, 'trees1')
@trees2 = add_battleback_element(@path, 'trees2')
end
add_battleback_element(path, name, x, y, z, zoom) prend :
path: le dossier, normalement@path(sonresource_path).name: le nom de fichier de l'image, sans extension.x,y: la position, mesurée depuis le centre de la zone visible. Par défaut, ils placent une couche plein écran centrée, ce que veut la plupart des couches.z: à quelle distance la couche se situe en arrière.1est à l'échelle, une valeur plus grande la recule et la rapetisse, et0est interdit.zoom: l'échelle, utilisée pour compenser lez.
Seuls path et name sont obligatoires ; le reste a des valeurs par défaut raisonnables.
Animer les couches
Pour faire bouger une couche, comme des nuages qui défilent, on surcharge create_animations. On appelle d'abord super, on ajoute des lecteurs Yuki::Animation dans @animations, et on les démarre. Le fond met à jour @animations tout seul à chaque frame, donc on ne câble pas la boucle de mise à jour soi-même :
def create_animations
super
start_x = -(Graphics.width / 2 + MARGIN_X)
@animations << create_animation_cloud(@cloud1, start_x, Graphics.width / 2 + MARGIN_X, 60)
@animations << create_animation_cloud(@cloud2, start_x, 2 * start_x, 60)
@animations.each(&:start)
end
Ici, create_animation_cloud est un petit helper qui construit une animation de déplacement en boucle pour un sprite ; le BattleBackGrass fourni en contient le code complet. Construire les animations elles-mêmes relève du système d'animation de PSDK, un sujet à part entière. Ce qui compte pour le fond de combat, c'est le contrat ci-dessus : on crée et on démarre les animations dans create_animations, on les garde dans @animations, et la classe les pilote.
Choisir un nom de fond
background_name est résolu à partir du combat : le fond de combat explicite défini sur la carte (la commande RPG Maker XP « Changer le fond de combat », ou un BattleInfo), sinon le type de zone de la carte. Les noms que PSDK connaît par défaut sont listés dans Battle::Logic::BattleInfo::BACKGROUND_NAMES :
back_building(le défaut quand rien d'autre ne correspond)back_grass,back_tall_grass,back_taller_grassback_cave,back_mount,back_sandback_pond,back_sea,back_under_waterback_ice,back_snow
Pour un fond ponctuel, comme un dresseur précis ou une rencontre légendaire, on définit une image de fond personnalisée avec la commande « Changer le fond de combat » avant le combat, puis on fait correspondre son nom dans create_background. Le nom est le nom de fichier de l'image sans son extension : choisir battleback legendary arceus.png fait que background_name vaut 'battleback legendary arceus'.
Jour, nuit, et limitations
add_battleback_elementremplace une image par une variante selon le moment de la journée quand elle existe. Avec le système jour/nuit actif, il cherche un suffixe_morning,_day,_sunsetou_nightsur le nom de l'image et utilise ce fichier s'il est présent, sinon l'image simple. Livrerfield_night.pngà côté defield.pngsuffit donc à avoir une version de nuit.- Les fonds
.gifne sont pas gérés avec la caméra 3D. Les gifs animés ne fonctionnent qu'avec le visual 2D classique ; avec la caméra 3D, on anime les sprites viacreate_animations.
Conclusion
- On active la caméra 3D avec le réglage de projet
is_use_battle_camera_3d; les fonds deviennent alors des classes Ruby. - On commence minimal : sous-classer
BattleUI::Battleback3D, définirresource_path, ajouter une couche danscreate_graphics, et l'enregistrer en préfixantBattle::Visual3D#create_backgroundpar prepend. - On ajoute de la profondeur en empilant d'autres couches avec
add_battleback_element, de l'arrière vers l'avant. - On ajoute du mouvement dans
create_animations(appelersuper, remplir@animations, les démarrer) ; la classe les met à jour à chaque frame. - On étudie le
BattleBackGrassfourni (700 BattleBackForest3D.rb) comme implémentation de référence.