Если вас не интересует тот факт, что клавиша нажата, а скорее, что она нажата, используйте pygame.key.get_pressed
, чтобы получить состояние клавиатуры.
Один из способов решения вашей проблемы - создать dict
, который сопоставляет каждую клавишу со стрелкой с вектором, а затем просто повторяет эту dict
и проверяет, нажата ли конкретная клавиша, что-то вроде этого:
keymap = {
pygame.K_LEFT: Vector2(-speed, 0),
pygame.K_RIGHT: Vector2(speed, 0),
pygame.K_UP: Vector2(0, -speed),
pygame.K_DOWN: Vector2(0, speed)
}
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
current_time = pygame.time.get_ticks()
pressed = pygame.key.get_pressed()
for key in keymap:
if pressed[key]:
if current_time - previous_time > 500:
previous_time = current_time
projectiles.add(Projectile(player.rect.x, player.rect.y, keymap[key]))
Некоторые дополнительные заметки:
Вы можете добавить спрайты в несколько групп, и обычно имеет смысл добавить все спрайты в группы, которые содержат все спрайты, чтобы основной цикл был простым.
У вас уже есть группа под названием all_sprites_list
, поэтому используйте ее следующим образом. Просто добавьте все новые снаряды и в эти группы и звоните update
/ draw
только в эту группу:
...
if current_time - previous_time > 500:
previous_time = current_time
Projectile(player.rect.x, player.rect.y, keymap[key], all_sprites_list, projectiles)
# ----- Game Logic
all_sprites_list.update()
screen.fill(GREEN)
all_sprites_list.draw(screen)
pygame.display.flip()
...
и в Projectile.py:
...
class Projectile(pygame.sprite.Sprite):
def __init__(self, x, y, vel, *groups):
super().__init__(groups)
...