Как вы обнаруживаете столкновение между двумя поверхностными объектами, которые являются частью класса Sprite в Pygame? - PullRequest
3 голосов
/ 11 ноября 2019

Я создал класс врага и класс игрока для игры в пигмей, и я пытаюсь выяснить, как обнаруживать столкновения между ними. Я перепробовал много разных методов, и они не работают, потому что они требуют, чтобы вы использовали объект Rect, а я - объект Surface. Можете ли вы сказать мне, какой код добавить для обнаружения коллизий между объектами поверхности? Вот мой код:

import pygame
from pygame.locals import *
from sys import exit
import time
import random

pygame.init()
SCREEN_SIZE = (800, 600)
screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)

background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((250, 250, 250))
screen.blit(background, (0, 0))


class Box(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self._1 = random.randint(10, 50)
        self.image = pygame.Surface((self._1, self._1))
        self.image.fill((random.randint(1, 255), random.randint(1, 255), random.randint(1, 255)))
        self.rect = self.image.get_rect()
        self.dx = random.randint(5, 15)
        self.dy = random.randint(5, 15)
        self.direction = self.dx, self.dy

    def update(self):
        pass


class Player(Box):
    def __init__(self):
        Box.__init__(self)
        self.x = 400
        self.y = 300
        self.image = pygame.Surface((30, 30))
        self.image.fill((0, 255, 0))
        screen.fill((255, 255, 255))
        self.rect.centerx = 400
        self.rect.centery = 300

    def update(self):
        self.rect.centerx = self.x
        self.rect.centery = self.y


class Enemy(Box):
    def __init__(self):
        Box.__init__(self)
        self.image = pygame.Surface((30, 30))
        self.image.fill((0, 255, 0))
        self.image.fill((255, 0, 0))

    def update(self):
        self.dx, self.dy = self.direction
        self.rect.centerx += self.dx
        self.rect.centery += self.dy
        if self.rect[0] >= 800 or self.rect[0] + self._1 <= 0:
            self.direction = -self.dx, self.dy
        if self.rect[1] >= 600 or self._1 + self.rect[1] <= 0:
            self.direction = self.dx, -self.dy


allSprites = pygame.sprite.Group()
player = Player()
enemy1 = Enemy()
enemy2 = Enemy()
enemy3 = Enemy()
allSprites.add(enemy1)
allSprites.add(enemy2)
allSprites.add(enemy3)
allSprites.add(player)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            exit()

        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                player.x -= 10
            if event.key == K_RIGHT:
                player.x += 10
            if event.key == K_UP:
                player.y -= 10
            if event.key == K_DOWN:
                player.y += 10
    screen.fill((255, 255, 255))
    allSprites.clear(screen, background)
    allSprites.update()
    allSprites.draw(screen)
    pygame.display.flip()
    time.sleep(50.0 / 1000.0)

1 Ответ

2 голосов
/ 11 ноября 2019

Добавьте врагов к pygame.sprite.Group (enemies) и определите, сталкивается ли Спрайт player с элементом из группы enemies на pygame.sprite.spritecollide(),Например:

player = Player()
enemy1 = Enemy()
enemy2 = Enemy()
enemy3 = Enemy()

allSprites = pygame.sprite.Group()
allSprites.add([enemy1, enemy2, enemy3, player])

enemies = pygame.sprite.Group()
enemies.add([enemy1, enemy2, enemy3])

while True:

    # [...]

    allSprites.update()
    if pygame.sprite.spritecollide(player, enemies, False):
        print("collide")

    # [...]

Но обратите внимание, что атрибуты .rect объектов Player и Enemy имеют размер только 1x1. Убедитесь, что прямоугольники имеют правильный размер:

class Player(Box):
    def __init__(self):
        Box.__init__(self)
        self.x = 400
        self.y = 300
        self.image = pygame.Surface((30, 30))
        self.image.fill((0, 255, 0))
        screen.fill((255, 255, 255))
        self.rect = self.image.get_rect(center=(400, 300)) # <---
class Enemy(Box):
    def __init__(self):
        Box.__init__(self)
        self.image = pygame.Surface((30, 30))
        self.rect = self.image.get_rect() # <---
        self.image.fill((0, 255, 0))
        self.image.fill((255, 0, 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...