当在pygame中添加另一个精灵时,我的精灵将被删除



好吧,我是pygame和编程的一个完全的新手。然而,我一直在研究一款游戏,玩家摔倒并躲避物体。这个想法是,玩家保持在屏幕的顶部1/4,所有东西都向上滚动,给人一种移动的错觉。这很好,但下面的代码是我尝试获得另一面墙的地方。这应该通过在精灵离开屏幕时删除精灵,并在图像开始离开屏幕时生成新的精灵来实现。-2是在产生另一个之前它应该交叉的距离,我的逻辑是检查组的大小。虽然它只包含一个,但它会在下一段代码中迭代,定义一个与旧的墙精灵相同但位于其下方的新墙精灵。然而,这可能会导致程序崩溃,因为旧的精灵被删除,导致无限循环。那么,如果这是真的,你如何定义一个具有相同属性的新精灵,而不杀死另一个?

此外,我意识到代码甚至不会多次工作,因为我使用了"left_wall",它在被删除后不会被定义,所以我在for循环中迭代将每个精灵定义为wall的组时尝试使用"wall",所以每次添加新墙时,都应该将其定义为wall,这样我就可以无限工作了。然而,我收到了这个错误消息AttributeError:"游戏"对象没有属性"墙"。所以此刻我陷入了困境,不知道下一步该怎么办。

edit:我在使用"墙"时忘记了去掉"self",这是属性错误的原因,但它仍然像我在第一段中提到的那样崩溃,这可能是因为旧的精灵被删除了。

如果这是一个令人困惑或结构不正确的问题(就像我说的,我是一个傻瓜(,我很抱歉。

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

只有这部分代码,很难确定发生了什么-但可以检测到的是,您创建了一个新的墙部分,但不要"保留您发现的东西"-因此,代码仍然会尝试移动旧墙。

如果你真的需要创建一个新的精灵,那就一直去:一旦满足了更改的条件:

  1. 获取旧墙的参考

  2. 从所有组中移除旧墙(.kill方法(

  3. 创建一堵新墙(创建一个新实例-您只是在制作分配给现有实例(。

  4. 在所有相关组中插入新实例。

按照代码,您只是指向同一个墙对象(self.left_wall(,因此"self.let_wall"one_answers"self.new_let_wall"只是对同一事物的引用,当您更改一侧的参数(如rect.top(时,您可以在另一侧看到相同的更改。

如果没有墙对象类的代码,现在就不能确定是否所有内容都设置为正确创建新实例,但这通常可以由self.left_wall = Wall((wall.rect.bottom, wall.rect.left, wall.rect.width, wall.rect.height))完成(如果类的__init__将以rect作为第一个参数(。这将替换旧的self.rect_wall(它应该在wall变量上有一个引用(,然后将其添加到新组中。

但看起来你可以重复使用同一个精灵-所以,jsut会像你正在做的那样更新顶部坐标-不需要篡改组包含或任何东西:

if wall.rect.bottom <= 0:   
wall.rect.top = wall.rect.bottom  # or "0" at once

最新更新