Как определить, почему объекты проходят через друг друга в Colliderect - PullRequest
0 голосов
/ 27 апреля 2020

По некоторым причинам Colliderect не будет работать, и дождь проходит через тротуар. Это действительно раздражает, потому что все эти неиспользованные спрайты создают тонны лагов.

import pygame
import random

class Square(pygame.sprite.Sprite):
    def __init__(self, x, y, size1, size2, speedx, speedy, colour):
        super().__init__()
        self.image = pygame.Surface([size1, size2])
        self.image.fill(colour)

        self.speedx = speedx
        self.speedy = speedy

        self.rect=self.image.get_rect()
        self.rect.x=x
        self.rect.y=y
    def update(self):
        square_colour = (random.randint(0,255), random.randint(0,255), random.randint(0,255))
        self.rect.x = self.rect.x + self.speedx
        self.rect.y = self.rect.y + self.speedy


my_square = Square(0, 705, 20, 30, 1, 0, (0, 0, 0))
pavement = Square(0, 735, 750, 15, 0 , 0, (100, 100, 100))

allspriteslist = pygame.sprite.Group()
allspriteslist.add(my_square)
allspriteslist.add(pavement)


pygame.init()
screen = pygame.display.set_mode([750,750])
pygame.display.set_caption('Snake Example')
clock = pygame.time.Clock()

background_colour = (150, 150, 150)
done = False
while not done:
    r = Square(random.randint(0, 747), 0, 3, 7, 0, 5, (137, 200, 230))
    allspriteslist.add(r)
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
              done = True

    if my_square.rect.x > 750:
        my_square.rect.x = - 10
    if my_square.rect.x < - 50:
        my_square.rect.x = 800
    if r.rect.colliderect(pavement.rect): 
        allspriteslist.remove(r)

    screen.fill(background_colour)
    allspriteslist.draw(screen)
    allspriteslist.update()    
    pygame.display.flip()

1 Ответ

1 голос
/ 27 апреля 2020

Вы должны обнаружить столкновение всех капель дождя с дорожным покрытием.

Добавить группу для капель дождя:

rain = pygame.sprite.Group()

Добавить каждую каплю дождя в группу:

done = False
while not done:
    r = Square(random.randint(0, 747), 0, 3, 7, 0, 5, (137, 200, 230))
    allspriteslist.add(r)
    rain.add(r)

И удалить каплю, если она упадет на землю, с помощью pygame.sprite.Sprite.kill () :

done = False
while not done:
    # [...]

    for r in rain: 
        if r.rect.colliderect(pavement.rect): 
            r.kill()

Удаление капель дождя можно упростить с помощью используя pygame.sprite.spritecollide() и передав True аргументу dokill:

done = False
while not done:
    # [...]

    pygame.sprite.spritecollide(pavement, rain, True)

Полный пример кода:

import pygame
import random

class Square(pygame.sprite.Sprite):
    def __init__(self, x, y, size1, size2, speedx, speedy, colour):
        super().__init__()
        self.image = pygame.Surface([size1, size2])
        self.image.fill(colour)

        self.speedx = speedx
        self.speedy = speedy

        self.rect=self.image.get_rect()
        self.rect.x=x
        self.rect.y=y
    def update(self):
        square_colour = (random.randint(0,255), random.randint(0,255), random.randint(0,255))
        self.rect.x = self.rect.x + self.speedx
        self.rect.y = self.rect.y + self.speedy

my_square = Square(0, 705, 20, 30, 1, 0, (0, 0, 0))
pavement = Square(0, 735, 750, 15, 0 , 0, (100, 100, 100))

allspriteslist = pygame.sprite.Group()
allspriteslist.add(my_square)
allspriteslist.add(pavement)
rain = pygame.sprite.Group()

pygame.init()
screen = pygame.display.set_mode([750,750])
pygame.display.set_caption('Snake Example')
clock = pygame.time.Clock()

background_colour = (150, 150, 150)
done = False
while not done:
    r = Square(random.randint(0, 747), 0, 3, 7, 0, 5, (137, 200, 230))
    allspriteslist.add(r)
    rain.add(r)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
                done = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                done = True

    if my_square.rect.x > 750:
        my_square.rect.x = - 10
    if my_square.rect.x < - 50:
        my_square.rect.x = 800
    pygame.sprite.spritecollide(pavement, rain, True)

    screen.fill(background_colour)
    allspriteslist.draw(screen)
    allspriteslist.update()    
    pygame.display.flip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...