Прежде всего, не создавайте в классе для каждой стрелки. Класс - это объект с атрибутами. Используйте атрибуты класса и создайте экземпляры класса с различным внешним видом и поведением. Добавьте параметры в подпись конструктора и используйте параметры для инициализации атрибутов.
Добавить параметры для позиции и имени файла изображения:
class ArrowGray(pygame.sprite.Sprite):
def __init__(self, pos, imagename):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(imagename).convert()
self.image.set_colorkey(BLACK)
self.rect = self.image.get_rect()
self.rect.center = pos
class Arrow(pygame.sprite.Sprite):
def __init__(self, pos, imagename):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(imagename).convert()
self.image.set_colorkey(BLACK)
self.rect = self.image.get_rect()
self.rect.center = pos
def update(self):
self.rect.x += 5
if (self.rect.left > (WIDTH + 50)):
self.rect.right = 0
a1g = ArrowGray((750, 25), "gray right.png")
a2g = ArrowGray((750, 125), "gray left.png")
a3g = ArrowGray((750, 250), "gray up.png")
a4g = ArrowGray((750, 375), "gray down.png")
a1 = Arrow((25, 25), "red right.png")
a2 = Arrow((25, 125), "blue left.png")
a3 = Arrow((25, 250), "green up.png")
a4 = Arrow((25, 375), "yellow down.png")
Я рекомендую использовать событие таймера. Используйте pygame.time.set_timer()
для многократного создания USEREVENT
. Например:
arrowGrayList = [a1g, a2g, a3g, a4g]
arrowList = [a1, a2, a3, a4]
allArrows = pygame.sprite.Group()
millisecondsDelay = 500 # 0.5 seconds
arrowTimerEvent = pygame.USEREVENT + 1
pygame.time.set_timer(arrowTimerEvent, millisecondsDelay)
spawned = 0
while running:
clock.tick(FPS)
#Update
allArrows.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == arrowTimerEvent:
if spawned < len(arrowList):
allArrows.add(arrowGrayList[spawned])
allArrows.add(arrowList[spawned])
spawned += 1
keys = pygame.key.get_pressed()
if keys[pygame.K_RIGHT]:
if pygame.sprite.collide_rect(a1, a1g):
a1.rect.center = (900, 600)
if keys[pygame.K_LEFT]:
if pygame.sprite.collide_rect(a2, a2g):
a2.rect.center = (900, 600)
if keys[pygame.K_UP]:
if pygame.sprite.collide_rect(a3, a3g):
a3.rect.center = (900, 600)
if keys[pygame.K_DOWN]:
if pygame.sprite.collide_rect(a4, a4g):
a4.rect.center = (900, 600)
#draw
screen.fill(SALMON)
allArrows.draw(screen)
pygame.display.flip()
pygame.quit()
Обратите внимание, в Pygame могут быть определены события клиента. Каждому событию нужен уникальный идентификатор. Идентификаторы пользовательских событий должны начинаться с pygame.USEREVENT
. В этом случае pygame.USEREVENT+1
- это идентификатор события таймера, который порождает стрелки.