python Как сделать что бы каждый объект(Sprite) реагировал отдельно?
Когда создаю больше одного спрайта(одного класса) при взаимодействие с одним из них, действие выполняется на всех. Как сделать что бы каждый объект реагировал отдельно?
import pygame
WIDTH = 900
HEIGHT = 600
FPS = 60
# Задаем цвета
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
collide = False
# Создаем игру и окно
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Game")
clock = pygame.time.Clock()
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((20, 20))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH / 2
self.rect.bottom = HEIGHT - 10
self.speedx = 0
self.speedy = 0
def update(self):
self.speedx = 0
self.speedy = 0
keystate = pygame.key.get_pressed()
if keystate[pygame.K_LEFT]:
self.speedx = -3
if keystate[pygame.K_RIGHT]:
self.speedx = 3
if keystate[pygame.K_UP]:
self.speedy = -3
if keystate[pygame.K_DOWN]:
self.speedy = 3
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
if self.rect.bottom > HEIGHT:
self.rect.bottom = HEIGHT
if self.rect.top < 0:
self.rect.top = 0
self.rect.x += self.speedx
self.rect.y += self.speedy
class Mob(pygame.sprite.Sprite):
def __init__(self,x,y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((60, 60))
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.bottom = y
def update(self):
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
if self.rect.bottom > HEIGHT:
self.rect.bottom = HEIGHT
if self.rect.top < 0:
self.rect.top = 0
all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
m = Mob(player.rect.centerx, player.rect.top)
all_sprites.add(m)
mobs.add(m)
# Цикл игры
flag_game = True
while flag_game:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
flag_game = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
flag_game = False
elif event.key == pygame.K_TAB:
m = Mob(player.rect.centerx, player.rect.top)
all_sprites.add(m)
mobs.add(m)
# Обновление
all_sprites.update()
# Проверка на столкновения
keys = pygame.key.get_pressed()
hits = pygame.sprite.spritecollide(player, mobs, False)
if hits:
#Левый
if player.rect.left < m.rect.right and player.rect.right > m.rect.right:
player.rect.left = m.rect.right
if keys[pygame.K_SPACE]:
m.rect.right += -1
#Правый
elif player.rect.right > m.rect.left and player.rect.left < m.rect.left:
player.rect.right = m.rect.left
if keys[pygame.K_SPACE]:
m.rect.right += 1
#Верхний
elif player.rect.top < m.rect.bottom and player.rect.bottom > m.rect.bottom:
player.rect.top = m.rect.bottom
if keys[pygame.K_SPACE]:
m.rect.bottom += -1
#Нижний
elif player.rect.bottom > m.rect.top and player.rect.top < m.rect.top:
player.rect.bottom = m.rect.top
if keys[pygame.K_SPACE]:
m.rect.bottom += 1
# Рендеринг
screen.fill(BLACK)
all_sprites.draw(screen)
pygame.display.flip()
pygame.quit()