Outils pour utilisateurs

Outils du site


godot:strategy_pattern

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
godot:strategy_pattern [2024/08/18 16:12] ilangodot:strategy_pattern [2024/08/18 22: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 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. +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 60: Ligne 60:
 class_name BaseBulletStrategy class_name BaseBulletStrategy
 extends Resource extends Resource
- 
-@export var texture : Texture2D = preload("res://Art/Kenney/carrot.png") 
-@export var upgrade_text : String = "Speed" 
  
 func apply_upgrade(bullet: Bullet): func apply_upgrade(bullet: Bullet):
Ligne 68: Ligne 65:
  
 </code> </code>
 +
 +<code>
 class_name DamageBulletStrategy class_name DamageBulletStrategy
 extends BaseBulletStrategy extends BaseBulletStrategy
Ligne 73: Ligne 72:
 func apply_upgrade(bullet: Bullet): func apply_upgrade(bullet: Bullet):
  bullet.damage += 5.0  bullet.damage += 5.0
 +</code>
 +
 +Ou même ajouter des éléments à la balle comme des particules :
 <code> <code>
 +class_name ParticleBulletStrategy
 +extends BaseBulletStrategy
  
 +var particle_scene : PackedScene = preload("res://Objects/Scenes/bullet_particles.tscn")
 +
 +func apply_upgrade(bullet: Bullet):
 + var spawned_particles : Node2D = particle_scene.instantiate()
 + bullet.add_child(spawned_particles)
 + spawned_particles.global_position = bullet.global_position
 </code> </code>
  
 +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
 <code> <code>
 +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: Bullet):
 + pass
 </code> </code>
 +
 +Ensuite on créer une ressource qu'on attache à des objets, une Area2D avec une CollisionShape2D, un sprite, un label, avec le script suivant
  
 <code> <code>
 +@export var upgrade_label : Label
 +@export var sprite : Sprite2D
 +@export var bullet_strategy : BaseBulletStrategy
 +
 +func _ready() -> void:
 + body_entered.connect(on_body_entered)
 + sprite.texture = bullet_strategy.texture
 + upgrade_label.text = bullet_strategy.upgrade_text
 +
 +func on_body_entered(body: PhysicsBody2D):
 + if body is Player:
 +  body.upgrades.append(bullet_strategy) #on ajoute la stratégie dans la liste des upgrades du joueur 
 +  queue_free()
 +
 </code> </code>
 +
 +Finalement, l'arme applique toutes les stratégies comme cela 
 +
 +<code>
 +@onready var player : Player = get_owner()
 +
 +for strategy in player.upgrades: #comme d'hab avec ça, strategy est un nom au hasard, c'est le nom de variable qu'on donne aux éléments dans player.upgrades
 + strategy.apply_upgrade(spawned_bullet)
 +</code>
 +
  
godot/strategy_pattern.1723990377.txt.gz · Dernière modification : 2024/08/18 16:12 de ilan