Пишу игру на pygame, добавил стрельбу, мобов. Не могу реализовать столкновение пули и моба и направление пуль туда куда смотрит игрок

фото1

фото2

На фото 2 видно, что направление игрока не совпадает с направлением пули проходят сквозь жука

import pygame

WIDTH = 1024
HEIGHT = 800
FPS = 60

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
SPEED = 10
SPEED2 = 10

x0 = WIDTH - 1024
y0 = HEIGHT - 800
x1 = WIDTH / 2
y1 = HEIGHT - 800
x2 = WIDTH - 1024
y2 = HEIGHT / 2

player_img = [pygame.image.load("player.png"), pygame.image.load("player3.png"),
              pygame.image.load("player4.png"), pygame.image.load('player2.png'),
              pygame.image.load("blood.png")]
insect_img = [pygame.image.load("insect.png"), pygame.image.load("insect2.png")]
background_img = pygame.image.load("background.png")
ok_image = pygame.image.load("ok.png")


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player, self).__init__()
        self.left = False
        self.right = False
        self.up = False
        self.down = False
        self.contact = False
        self.image = player_img[0]
        self.rect = self.image.get_rect()
        self.rect.x = x0
        self.rect.y = y0

    def on_left(self):
        self.image = player_img[1]
        self.left = True
        self.contact = False
        if self.left and self.rect.x > 0:
            self.rect.x -= SPEED

    def on_right(self):
        self.image = player_img[0]
        self.right = True
        if self.right and self.rect.x < WIDTH - 100:
            self.rect.x += SPEED

    def on_up(self):
        self.image = player_img[2]
        self.up = True
        if self.up and self.rect.y > 0:
            self.rect.y -= SPEED

    def on_down(self):
        self.image = player_img[3]
        self.down = True
        if self.down and self.rect.y < HEIGHT - 100:
            self.rect.y += SPEED

    def stop(self):
        self.image = player_img[4]
        self.contact = True

    def shot_left(self):
        self.left = True
        if self.left:
            bullet = Bullet(self.rect.x + 135, self.rect.y + 50)
            all_sprites.add(bullet)

    def shot_up(self):
        self.up = True
        if self.up:
            bullet2 = Bullet2(self.rect.x, self.rect.y)
            all_sprites.add(bullet2)


class Insect1(pygame.sprite.Sprite):
    def __init__(self):
        super(Insect1, self).__init__()
        self.image = insect_img[0]
        self.rect = self.image.get_rect()
        self.rect.x = x1
        self.rect.y = y1

    def update(self):
        self.rect.y += SPEED
        if self.rect.y > HEIGHT:
            self.rect.y = y1


class Insect2(pygame.sprite.Sprite):
    def __init__(self):
        super(Insect2, self).__init__()
        self.image = insect_img[1]
        self.rect = self.image.get_rect()
        self.rect.x = x2
        self.rect.y = y2

    def update(self):
        self.rect.x += SPEED
        if self.rect.x > HEIGHT + 100:
            self.rect.x = x2


class Bullet(pygame.sprite.Sprite):
    def __init__(self, x0, y0):
        super(Bullet, self).__init__()
        self.image = pygame.Surface((30, 10))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = x0
        self.rect.y = y0

    def update(self):
        self.rect.x += SPEED


class Bullet2(pygame.sprite.Sprite):
    def __init__(self, x0, y0):
        super(Bullet2, self).__init__()
        self.image = pygame.Surface((10, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = x0
        self.rect.y = y0

    def update(self):
        self.rect.y -= SPEED


# Создаем игру и окно
pygame.init()
pygame.mixer.init()
sound = pygame.mixer.music.load("music.mp3")
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()
all_sprites = pygame.sprite.Group()
insects = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
insect1 = Insect1()
insect2 = Insect2()
bullet = Bullet(x0, y0)
bullets.add(bullet)
all_sprites.add(bullet)
all_sprites.add(player)
insects.add(insect1)
insects.add(insect2)
pygame.mixer.music.play(-1)
pygame.mixer.music.set_volume(0.5)

running = True
while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            player.shot_left()

    keys = pygame.key.get_pressed()
    if keys[pygame.K_d] and not player.contact:
        player.on_right()
    if keys[pygame.K_w] and not player.contact:
        player.on_up()
    if keys[pygame.K_s] and not player.contact:
        player.on_down()
    if keys[pygame.K_a] and not player.contact:
        player.on_left()

    insects.update()
    all_sprites.update()

    collide = pygame.sprite.spritecollide(player, insects, False)
    if collide:
        player.stop()

    collide_bullet = pygame.sprite.spritecollide(insect1, bullets, False)
    if collide_bullet:
        insect1.kill()

    screen.blit(background_img, (0, 0))
    screen.blit(ok_image, (950, 750))
    all_sprites.draw(screen)
    insects.draw(screen)
    pygame.display.flip()

pygame.quit()

В этом коде работает всё, кроме столкновения пули с жуком и направлению пули туда куда смотрит игрок. Поворот игрока реализирован сменой изображения(изображения лежат в списке)


Ответы (1 шт):

Автор решения: A_Vaclav

Поищите в сети вот такой файл... Эрик Мэтиз - Изучаем Python (3 изд.) (2020).pdf В части 2 изложен подробно проект игры - Инопланетное вторжение. Там расписано как организовать коллизию - столкновение двух спрайтов... И в целом поучительно.

→ Ссылка