Je crée un jeu avec Pygame où il y aura de nombreux écrans différents. Je crée un cours appelé Screen qui aura des écrans personnalisés faits pour vous. J'ai besoin que chaque écran ait des événements et des déclencheurs différents, donc je ne peux pas simplement définir une fonction dans la classe. J'ai besoin de fonctions séparées pour chaque écran, ce qui voudrait dire que je dois définir des fonctions en dehors de la définition de classe pour chaque écran. Je ne sais pas si cela est possible mais il serait bon de le savoir. Je ne suis pas encore allé trop loin mais voici le code:
import pygame class Screen: def __init__(self, size, bg_color, bg_image): self.size = size self.bg_color = bg_color self.bg_image = bg_image self.layers = [] self.screen = pygame.display.set_mode(self.size) # some code was taken out here to save space (it was just some x y width and height getters and setters) def add_item(self, item, layer=None): if layer is None: self.layers.append(item) else: self.layers.insert(layer, item) def remove_item(self, item): self.layers.remove(item) def draw(self): self.screen.fill(self.bg_color) self.screen.blit(self.bg_image) for item in self.layers: self.screen.blit(item, item.pos)
3 Réponses :
vous pouvez simplement créer une fonction normale en dehors de la classe et la passer comme l'un des arguments à votre classe.
Vous pouvez procéder de deux manières:
Un a déjà été donné par NinjaFaraz. Vous définiriez simplement des fonctions en dehors de votre classe et créeriez un dict ou une liste avec les fonctions disponibles pour chaque écran. Vous pouvez même passer de nouvelles fonctions pendant l'exécution de votre programme pour améliorer ou réduire dynamiquement la fonctionnalité des écrans.
La deuxième option est l'héritage. Cela n'a de sens que si pas trop de types d'écrans sont nécessaires. Si tel est le cas, vous pourriez avoir une classe de base "Screen" avec vos fonctions de base et tous les autres écrans hériteraient de cette classe. Cela a du sens si les classes ne peuvent pas gagner / perdre de nouvelles fonctions de manière dynamique.
Laquelle des deux approches est la meilleure dépend de votre situation spécifique et ne peut pas encore être répondu avec les informations que vous avez fournies.
J'ai besoin que chaque écran ait des événements et des déclencheurs différents
Vous recherchez donc l' héritage . En savoir plus sur l' héritage et le polymorphisme en Python Utilisez
Screen
comme classe de base. Dérivez différentes classes deScreen
, où vous pouvez implémenter différents comportements:class Screen_2(Screen): def __init__(self, size, bg_color, bg_image): super().__init__(size, bg_color, bg_image) def my_method(): # do something different # [...]class Screen_1(Screen): def __init__(self, size, bg_color, bg_image): super().__init__(size, bg_color, bg_image) def my_method(): # do something # [...]class Screen: def __init__(self, size, bg_color, bg_image): # [...] # [...]
Peut-être créer une classe de base pour les écrans et spécialiser chaque écran en utilisant l'héritage? Veuillez publier un exemple simplifié de mvce .
Qu'est-ce que tu as fait?
Une solution peut être de créer une classe Screen et de créer différentes fonctions dans cette classe pour chaque écran différent. C'est ce que j'ai fait pour mon jeu que j'ai fait avec PyGame