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 13:40] – ilan | godot:strategy_pattern [2024/08/18 20:53] (Version actuelle) – ilan | ||
|---|---|---|---|
| Ligne 3: | Ligne 3: | ||
| Strategy Pattern : | Strategy Pattern : | ||
| Idée c'est de faire du code modulable. Le code fait appel à une fonction qui est ailleurs. | Idée c'est de faire du code modulable. Le code fait appel à une fonction qui est ailleurs. | ||
| - | On créer | + | 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 : | Exemple avec un filtre de nombres, on aurait : | ||
| Ligne 32: | Ligne 32: | ||
| < | < | ||
| - | func filter_list(filter : NumFilter): | + | |
| + | var filter = EvenNumFilter.new() | ||
| + | filter_list(filter) | ||
| + | |||
| + | func filter_list(filter : NumFilter): | ||
| var list = [-4, -2, 0, 1.35, 4, 5] | var list = [-4, -2, 0, 1.35, 4, 5] | ||
| Ligne 40: | Ligne 44: | ||
| </ | </ | ||
| + | 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: | ||
| + | | ||
| + | </ | ||
godot/strategy_pattern.1723988444.txt.gz · Dernière modification : de ilan
