godot:strategy_pattern
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
godot:strategy_pattern [2024/08/18 15:20] – supprimée - modification externe (Date inconnue) 127.0.0.1 | godot:strategy_pattern [2024/08/18 22:53] (Version actuelle) – ilan | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | Résumé de cette [[ https:// | ||
+ | |||
+ | Strategy Pattern : | ||
+ | Idée c'est de faire du code modulable. Le code fait appel à une fonction qui est ailleurs. | ||
+ | On crée un script global avec une fonction qui ne fait rien (pass ou autre) puis des sous scripts qui étendent le script global, avec des fonctions spécifiques. | ||
+ | |||
+ | Exemple avec un filtre de nombres, on aurait : | ||
+ | < | ||
+ | class_name NumFilter #on déclare le script global NumFilter | ||
+ | |||
+ | func is_filtered(num) -> bool : #fonction is filtered qui vérifie si on filtre ou non (vrai,faux condition booléenne) | ||
+ | return false #ne filtre rien | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | class_name EvenNumFilter #filtre les nombres pairs | ||
+ | extends Num Filter | ||
+ | |||
+ | func is_filtered(num) -> bool : | ||
+ | | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | class_name NegativeNumFilter #filtre les nombres négatifs | ||
+ | extends Num Filter | ||
+ | |||
+ | func is_filtered(num) -> bool : | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Une fois ces filtres créés on peut les utiliser comme ça : | ||
+ | |||
+ | < | ||
+ | |||
+ | var filter = EvenNumFilter.new() | ||
+ | filter_list(filter) | ||
+ | |||
+ | func filter_list(filter : NumFilter): #on met dans la fonction la variable filter qui a la classe NumFilter, donc les filtres puisque ils étendent (sont de la classe) NumFilter | ||
+ | var list = [-4, -2, 0, 1.35, 4, 5] | ||
+ | |||
+ | for x in list : | ||
+ | if filter.is_filtered(x): | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Ici ça n'a pas énormément d' | ||
+ | |||
+ | < | ||
+ | class_name FiveNumFilter | ||
+ | extends Num Filter | ||
+ | |||
+ | func is_filtered(num) -> bool : | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Un cas où ça à de l' | ||
+ | |||
+ | Donc on a la stratégie de base : | ||
+ | < | ||
+ | class_name BaseBulletStrategy | ||
+ | extends Resource | ||
+ | |||
+ | func apply_upgrade(bullet: | ||
+ | pass | ||
+ | |||
+ | </ | ||
+ | |||
+ | < | ||
+ | class_name DamageBulletStrategy | ||
+ | extends BaseBulletStrategy | ||
+ | |||
+ | func apply_upgrade(bullet: | ||
+ | bullet.damage += 5.0 | ||
+ | </ | ||
+ | |||
+ | Ou même ajouter des éléments à la balle comme des particules : | ||
+ | < | ||
+ | class_name ParticleBulletStrategy | ||
+ | extends BaseBulletStrategy | ||
+ | |||
+ | var particle_scene : PackedScene = preload(" | ||
+ | |||
+ | func apply_upgrade(bullet: | ||
+ | var spawned_particles : Node2D = particle_scene.instantiate() | ||
+ | bullet.add_child(spawned_particles) | ||
+ | spawned_particles.global_position = bullet.global_position | ||
+ | </ | ||
+ | |||
+ | Une fois qu'on a tout ça, on peut aller un cran plus loin et construire un système de ressources, c'est à dire des set de données qu'on attache à des objets qui vont utiliser les stratégies. | ||
+ | |||
+ | Alors on retravaille la stratégie de base pour quelle accepte une texture et un nom | ||
+ | < | ||
+ | class_name BaseBulletStrategy | ||
+ | extends Resource | ||
+ | |||
+ | @export var texture : Texture2D #une variable texture qui accepte une Texture2D | ||
+ | @export var upgrade_text : String #une variable texte qui accepte du texte | ||
+ | |||
+ | func apply_upgrade(bullet: | ||
+ | pass | ||
+ | </ | ||
+ | |||
+ | Ensuite on créer une ressource qu'on attache à des objets, une Area2D avec une CollisionShape2D, | ||
+ | |||
+ | < | ||
+ | @export var upgrade_label : Label | ||
+ | @export var sprite : Sprite2D | ||
+ | @export var bullet_strategy : BaseBulletStrategy | ||
+ | |||
+ | func _ready() -> void: | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | func on_body_entered(body: | ||
+ | if body is Player: | ||
+ | body.upgrades.append(bullet_strategy) #on ajoute la stratégie dans la liste des upgrades du joueur | ||
+ | queue_free() | ||
+ | |||
+ | </ | ||
+ | |||
+ | Finalement, l'arme applique toutes les stratégies comme cela | ||
+ | |||
+ | < | ||
+ | @onready var player : Player = get_owner() | ||
+ | |||
+ | for strategy in player.upgrades: | ||
+ | | ||
+ | </ | ||
+ | |||