【问题标题】:My sprites are being deleted when another sprite is added in pygame当在 pygame 中添加另一个精灵时,我的精灵被删除了
【发布时间】:2017-08-28 22:47:59
【问题描述】:

好吧,我对 pygame 和一般编程完全是个菜鸟。然而,我一直在开发一款玩家跌倒并躲避物体的游戏。这个想法是玩家保持在屏幕的顶部 1/4 内,并且所有内容都向上滚动以产生移动的错觉。这很好用,但是下面的代码是我尝试生成另一堵墙的地方。这应该通过在精灵离开屏幕时删除它并在图像开始离开屏幕时产生一个新精灵来工作。 -2 是在产生另一个之前它应该跨越多远,我的逻辑是检查组的大小。虽然它只包含一个,但它会遍历下一段代码,定义一个与旧墙精灵相同但位于其下方的新墙精灵。然而,这可能会导致程序崩溃,因为旧的精灵被删除导致无限循环。所以如果这是真的,你如何定义一个具有相同属性的新精灵而不杀死另一个?

我还意识到代码甚至不会多次工作,因为我使用了“left_wall”,它在被删除后不会被定义,所以我尝试使用“wall”,因为我在 for 循环中迭代将每个精灵定义为墙的组所以每次添加新墙时,它都应该被定义为墙,这样我就可以无限地工作。但是我这个错误消息 AttributeError: 'Game' object has no attribute 'wall'。所以此刻我被卡住了,不知道下一步该做什么。

编辑:我在使用“wall”时忘记取消“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

【问题讨论】:

    标签: python-3.x pygame


    【解决方案1】:

    仅使用这部分代码,很难确定发生了什么 - 但可以检测到您创建了一个新的墙部分,但不要“留下你找到的东西” - 所以,代码仍然会尝试移动旧墙。

    如果你真的需要创建一个新的精灵,那就一路走下去:一旦满足改变的条件:

    1. 获取对旧墙的引用

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

    3. 创建一个新墙(创建一个新实例 - 你只是在创建一个 分配给现有实例)。

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

    正如代码所示,您只是指向同一个墙对象(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 变量有引用) - 然后您只需将其添加到新组中。

    但看起来您可以重复使用相同的精灵 - 因此,只需更新顶部坐标即可 - 无需摆弄组包含或任何东西:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多