Почему некорректно работает класс?

Я недавно начал изучать ООП в Python делая стрелялку, вроде все шло хорошо, но эта ошибка вогнала меня в ступор

Вот весь код ( Ошибка в Bullet.update())

import pygame as pg
import math

pg.init()
sc = pg.display.set_mode((1200, 900))
clock = pg.time.Clock()

class Player(pg.sprite.Sprite):
    def __init__(self,player_x=830,player_y=450):
        pg.sprite.Sprite.__init__(self)
        self.x = player_x
        self.y = player_y
        self.rect = pg.Rect(self.x - 6, self.y - 6, 16, 16)

    def move(self):
        # Движение игрока
        keys = pg.key.get_pressed()
        if keys[pg.K_a]:
            self.x -= 3
        if keys[pg.K_d]:
            self.x += 3
        if keys[pg.K_w]:
            self.y -= 3
        if keys[pg.K_s]:
            self.y += 3

        # Телепорт игрока если он за пределами карты
        if self.x < -17: self.x = 1217
        elif self.x > 1217: self.x = -17
        elif self.y < -17: self.y = 917
        elif self.y > 917: self.y = -17
        self.rect = pg.Rect(self.x - 12, self.y - 12, 24, 24)
        pg.draw.circle(sc, 'darkblue', (self.x, self.y), 12)

    def shoot(self):
        pos = pg.mouse.get_pos()
        bullet = Bullet(self.x, self.y, pos[0], pos[1], 5)
        # Отдача от выстрела
        self.x -= math.sin(bullet.angle)*bullet.size/3
        self.y -= math.cos(bullet.angle)*bullet.size/3
        bullets.add(bullet)



class Bullet(pg.sprite.Sprite):
    def __init__(self, player_x, player_y, mouse_x, mouse_y, size):
        pg.sprite.Sprite.__init__(self)
        self.x = player_x
        self.y = player_y
        self.mouse_x = mouse_x
        self.mouse_y = mouse_y
        self.angle = math.atan2(self.mouse_x - self.x, self.mouse_y - self.y) 
        self.rect = pg.Rect(self.x-5, self.y-5, 10, 10)
        self.size = size
        self.speed = 40/self.size

    def update(self):
        self.x = self.x + self.speed * math.sin(self.angle)
        self.y = self.y + self.speed * math.cos(self.angle)
        self.rect = pg.Rect(self.x-self.size, self.y-self.size, self.size*2, self.size*2)
        pg.draw.circle(sc, 'black', (self.x, self.y), self.size)
        if pg.sprite.groupcollide(obstacles, bullets, False, False):
            # self.kill()
            self.speed = -5
            # self.angle = -self.angle
        if any((self.x > 1200 + self.size,
                self.x < 0 - self.size,
                self.y > 900 + self.size,
                self.y < 0 - self.size)):
            self.kill()


class Obstacle(pg.sprite.Sprite):
    def __init__(self, width, height, coords):
        pg.sprite.Sprite.__init__(self)
        self.width = width
        self.height = height
        self.coords = coords
        self.rect = pg.Rect(*self.coords, self.width, self.height)

    def update(self):
        pg.draw.rect(sc,"black", self.rect)

bullets = pg.sprite.Group()
obstacles = pg.sprite.Group()
obst = Obstacle(50,300,(700,300))
obstacles.add(obst)
player = Player()

while True:
    clock.tick(144)
    for event in pg.event.get():
        if event.type == pg.QUIT:
            pg.quit()

    pressed = pg.mouse.get_pressed()
    sc.fill("lightgray")

    if pressed[0]:
        player.shoot()

    bullets.update()
    player.move()
    obstacles.update()
    pg.display.update()

Дело в том, что если я при столкновении пули и стенки использую self.kill(), то каждая пуля при столкновении со стенкой отдельно удаляется, но если я попытаюсь изменить self.angle и self.speed, то данные параметры изменятся для всех пуль на экране и при столкновении одной пули - отскочат все.

В чем ошибка?


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