使用Pygame处理MVC模式中的动画

时间:2014-05-23 10:44:10

标签: python model-view-controller pygame

我目前正在尝试使用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模式应该如何工作。或者,可以在模型中设置动画计数器,但它看起来也不正确。

1 个答案:

答案 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