Aller au contenu principal
Voir
Mystery Gift — Etape 11 / 11Personnaliser GenericBase
1. Préparer les assets et les textes avant de créer une UI
2. Créer une scène UI
3. Créer une Composition
4. Créer un composant SpriteStack
5. Ajouter une couche de données avec PFM
6. Gérer les entrées clavier
7. Gérer la souris
8. Ajouter du texte multilingue
9. Utiliser les dialogues de confirmation
10. Créer des animations
11. Personnaliser GenericBase

Personnaliser GenericBase

Ce guide s'appuie sur toute la série : vous avez une scène Mystery Gift entièrement fonctionnelle. Dans le guide de la scène, on avait écrit un MysteryGiftBase minimal qui ne changeait que le fond. Ici, on le termine -- une barre de boutons et des boutons ctrl thématisés -- c'est le dernier changement de la scène.

Principe

GenericBase est la fondation de toute scène UI : fond, barre de boutons, boutons ctrl et win_text. Ne reconstruisez jamais ces éléments de zéro -- héritez de GenericBase et surchargez ses méthodes privées. Elle utilise le patron Template Method : les valeurs en dur sont extraites dans des méthodes privées surchargeables.

Pour les boutons ctrl, utilisez l'héritage (une sous-classe imbriquée), jamais prepend : prepend est global et changerait les boutons de toutes les scènes du jeu.

Méthodes surchargeables

BesoinClasseMéthode à surchargerValeur par défaut
Fond différentsous-classe GenericBasebackground_filename'team/Fond'
Barre de boutons différentesous-classe GenericBasebutton_background_filename'tcard/button_background'
Pas d'animation de fondsous-classe GenericBasecreate_background_animationAnimation de défilement
Classe de bouton ctrl personnaliséesous-classe GenericBasecontrol_button_classControlButton
Texture de bouton différentesous-classe ControlButtonbutton_texture'buttons'

Terminer MysteryGiftBase

Modifiez scripts/20 MysteryGift/003 GamePlay/000 Base.rb vers sa version complète :

module UI
# Custom base UI for the Mystery Gift scene
class MysteryGiftBase < GenericBase
private

# Return the background filename
# @return [String]
def background_filename
return 'mystery_gift/background'
end

# Return the button background filename
# @return [String]
def button_background_filename
return 'mystery_gift/button_background'
end

# Return the class used to create control buttons
# @return [Class]
def control_button_class
return ControlButton
end

# Disable the background scroll animation
def create_background_animation; end

# Return the default cache used by control buttons
# @return [Symbol]
def control_button_default_cache
return :interface
end

# Custom control button with mystery gift theme
class ControlButton < GenericBase::ControlButton
private

# Use the mystery gift button texture
# @return [String]
def button_texture
return 'mystery_gift/buttons'
end
end
end
end
  • background_filename et create_background_animation étaient là depuis le guide de la scène ; on ajoute le reste maintenant.
  • button_background_filename renvoie la barre du bas thématisée (graphics/interface/mystery_gift/button_background.png).
  • control_button_class renvoie la sous-classe ControlButton imbriquée ; le create_control_button hérité l'utilise automatiquement -- pas besoin de réécrire la création des boutons.
  • La ControlButton imbriquée hérite de GenericBase::ControlButton et ne surcharge que button_texture pour utiliser mystery_gift/buttons. Elle hérite de tout le reste (état pressé, icône de touche, libellé).
  • control_button_default_cache renvoie :interface pour que la texture des boutons se charge depuis graphics/interface/ comme le reste de nos assets, au lieu du cache pokedex par défaut. Pas besoin de surcharger initialize.
  • La texture buttons suit le format spritesheet 2×2 décrit dans le guide de préparation (colonne A/X/Y, colonne B ; ligne normale, ligne pressée ; séparateurs transparents d'1px).

Pourquoi l'héritage, pas prepend

prepend insère un module dans la chaîne de recherche de la classe d'origine -- il affecte tous les ControlButton du jeu, dans toutes les scènes. Une sous-classe imbriquée n'affecte que la scène qui l'instancie : Mystery Gift crée son ControlButton local, tandis que l'équipe, le PC et toutes les autres scènes gardent GenericBase::ControlButton intact.

GenericBaseMultiMode

Quand différents états de scène ont besoin de libellés de boutons différents, utilisez GenericBaseMultiMode au lieu de GenericBase :

texts = [
[scene_text(0), nil, nil, scene_text(1)], # mode 0: Confirm + Back
[scene_text(2), scene_text(3), nil, scene_text(1)] # mode 1: Edit + Delete + Back
]
keys = [%i[A X Y B], %i[A X Y B]]
@base_ui = UI::GenericBaseMultiMode.new(@viewport, texts, keys)

@base_ui.mode = 1 # switch to Edit + Delete + Back
  • Toutes les configurations de boutons sont passées à la construction ; basculez avec mode= et les libellés se mettent à jour. Mystery Gift n'en a pas besoin (ses boutons ne changent jamais), mais c'est l'outil à utiliser quand c'est le cas.

Essayez

Ouvrez la scène une dernière fois :

GamePlay.open_mystery_gift

La barre du bas et les boutons A/B utilisent maintenant le thème Mystery Gift. La scène est complète : parcourez les cadeaux réclamés au clavier ou à la souris, entrez un code avec A, et regardez la bannière lors d'une réclamation réussie.

Conclusion

  • Héritez toujours de GenericBase pour un fond et une barre de boutons personnalisés -- surchargez background_filename, button_background_filename, create_background_animation.
  • Personnalisez les textures de boutons avec une sous-classe imbriquée de GenericBase::ControlButton -- jamais prepend, qui est global.
  • Surchargez control_button_class pour renvoyer votre sous-classe ; pas besoin de réécrire create_control_button.
  • Les textures de boutons personnalisées suivent le format spritesheet 2×2.
  • Utilisez GenericBaseMultiMode quand une scène a besoin de libellés de boutons différents selon l'état.