Je ne l'ai pas utilisé pyglet, mais voici ma conjecture:
Vous y êtes presque. La raison pour laquelle votre première mise en œuvre n'a probablement pas fonctionné est à cause de ces lignes:
c = pyglet.clock.Clock()
c.schedule_interval(t.update, 1/60.0)
Ici, vous créez une nouvelle instance de l'horloge et planifiez un rappel à ce sujet. Cependant, à aucun moment vous n'associez réellement cette instance d'une horloge avec pyglet. Donc, lorsque vous exécutez ...
pyglet.app.run()
... vous a jamais dit en fait pyglet au sujet de la nouvelle instance d'horloge c
. Au lieu de cela, pyglet utilisera une instance qu'il a faite lui-même. Regarde ce source code for pyglet from the clock module ...:
# Default clock.
_default = Clock()
def set_default(default):
'''Set the default clock to use for all module-level functions.
By default an instance of `Clock` is used.
:Parameters:
`default` : `Clock`
The default clock to use.
'''
global _default
_default = default
def get_default():
'''Return the `Clock` instance that is used by all module-level
clock functions.
:rtype: `Clock`
:return: The default clock.
Lorsque pyglet démarre, il crée sa propre instance de l'horloge (appelée _default
). Si vous voulez utiliser le vôtre, vous devez utiliser set_default()
pour le remplacer. Par conséquent, pour fixer votre premier morceau de code, vous auriez probablement besoin de faire une des opérations suivantes:
c = pyglet.clock.get_default()
c.schedule_interval(t.update, 1/60.0)
... ou ...
c = pyglet.clock.Clock()
pyglet.clock.set_default(c)
c.schedule_interval(t.update, 1/60.0)
Le second exemple ci-dessus est inutile: pyglet vous donne déjà une occurrence de Clock, donc vous dupliqueriez juste quelque chose que pyglet a déjà fait pour vous. Quoi qu'il en soit, vous finissez par programmer le rappel sur l'horloge que pyglet utilise.
Alors, il faut maintenant donner un sens, oui, vous avez besoin d'appeler set_default()
. C'est ainsi que vous dites à pyglet d'utiliser votre objet plutôt que celui qu'il crée par défaut. Maintenant, vous pouvez imaginer mettre cet appel set_default()
où vous avez actuellement (dans le constructeur).Cependant, il est probablement plus judicieux de le faire ...
class Clock(pyglet.clock.Clock):
def __init__(self):
super(Clock, self).__init__()
...
c = Clock()
pyglet.clock.set_default(c)
Modifier:
En réponse à la question de savoir pourquoi vous faire en dehors du constructeur:
D'abord, comme En règle générale, un constructeur ne devrait être utilisé que pour construire l'objet. En ajoutant set_default, vous construisez non seulement l'objet, mais vous changez aussi l'état d'une autre entité (le module pyglet.clock). Cela peut causer de la confusion, comme je le montrerai plus bas. Supposons que je l'ai écrit le code qui ressemblait à ceci ...
c = MyClock()
c2 = UnpausedClock()
Dans cet exemple, je l'ai déjà mis en œuvre deux types d'horloge différentes: NewClock
et UnpausedClock
. UnpausedClock
ne considérera que l'heure de passer lorsque le jeu n'est pas suspendu. Si je mets set_default()
dans le constructeur de ces deux nouvelles classes, alors UnpausedClock
deviendrait la nouvelle horloge par défaut (que je ne veux pas). En ne mettant pas set_default()
dans le constructeur, et au lieu de faire ce qui suit:
c = MyClock()
c2 = UnpausedClock()
pyglet.clock.set_default(c)
Mon code est plus explicite et moins confus.
Bien sûr, le code fonctionnera dans un sens ou dans l'autre, mais je pense que le fait d'avoir SET_DEFAULT OUT du constructeur vous donne plus de flexibilité pour utiliser la classe comme vous le ferez plus tard.
Chaque fois que vous dites que quelque chose «fonctionne» ou «ne fonctionne pas», assurez-vous d'être plus précis. Quelque chose qui "ne fonctionne pas" pourrait signifier qu'il commet une erreur, ne fait pas erreur, mais ne fait pas ce que vous attendez, etc. Qu'est-ce qui ne fonctionne pas dans la première section du code? –
@MarkHildreth Merci pour le conseil! Je veux dire, dans le premier code, la mise à jour n'imprime rien et c semble ne pas être cochée, mais je ne sais pas pourquoi ... –