2017-08-28 137 views
0

好吧我是一个完整的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 

回答

0

随着代码的只有这部分,它是很难说肯定是怎么回事 - 但可以被检测为您创建一个新墙段,但不要“把事情当你发现他们“ - 所以,代码仍然会尝试移动旧墙。

如果你真的需要创建一个新的精灵,走了一路:一旦满足条件的变化:

  1. 到达旧墙

  2. 删除旧的引用(.kill方法)

  3. 创建一个新墙(创建一个新实例 - 您只是对现有实例进行 分配)。

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

由于代码是,你只是指向同一个墙对象(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