为什么我不能让我的Pygame Sprite在OSX上移动?

时间:2011-09-05 21:54:27

标签: macos sprite move pygame

我正在和Pygame一起玩(从Andy Harris的2007年“游戏编程”一书中自学。)

他举了几个移动精灵的例子。我没有看到他的例子和下面的代码之间的区别,但我的精灵(我制作的鱼jpeg)并没有动。 “岛屿”也是我制造的jpeg。基本上,鱼应该每帧水平移动5个像素。但相反,它只是坐在那里。也许我只是忽略了一些显而易见的事情,或者我的系统可能出现了问题(我安装了几个版本的Python,而且似乎正在运行游戏的那个版本是import error, no module named scrap)。

[编辑:我删除了所有疯狂的OSX东西b / c它非常令人分心,这不是问题]。

import pygame  
pygame.init()  

screen = pygame.display.set_mode((800, 600))  
background = pygame.image.load('island_background.jpg')  
background = background.convert()  

class Fish(pygame.sprite.Sprite):  
    def __init__(self):  
        pygame.sprite.Sprite.__init__(self)  
        self.image = pygame.image.load('fish.jpg')  
        self.image = self.image.convert()  
        self.rect = self.image.get_rect()  
        self.rect.centerx = (600)  
        self.rect.centery = (500)  
        self.dx = 5  

    def update(self):  
        self.rect.centerx += self.dx  


def main():  
    keepgoing = True  
    clock = pygame.time.Clock()  
    fish = Fish()  
    allsprites = pygame.sprite.Group(fish)  

    while keepgoing:  
        clock.tick(30)  
        for event in pygame.event.get():  
            if event.type == pygame.QUIT:  
                keepgoing = False  

        screen.blit(background, (0, 0))  

        allsprites.clear(screen, background)
        #I thought the line above might be a problem, 
        #but commented it out and nothing changed (well, maybe I got a 
        #black background, but I don't recall. The fish just sat there in 
        #the same spot still

        allsprites.update  
        allsprites.draw(screen)  

        pygame.display.flip()  

if __name__ == '__main__':  
    main()      

1 个答案:

答案 0 :(得分:3)

我是安迪(你正在使用的书的作者) 我直接回复了你的电子邮件,但如果有人正在阅读,我会在这里发帖,以便SO社区的利益。

根本不是OSX的问题 所有Mac的东西都是红鲱鱼(抱歉,这是一个鱼类程序......我无法抗拒。)

问题是第42行: allsprites.update

应该阅读 allsprites.update()

这是微妙但至关重要的区别: 在Python中,方法或函数也可以作为变量读取。这是一个非常强大的功能,但还没有你正在使用的功能。如果括号被取消,则将其作为变量读取(并且它不执行任何操作。)如果包含括号,则执行该功能。

你忘记了括号(事实上,有些编辑似乎有时会删除它们)因此Python很乐意接受你的代码作为法律指令。但是,它只是承认实际上存在一个名为allsprites.update的方法。从未调用更新方法,因此精灵永远不会更新,因此它的位置永远不会改变。

我的版本实际调用sprite组的update方法,后者又调用所有成员sprite的更新方法,程序运行正常。可以肯定的是,我已经在所有三个主要操作系统(Ubuntu,Mac和Win 7)上进行了测试,它运行良好。

如果您对代码是否适用于您的操作系统有疑问,请从我的网站(http://www.aharrisbooks.net)下载我原来的测试代码,看看是否有效。

如果你被其他地方困住,请告诉我。

顺便说一下,我正在为HTML5制作游戏编程书。请访问我的网站获取更多信息....