Есть ли способ убить спрайта Pygame без необходимости убивать его в группе? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть один шариковый спрайт, и мне действительно не нужна группа.Я хочу установить этот спрайт, который будет удален (или убит), когда он достигнет конца экрана, а также генерирует другой.Я пытаюсь сделать это без группы и хотел знать, возможно ли это.Спасибо за ваш опыт.

Я пробовал self.kill () и kill.self в методе обновления для класса sprite.Это не сработало.Я пытался убить в цикле обновления экрана для приложения.Это не сработало.Я провел обширные исследования, и все ответы только при использовании групп.Я также попытался сделать «если не 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()

Я ожидал, что результаты перестанут считать прямоугольник шара, но он продолжает подсчитываться, заставляя меня думать, что этоне удаляется.

1 Ответ

1 голос
/ 29 мая 2019

Если вы не используете класс Group, бессмысленно вызывать метод Sprite.kill. Все, что он делает, это удаляет Спрайта из всех его групп. Вызов kill магическим образом не удаляет Sprite из вашей игры.

Если вы хотите удалить Sprite, просто прекратите его использовать: либо прекратите вызывать ball.blitme() и ball.update() в вашей функции update_screen, либо замените ball новым экземпляром класса вашего Sprite.

Но подумайте о том, чтобы начать использовать класс Group. Это сделает вашу жизнь проще.

Чтобы проверить, находится ли шарик внутри экрана, вместо

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() даст вам Rect этого Surface, а contains() проверит, находится ли Rect Ball внутри экрана.

Затем мы просто устанавливаем новую позицию для мяча.

Также обратите внимание, что обычно нет необходимости в атрибутах x и y в классе спрайтов, поскольку позиция уже сохранена в атрибуте rect.

...