我目前正在尝试使用Python和Pygame实现MVC模式,但我无法弄清楚如何正确处理动画。让我们说我们有一个可以攻击的模型对象:
class ModelObject:
def attack():
if not self.attacking:
self.attacking = True
# Then compute some stuff
def isattacking():
return self.attacking
一个视图对象,通过显示攻击动画来呈现模型对象:
class ViewObject(pygame.Sprite):
attacking_ressource = [] # List of surfaces for animation
default_ressource = None
def update():
# Detect the model object is attacking
if self.model.isattacking():
# Create animation if needed
if self.attacking_animation is None:
self.attacking_animation = iter(self.attacking_ressource)
# Set image
self.image = next(self.attacking_animation, self.default_ressource)
else:
# Reset animation
self.attacking_animation = None
self.image = self.default_ressource
问题是,该模型如何知道它不再攻击? 视图可以在动画结束时通知模型,但它猜测它不是MVC模式应该如何工作。或者,可以在模型中设置动画计数器,但它看起来也不正确。
答案 0 :(得分:1)
我认为你错了方向。
攻击不应该像动画一样长,但动画应该持续与攻击一样长。
所以ViewObject
很好,因为它已经询问模型是否还在攻击。
对于ModelObject
,攻击应持续多长时间以及如何跟踪时间取决于你。例如,您可以调用pygame.time.get_ticks()
来获取自attack
开始游戏一次以来的毫秒数,然后再定期检查,例如:
class ModelObject:
def attack():
if not self.attacking:
self.attacking = True
self.started = pygame.time.get_ticks()
# Then compute some stuff
def isattacking():
return self.attacking
def update():
# attack lasts 1000ms
self.attacking &= pygame.time.get_ticks() - self.started < 1000