Обнаружение перекрытия двух спрайтов с помощью PyGame - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь создать свою собственную игру, и мне нужно знать, когда два спрайта перекрываются, и если они перекрываются, то игра загрузится в новую картинку, используя win.blit. Я пытался просматривать посты других людей, но они не помогли мнесовсем.Я новичок, пожалуйста, дайте подробное объяснение

РЕДАКТИРОВАТЬ: Пожалуйста, сделайте его как можно короче

1 Ответ

0 голосов
/ 05 февраля 2019

Как можно короче.

if ( sprite1.rect.colliderect( sprite2.rect ) ):
    # TODO handle collision

Но для более полезного примера ...

Создайте глобальную группу спрайтов.Группа спрайтов позволяет коду выполнить простую проверку на наличие коллизий сразу для всей группы.Может быть полезны две группы, например: aliens и bullets, biscuits и dips.

SPRITES = pygame.sprite.Group()

Определить спрайт.Функция update() спрайта вызывается в каждом кадре для выполнения всего , необходимого для выполнения спрайта между кадрами.Это может быть перемещение, изменение растрового изображения (для анимации) или проверка на наличие столкновений и т. Д. Этот спрайт имеет name, поэтому мы можем распечатать, кто с кем сталкивается.

class RockSprite(pygame.sprite.Sprite):
    def __init__(self, name, image, position):
        pygame.sprite.Sprite.__init__(self)
        self.name         = name
        self.image        = image
        self.rect         = self.image.get_rect()
        self.rect.center  = position

    def update(self):
        # Move the sprite
        # ... TODO
        # Have we collided with any sprite?
        hit_by = pygame.sprite.spritecollide( self, SPRITES, False )
        hit_by.remove( self ) # other than ourselves
        for other_sprite in hit_by:
            print( "Sprite [%s] collided with [%s]" % ( self.name, other_sprite.name ) )

Создать группуспрайты.Здесь показано, как создать экземпляр RockSprite и добавить его в группу SPRITE.

# Make some sprites, including two that overlap (but it depends on the .png size)
sprite_image = pygame.image.load("rock.png").convert_alpha()
rock_01 = RockSprite( "rock01", sprite_image, (10, 10) )
rock_02 = RockSprite( "rock02", sprite_image, (15, 15) )
rock_03 = RockSprite( "rock03", sprite_image, (50, 50) )
# Add them to the global SPRITE group
SPRITES.add(rock_01)        
SPRITES.add(rock_02)
SPRITES.add(rock_03)

Обязательно вызовите функцию группы спрайтов update() в основном цикле:

while not done:

    # Move the sprites (and checks for collisions) - calls update() on each member
    SPRITES.update()

    # paint he screen
    # handle user input  
    ...

Что дает полный демонстрационный код:

import pygame
WINDOW_WIDTH=400
WINDOW_HEIGHT=400

pygame.init()
WINDOW  = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
SPRITES = pygame.sprite.Group()

class RockSprite(pygame.sprite.Sprite):
    def __init__(self, name, image, position):
        pygame.sprite.Sprite.__init__(self)
        self.name         = name
        self.image        = image
        self.rect         = self.image.get_rect()
        self.rect.center  = position

    def update(self):
        # Move the sprite
        # ... TODO
        # Have we collided with any sprite?
        hit_by = pygame.sprite.spritecollide( self, SPRITES, False )
        hit_by.remove( self ) # other than ourselves
        for other_sprite in hit_by:
            print( "Sprite [%s] collided with [%s]" % ( self.name, other_sprite.name ) )


# Make some sprites, including two that overlap
sprite_image = pygame.image.load("rock.png").convert_alpha()
rock_01 = RockSprite( "rock01", sprite_image, (10, 10) )
rock_02 = RockSprite( "rock02", sprite_image, (15, 15) )
rock_03 = RockSprite( "rock03", sprite_image, (90, 90) )
# Add them to the global SPRITE group
SPRITES.add(rock_01)
SPRITES.add(rock_02)
SPRITES.add(rock_03)

clock = pygame.time.Clock()
done = False
while not done:

    # Move the sprites (and checks for collisions)
    SPRITES.update()

    # Paint the screen
    WINDOW.fill( ( 0,0,0 ) )
    SPRITES.draw( WINDOW )
    pygame.display.update()
    pygame.display.flip()

    # Check for user-events
    for event in pygame.event.get():
        if (event.type == pygame.QUIT):
            done = True

    clock.tick_busy_loop(60)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...