Outils pour utilisateurs

Outils du site


godot:strategy_pattern

Ceci est une ancienne révision du document !


Résumé de cette vidéo

Strategy Pattern : 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.

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 : 
 return num % 2 == 0 #ça dit si le numéro modulo deux fait bien 0, donc pair, donc tej
class_name NegativeNumFilter #filtre les nombres négatifs
extends Num Filter

func is_filtered(num) -> bool : 
 return num < 0 #ça dit si le numéro est inférieur à zéro, donc négatif, donc tej

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):
   list.remove(x)

Ici ça n'a pas énormément d'intérêt parce que ça rallonge le code mais en tout cas la partie filtre est complète, si on veut filtrer différemment il suffit de créer un autre script qui étend NumFilter avec une autre fonction, par exemple :

class_name FiveNumFilter
extends Num Filter

func is_filtered(num) -> bool : 
 return num % 5 == 0

Un cas où ça à de l'intérêt c'est s'il faut beaucoup de filtres différents (un rts par ex) ou dans le cas où il faut appliquer plusieurs upgrades. On peut avoir plusieurs stratégies, plusieurs scripts qui se rapportent à un, et passer l'objet (une balle par exemple) à travers chaque upgrade, chaque script d'une certaine class.

Donc on a la stratégie de base :

class_name BaseBulletStrategy
extends Resource

@export var texture : Texture2D = preload("res://Art/Kenney/carrot.png")
@export var upgrade_text : String = "Speed"

func apply_upgrade(bullet: Bullet):
	pass

class_name DamageBulletStrategy extends BaseBulletStrategy

func apply_upgrade(bullet: Bullet):

bullet.damage += 5.0



                    
                                    
godot/strategy_pattern.1723990377.txt.gz · Dernière modification : 2024/08/18 16:12 de ilan