Pygame Как проверить повторное нажатие клавиши

#python #pygame

#python #pygame

Вопрос:

Привет, ребята, я создаю игру на python, используя pygame . У меня есть фрагмент кода, который стреляет лазерами с корабля в космической тематической игре. Вот код:

 # Laser
laserImg = pygame.image.load('assets/PNG/Lasers/laserBlue01.png')
laserX = 0
laserY = 480
laserX_change = 0
laserY_change = 8
laser_state = "ready"

def fire_laser(x,y):
    global laser_state
    laser_state = "fire"
    screen.blit(laserImg, (x 20,y 9))
    screen.blit(laserImg, (x 70,y 9))

running = True

while running:
    screen.fill((0, 0, 0))

    screen.blit(background,(0,0))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

            if event.key == pygame.K_SPACE:
                if laser_state is "ready":
                    laser_sound = mixer.Sound('assets/Bonus/sfx_laser1.ogg')
                    laser_sound.play()
                    laserX = playerX
                    fire_laser(playerX, laserY)

    # Bullet movement
    if laserY <= 0:
        laserY = 475
        laser_state = "ready"
    
    if laser_state is "fire":
        fire_laser(laserX, laserY)
        laserY -= laserY_change

 

Ну, этот фрагмент кода стреляет двумя лазерами с корабля,

введите описание изображения здесь

вот так.

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

Ответ №1:

Вам нужны отдельные позиции и состояния для левого и правого лазера

 laserX = [0, 0]
laserY = [480, 480]
laser_state = ["ready", "ready"]
 

Вам также понадобится переменная, указывающая, какой лазер будет срабатывать следующим

 next_laser = 0
 

Стрелять следующим лазером, когда нажат пробел, и менять следующий лазер:

 while running:
    # [...]

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                if laser_state[next_laser] is "ready":
                    laser_sound = mixer.Sound('assets/Bonus/sfx_laser1.ogg')
                    laser_sound.play()
                    laserX[next_laser] = playerX
                    laser_state[next_laser] = "fire"
                    next_laser = (next_laser   1) % 2
 

Переместите и нарисуйте оба лазера в зависимости от его состояния

 while running:
    # [...]

    for i in range(2):
        if laser_state[i] is "fire":
            laserY[i] -= laserY_change
            if laserY[i] <= 0:
                laserY[i] = 475
                laser_state[i] = "ready"
    
    for i in range(2):
        if laser_state[i] is "fire":
            screen.blit(laserImg, (laserX[i]   20   i*50, laserY[i] 9))
 

Минимальный пример:

 import pygame
pygame.init()

screen = pygame.display.set_mode((400, 400))

laserImg = pygame.Surface((3, 12))
laserImg.fill((255, 255, 255))
laserX_change = 0
laserY_change = 8
laserX = [0, 0]
laserY = [330, 330]
laser_state = ["ready", "ready"]
next_laser = 0

playerX, playerY = 175, 330 

clock = pygame.time.Clock()
running = True
while running:
    clock.tick(100)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                if laser_state[next_laser] is "ready":
                    laserX[next_laser] = playerX
                    laser_state[next_laser] = "fire"
                    next_laser = (next_laser   1) % 2

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        playerX -= 5
        playerX = max(25, playerX)
    if keys[pygame.K_RIGHT]:
        playerX  = 5
        playerX = min(375, playerX)

    for i in range(2):
        if laser_state[i] is "fire":
            laserY[i] -= laserY_change
            if laserY[i] <= 0:
                laserY[i] = 330
                laser_state[i] = "ready"
            
    screen.fill(0)
    for i in range(2):
        if laser_state[i] is "fire":    
            screen.blit(laserImg, (laserX[i]   i*50, laserY[i] 9))
    pygame.draw.rect(screen, (64, 127, 255), (playerX, playerY, 50, 50))
    pygame.display.flip()
 

Комментарии:

1. Большое вам спасибо!

Ответ №2:

Вы можете сделать это с помощью счетчика:

 keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and counter == 0: 
    win.blit(your laser asset (the right one))
    counter  = 1

if keys[pygame.K_LEFT] and counter == 1: 
    win.blit(your laser asset (the left one))
    counter -= 1