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
| Besoin | Classe | Méthode à surcharger | Valeur par défaut |
|---|---|---|---|
| Fond différent | sous-classe GenericBase | background_filename | 'team/Fond' |
| Barre de boutons différente | sous-classe GenericBase | button_background_filename | 'tcard/button_background' |
| Pas d'animation de fond | sous-classe GenericBase | create_background_animation | Animation de défilement |
| Classe de bouton ctrl personnalisée | sous-classe GenericBase | control_button_class | ControlButton |
| Texture de bouton différente | sous-classe ControlButton | button_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_filenameetcreate_background_animationétaient là depuis le guide de la scène ; on ajoute le reste maintenant.button_background_filenamerenvoie la barre du bas thématisée (graphics/interface/mystery_gift/button_background.png).control_button_classrenvoie la sous-classeControlButtonimbriquée ; lecreate_control_buttonhérité l'utilise automatiquement -- pas besoin de réécrire la création des boutons.- La
ControlButtonimbriquée hérite deGenericBase::ControlButtonet ne surcharge quebutton_texturepour utilisermystery_gift/buttons. Elle hérite de tout le reste (état pressé, icône de touche, libellé). control_button_default_cacherenvoie:interfacepour que la texture des boutons se charge depuisgraphics/interface/comme le reste de nos assets, au lieu du cachepokedexpar défaut. Pas besoin de surchargerinitialize.- La texture
buttonssuit 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
GenericBasepour un fond et une barre de boutons personnalisés -- surchargezbackground_filename,button_background_filename,create_background_animation. - Personnalisez les textures de boutons avec une sous-classe imbriquée de
GenericBase::ControlButton-- jamaisprepend, qui est global. - Surchargez
control_button_classpour renvoyer votre sous-classe ; pas besoin de réécrirecreate_control_button. - Les textures de boutons personnalisées suivent le format spritesheet 2×2.
- Utilisez
GenericBaseMultiModequand une scène a besoin de libellés de boutons différents selon l'état.