好的我一般都是pygame和编程的完整菜鸟。然而,我一直致力于玩家摔倒并躲避物体的游戏。这个想法是玩家仍然在屏幕的前1/4处,所有东西都向上滚动以给出移动的幻觉。这工作正常,但下面的代码是我尝试并生成另一个墙的地方。这应该通过在精灵离开屏幕时删除精灵并在图像开始离开屏幕时产生新的精灵来起作用。 -2是它应该跨越多远,直到另一个产生,我的逻辑是检查组的大小。虽然它只包含一个,但它会迭代下一段代码,定义一个与旧的精灵相同但位于它下面的新墙精灵。但是这会导致程序崩溃,因为旧的精灵被删除导致无限循环。所以,如果这是真的,你如何定义一个具有相同属性的新精灵,而不是杀死另一个?
此外,我意识到代码甚至不会多次工作,因为我使用了" left_wall"它被删除后不会被定义,所以我尝试使用" wall"当我遍历将每个精灵定义为for循环中的墙的组时,因此每次添加新墙时,它应该被定义为墙,以便我无限地工作。但我这个错误消息AttributeError:' Game'对象没有属性' wall'。所以此刻我被困住了,不知道接下来要做什么。
编辑:我忘了起飞" self"当使用" wall"这是属性错误的原因,但它仍然像我在第一段中提到的那样崩溃,这可能是由于旧的精灵被删除了。 抱歉,如果这是令人困惑的或不是一个结构合理的问题(就像我说的,我是一个菜鸟)。 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
答案 0 :(得分:0)
只有这部分代码,很难确定发生了什么 - 但可以检测到的是你创建了一个新的墙部分,但是不要“留下你发现它们的东西” - 所以,代码仍将尝试移动旧墙。
如果你真的需要创建一个新的精灵,那么就一直这样:一旦条件满足变化:
获取旧墙的参考
从所有群组中移除旧墙(.kill
方法)
创建一个新墙(创建一个新实例 - 你只是创建一个 分配现有实例)。
在所有相关组中插入新实例。
代码是,你只是指向同一个墙对象(self.left_wall),这样“self.let_wall”和“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