Как я могу использовать время, чтобы сделать случайные стрелки в Pygame? - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь сделать код в Pygame, который показывает стрелки спрайтов случайным образом (например, DDR). У меня была идея использовать время, но режим сна приостанавливает всю программу, и я просто хочу, чтобы одна стрелка была приостановлена.

Я попытался сделать случайный вызов типа списка, но это не работает, потому что стрелки должнысделать это до конца, прежде чем они исчезнут.

import pygame, sys
from pygame.locals import *
from random import randint
from time import sleep

#Variables
WIDTH = 800
HEIGHT = 450
FPS = 30
running = True
BLACK = (0, 0, 0)
SALMON = (253, 171, 159)

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Tempoify")

pygame.init()
pygame.mixer.init()
clock = pygame.time.Clock()

#####################################
# Gray Arrows

class ArrowRightGray(pygame.sprite.Sprite):

  def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.image.load("gray right.png").convert()
    self.image.set_colorkey(BLACK)
    self.rect = self.image.get_rect()
    self.rect.center = (750, 25)


class ArrowLeftGray(pygame.sprite.Sprite):

  def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.image.load("gray left.png").convert()
    self.image.set_colorkey(BLACK)
    self.rect = self.image.get_rect()
    self.rect.center = (750, 125)


class ArrowUpGray(pygame.sprite.Sprite):

  def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.image.load("gray up.png").convert()
    self.image.set_colorkey(BLACK)
    self.rect = self.image.get_rect()
    self.rect.center = (750, 250)

class ArrowDownGray(pygame.sprite.Sprite):

  def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.image.load("gray down.png").convert()
    self.image.set_colorkey(BLACK)
    self.rect = self.image.get_rect()
    self.rect.center = (750, 375)

class ArrowRight(pygame.sprite.Sprite):

  def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.image.load("red right.png").convert()
    self.image.set_colorkey(BLACK)
    self.rect = self.image.get_rect()
    self.rect.center = (25, 25)

  def update(self):
    self.rect.x += 5
    if (self.rect.left > (WIDTH + 50)):
        self.rect.right = 0

class ArrowLeft(pygame.sprite.Sprite):

  def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.image.load("blue left.png").convert()
    self.image.set_colorkey(BLACK)
    self.rect = self.image.get_rect()
    self.rect.center = (25, 125)

  def update(self):
    self.rect.x += 5
    if (self.rect.left > (WIDTH + 50)):
        self.rect.right = 0

class ArrowUp(pygame.sprite.Sprite):

  def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.image.load("green up.png").convert()
    self.image.set_colorkey(BLACK)
    self.rect = self.image.get_rect()
    self.rect.center = (25, 250)

  def update(self):
    self.rect.x += 5
    if (self.rect.left > (WIDTH + 50)):
        self.rect.right = 0

class ArrowDown(pygame.sprite.Sprite):

  def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.image.load("yellow down.png").convert()
    self.image.set_colorkey(BLACK)
    self.rect = self.image.get_rect()
    self.rect.center = (25, 375)

  def update(self):
    self.rect.x += 5
    if (self.rect.left > (WIDTH + 50)):
        self.rect.right = 0

allArrows = pygame.sprite.Group()
a1g = ArrowRightGray()
a1 = ArrowRight()

a2g = ArrowLeftGray()
a2 = ArrowLeft()

a3g = ArrowUpGray()
a3 = ArrowUp()

a4g = ArrowDownGray()
a4 = ArrowDown()

allArrows.add(a1g)
allArrows.add(a1)
allArrows.add(a2g)
allArrows.add(a2)
allArrows.add(a3g)
allArrows.add(a3)
allArrows.add(a4g)
allArrows.add(a4)

while running:
  clock.tick(FPS)

  #Update
  allArrows.update()

  keys = pygame.key.get_pressed()

  for event in pygame.event.get():
      if keys[pygame.K_RIGHT]:
          if pygame.sprite.collide_rect(a1, a1g):
              a1.rect.center = (900, 600)
      elif keys[pygame.K_LEFT]:
          if pygame.sprite.collide_rect(a2, a2g):
              a2.rect.center = (900, 600)
      elif keys[pygame.K_UP]:
          if pygame.sprite.collide_rect(a3, a3g):
              a3.rect.center = (900, 600)
      elif 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()

В конце стрелки должны дойти до конца экрана и появиться случайным образом. Они также должны исчезнуть при столкновении с серыми стрелками.

1 Ответ

1 голос
/ 04 ноября 2019

Прежде всего, не создавайте в классе для каждой стрелки. Класс - это объект с атрибутами. Используйте атрибуты класса и создайте экземпляры класса с различным внешним видом и поведением. Добавьте параметры в подпись конструктора и используйте параметры для инициализации атрибутов.

Добавить параметры для позиции и имени файла изображения:

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 - это идентификатор события таймера, который порождает стрелки.

...