有没有办法杀死一个 Pygame 精灵而不必成群结队地杀死它?

Is there a way to kill a Pygame sprite without having to kill it in a group?

我只有一个球精灵,我真的不需要一组。我想将该精灵设置为在到达屏幕末尾时被删除(或杀死),这样它也会生成另一个精灵。我正在尝试在没有团队的情况下执行此操作,并想知道这是否可行。感谢您的专业知识。

我在 sprite class 的更新方法中尝试了 self.kill() 和 kill.self。那没有用。我试图在应用程序的屏幕更新循环中执行终止操作。那没有用。我做了广泛的研究,所有的答案都是在使用组时。我也尝试过 "if not pygame.surface.rect.contains(Ball())" 但没有用。 (是这样的,我试了几个变体。)

def update(self):
    """Move the ball down"""
    self.y = self.y + 1
    self.rect.y = self.y 
    #print("Screen is: " + str(pygame.surface.rect()))
    print("Object is: " + str(self.rect))
    if (self.rect.y >= 800):
         self.kill()





def update_screen(screen, ball, lamp):
    #Show on the screen
    screen.fill((135,206,250))
    lamp.blitme()
    ball.blitme()
    ballgen(screen)
    ball.update()
    lamp.update()
    pygame.display.flip()

我预计结果会停止计算球的矩形,但它一直在计数,因此让我认为它没有被删除。

如果不使用Groupclass,调用Sprite.kill方法就没有意义了。它所做的只是从其所有组中删除 Sprite。调用 kill 不会神奇地将 Sprite 从您的游戏中移除。

如果您想删除 Sprite,请停止使用它:停止在 update_screen 函数中调用 ball.blitme()ball.update(),或者替换 ball 与你的 Sprite 的新实例 class.

但考虑开始实际使用 Group class。它会让你的生活更轻松。

检查球是否在屏幕内,而不是

if not pygame.surface.rect.contains(Ball())

使用

if not pygame.display.get_surface().get_rect().contains(self.rect):
    self.rect.center = (whatever_new_position, ....)

Ball的更新方法中。 pygame.display.get_surface() 将为您提供屏幕表面,get_rect() 将为您提供 SurfaceRect,而 contains() 将检查 Rect 是否为Ball 仍在屏幕内。

然后我们为小球设置一个新的位置。

另请注意,精灵 class 中通常不需要 xy 属性,因为该位置已存储在 rect 属性中。