#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