Как я могу избавиться от объекта после столкновения в pygame?

#python #pygame #collision

#python #pygame #столкновение

Вопрос:

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

 import pygame
import random
import sys
import time

Height = 800
Width = 800
Steps = 0
running = True
Number = 2000
x = 0

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

pygame.init()
display = pygame.display.set_mode((Height, Width))
clock = pygame.time.Clock()
pygame.display.set_caption("Game")


class Ball(object):

    def __init__(self, ball_pos_x, ball_pos_y, ball_height, ball_width, delta_x, delta_y):
        self.ball_pos_x = ball_pos_x
        self.ball_pos_y = ball_pos_y
        self.ball_height = ball_height
        self.ball_width = ball_width
        self.delta_x = delta_x
        self.delta_y = delta_y

    def draw(self):

        pygame.draw.rect(display, WHITE, (self.ball_pos_x, self.ball_pos_y,
                                          self.ball_height, self.ball_height))

    def update(self):
        self.ball_pos_x  = self.delta_x
        self.ball_pos_y  = self.delta_y

        if self.ball_pos_x < 0:
            self.delta_x = self.delta_x * -1
        if self.ball_pos_x > Width - self.ball_width:
            self.delta_x = self.delta_x * -1

        if self.ball_pos_y < 0:
            self.delta_y = self.delta_y * -1
        if self.ball_pos_y > Height - self.ball_height:
            self.delta_y = self.delta_y * -1


class Player:
    def __init__(self, player_height, player_width, pos_x, pos_y, player_vel):
        self.player_height = player_height
        self.player_width = player_width
        self.player_vel = player_vel
        self.pos_x = pos_x
        self.pos_y = pos_y
        self.rect = self.pos_x

    def draw(self):
        pygame.draw.rect(display, BLUE, (self.pos_x, self.pos_y,
                                         self.player_height, self.player_width))

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.pos_x > 0:
            self.pos_x -= self.player_vel
        if keys[pygame.K_RIGHT] and self.pos_x < Width - player.player_width:
            self.pos_x  = self.player_vel
        if keys[pygame.K_UP] and self.pos_y > 0:
            self.pos_y -= self.player_vel
        if keys[pygame.K_DOWN] and self.pos_y < Height - player.player_height:
            self.pos_y  = self.player_vel

    def collision(self):

        pass


player = Player(10, 10, Width/2, Height/2, 5)
"""
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and x > 0:
    x -= vel
if keys[pygame.K_RIGHT] and x < 800 - 30:
    x  = vel
"""

list = []
for i in range(Number):
    ball = Ball(random.randrange(0, Width - 10), random.randrange(0, Height - 10),
                10, 10, random.randint(-10, 10), random.randint(-10, 10))
    list.append(ball)


while running:
    display.fill(BLACK)
    clock.tick(60)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            pygame.quit()

    # Update

    # Draw
    for ball in list:
        ball.draw()
        ball.update()

        if (ball.ball_pos_x >= player.pos_x - ball.ball_width and ball.ball_pos_x <= player.pos_x   player.player_width and
                ball.ball_pos_y >= player.pos_y - ball.ball_height and ball.ball_pos_y <= player.pos_y   player.player_height):
            ball.ball_pos_x = -20
            ball.delta_x = -1

            x  = 1
            print(x)

    player.draw()
    player.update()

    pygame.display.flip()

pygame.quit()
  

Комментарии:

1. возможно, удалите его из своего списка (или какого-либо сбора данных)?

2. Должен ли я использовать функцию list.pop (…)? Если да, то как?

3. предположим, у вас есть список (ball), у шара есть свойство с именем ‘isgone’. в ваших циклах проверьте, пропал ли объект, тогда нет хода. или просто удалите шар.

Ответ №1:

Вы можете использовать self.kill() в классе sprite. Это должно удалить их из группы спрайтов. Хотя, насколько я знаю, вам нужно наследовать pygame.sprite.Sprite вместе с добавлением спрайта в группу.

Итак, допустим:

 examplegroup = pygame.sprite.Group()

class Ball(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__(examplegroup):
  

И в update() функции…

 if collided:
    self.kill()
  

Кроме того, одно из преимуществ использования группы спрайтов по сравнению со списком заключается в том, что это, как правило, быстрее и может позволить вам легче выполнять столкновение с pygame.sprite.spritecollide() .