Как узнать колиззию пули c врагом в pygame

Рейтинг: 1Ответов: 1Опубликовано: 19.08.2023

Вообщем я хочу уничтожить врага когда он касается пули. Я пытался сделать это но ничего не выходит. Я искал в гугле и на форумах.

import pygame, random
from threading import Thread
pygame.init()

window = pygame.display.set_mode((500, 500))

pygame.display.set_caption("Test game")

BLACK = (0,0,0)

ebullets = 5

global stop
stop = False

bullets_font = pygame.font.SysFont('opensansbold.ttf', 500)
lose_font = pygame.font.SysFont('opensansbold.ttf', 100)
lose_label = lose_font.render('YOU LOSE', 1, (0,0,0))

enemysprite = pygame.transform.scale(pygame.image.load('enemy.png'), (50, 50))
bullet = pygame.image.load('bullet.png')

global is_lose
is_lose = False

velx,vely=0, 0
global x,y
x,y=225, 450
width=40
height=60
vel=5

class enemy(object):
    def __init__(self, mx, my):
        self.x = mx
        self.y = my
        self.surf = pygame.Surface((self.x, self.y))
    def draw(self):
        window.blit(enemysprite, (self.x, self.y))
        return self.surf.get_rect()

class projectile(object):
    def __init__(self, mx, my):
        self.x = mx
        self.y = my
    def draw(self):

        return pygame.draw.rect(window, BLACK, (self.x, self.y, 30, 30))


enemies = []
enemies.append(enemy(250,100))
enemies.append(enemy(250,150))
enemies.append(enemy(250,200))
def redrawGameWindow():
    if bullets:
        for bullet in bullets:
            if bullet.y < 0:
                bullets.remove(bullet)
                print('destroyed')
            else:
                bullet.y -= 10
                global bul
                bul = bullet.draw()
        

    pygame.display.update()
bullets = []


running = True
while running:
    pygame.time.delay(50)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            stop = True
            pygame.quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                if ebullets != 0:
                    if len(bullets) <= 5:
                        ebullets -= 1
                        bullets.append(projectile(x+10, y+50))
                else:
                    is_lose = True



        keys = pygame.key.get_pressed()
        if keys[pygame.K_a] and x > 0:
            x -= 10
        if keys[pygame.K_d] and x < 450:
            x += 10

    bullets_label = bullets_font.render(str(ebullets), 1, (130, 130, 130))

    window.fill((230, 230, 230))
    pygame.draw.rect(window, (0, 0, 0), (x, y, 50, 50))
    window.blit(bullets_label, (150, 100))
    if is_lose:
        window.blit(lose_label, (75, 200))
    redrawGameWindow()

Ответы

▲ 2

В pygame есть встроенная функция колизии в спрайтах:

col = pygame.sprite.groupcollide(bullets, enemy, True, True)

функция вернет True, если пуля прикоснется к врагу.

bullets - группа спрайтов пуль, enemy - группа спрайтов врагов.

True - удаление пули (1 аргумент) и врага (2 аргумент) соответственно.

if col:
  # можете добавить сюда определенную логику,
  # например вычитания хп у врага,
  # тогда в col нужно в последнем аргументе написать False (т.к. враг не уничтожается).

Почитать про спрайты можно тут.