好的,这是我第一次访问这个网站,所以我希望我能做到这一点。
我正在Pygame制作一个蛇游戏,用于学校评估任务,我遇到了问题。我无法让蛇的身体部位消失。
目前,这是身体部位的生成方式:
def more_body(bodyparts, x, y, z):
body = pygame.sprite.Sprite()
body.image = pygame.image.load('body.png')
body.rect = head.image.get_rect()
body.rect.right = x
body.rect.top = y
body.timeleft = z
bodyparts.add(body)
正文删除检查就是这样的。
for x in bodyparts:
body.timeleft -= 1
if body.timeleft == 0:
body = False
很明显,Bodyparts是身体部位的分组。这是一个OrderedUpdates精灵组。
问题是代码似乎不喜欢这个解决方案。目前,错误列为“NameError:name'body'未定义”。如果我尝试扩展它,检查引用bodyparts.body.timeleft而不是body.timeleft,我改为“AttributeError:'OrderedUpdates'对象没有属性'body'”。
我想出了第二个解决方案。由于bodyparts是OrderedUpdates组,因此应该可以根据列表中的位置选择和删除特定的部分。因此,计划的步骤如下:
我的主要问题是:
这是一个可行的解决方案,你能提供代码吗?我可以像对待列表一样对待它,并将其拆分,以便丢弃bodyparts组的前面(或后面,取决于它们的添加方式)吗?你能提供的任何解决方案都会有很大的帮助。
答案 0 :(得分:2)
for x in bodyparts:
body.timeleft -= 1
if body.timeleft == 0:
body = False
在这里,您遍历精灵组,将每个精灵存储在变量x
中。您永远不会定义body
,因此会引发异常。
即使您这样做,将body
设置为False
也不会神奇地从精灵组中删除精灵。为此,请使用remove
方法。
所以你应该把你的循环改为:
for body in bodyparts:
body.timeleft -= 1
if body.timeleft == 0:
bodyparts.remove(body)
您也可以使用一个简单的列表,而不是使用精灵组,一旦它变得太大就删除它们:
max_len = 4 # current max length of snake
bodyparts = []
def more_body(bodyparts, x, y, z):
body = ...
bodyparts.append(body)
bodyparts=bodyparts[-max_len:]
此外,您应该只加载一次图片'body.png'
并重复使用,而不是每次都加载它。