我正在和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()
答案 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制作游戏编程书。请访问我的网站获取更多信息....