当pygame中添加另一个精灵时,我的精灵正在被删除
好吧我是一个完整的pygame和编程的noob一般。然而,我一直在玩游戏,玩家跌倒和躲闪物体。这个想法是,玩家保持在屏幕的前1/4,并且所有东西都会向上滚动,以产生移动的幻觉。这工作正常,但下面的代码是我尝试并得到另一面墙的产卵。这应该通过删除精灵,当它离开屏幕,并产生一个新的精灵,当图像开始离开屏幕。 -2是它应该跨越多远,直到另一个产生,我的逻辑是检查组的大小。虽然它只包含一个,但它会遍历下一部分代码,定义一个与旧的精灵完全相同但位于其下的新精灵。但是,这会导致程序崩溃,可能是因为旧的精灵被删除导致无限循环。所以如果这是真的,你如何定义一个具有相同属性的新精灵而不杀死其他精灵?当pygame中添加另一个精灵时,我的精灵正在被删除
此外,我意识到代码将不会多次工作,因为我使用了“left_wall”,删除后不会定义它,所以我尝试使用“wall”作为迭代通过定义每个sprite作为墙的组因此每次添加新墙时,都应该将其定义为墙,以便我可以无限地工作。但是,我错误消息AttributeError:'游戏'对象没有属性'墙'。所以在这一刻我被困住了,不知道下一步该怎么做。
编辑:当我使用“wall”这个属性错误的原因时,我忘了脱掉“self”,但它仍然像第一段中提到的那样崩溃,这可能是由于旧的精灵被删除。
对不起,如果这是混乱或不正确的结构化问题(就像我说的,我是一个noob)。
for wall in self.left_wall_sprite:
wall.rect.y -= self.player.vel.y
if wall.rect.bottom < 0: # move left wall
wall.kill()
if wall.rect.top == -2: # a new wall needs to be spawned
while len(self.left_wall_sprite) < 2:
self.new_left_wall = self.left_wall
self.new_left_wall.rect.top = self.left_wall.rect.bottom
self.all_sprites.add(self.new_left_wall)
self.left_wall_sprite.add(self.new_left_wall) # add the new sprite to the wall group so that it runs through the same cycle
随着代码的只有这部分,它是很难说肯定是怎么回事 - 但可以被检测为您创建一个新墙段,但不要“把事情当你发现他们“ - 所以,代码仍然会尝试移动旧墙。
如果你真的需要创建一个新的精灵,走了一路:一旦满足条件的变化:
到达旧墙
删除旧的引用(
.kill
方法)创建一个新墙(创建一个新实例 - 您只是对现有实例进行 分配)。
在所有相关组中插入新实例。
由于代码是,你只是指向同一个墙对象(self.left_wall),这样“self.let_wall”和“self.new_let_wall”只是到samething引用,当您更改一个参数(如rect.top),您可以在另一个参数中看到相同的更改。
不为班级的墙上对象的代码,一个现在不能,如果一切都设置正确地创建一个新的实例,但通常可通过self.left_wall = Wall((wall.rect.bottom, wall.rect.left, wall.rect.width, wall.rect.height))
来完成(如果你的类的__init__
将采取一个矩形作为第一参数)。这取代了旧的self.rect_wall
(它应该有一个关于wall
变量的参考) - 然后您只需将其添加到新组。
但它看起来像你可以重复使用相同的精灵 - 因此,仅仅指刚更新顶部坐标,你正在做的 - 没有必要与组遏制或anythng拨弄:
if wall.rect.bottom <= 0:
wall.rect.top = wall.rect.bottom # or "0" at once