Почему некорректно работает класс?
Я недавно начал изучать ООП в 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, то данные параметры изменятся для всех пуль на экране и при столкновении одной пули - отскочат все.
В чем ошибка?