Pygame 如何检查按键的第二次按下

问题描述

大家好,我正在使用 pygame 在 python 中制作游戏。我有一段代码可以在太空主题游戏中从船上发射激光。代码如下:

# 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))

    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

好吧,这段代码从船上发射了两束激光,

enter image description here

喜欢这个。

但我不想那样。我想如果玩家按下空格键一次发射左边的激光,如果玩家再次按下空格键而不是发射右边的激光,当他再次按下空格键时,它会再次发射左边的激光。我希望你明白。

解决方法

左右激光需要单独的位置和状态

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()
,

你可以用计数器来做:

cor