Esta pergunta envolve a implementação da capacidade de disparar balas quando a barra de espaço é pressionada, mantendo um caractere de jogador na tela.
O código do Asker inicialmente teve um problema em que o personagem do jogador desapareceu ao fotografar. Isso ocorre porque o tiroteio e o movimento do jogador foram separados em diferentes loops. Para resolver isso, precisamos combiná -los em um único loop principal, onde ambos os comportamentos são atualizados simultaneamente. O código original usou um loop de tempo que continuava infinitamente. Para corrigir isso, precisamos usar um loop de tempo com uma condição que verifica se a bala chegou ao topo. &&&]
import pygame, os # Configuração de boilerplate omitida para brevidade jogador de classe: def __init __ (self, x, y, altura, largura): ... def draw (self): ... def move_left (self): ... def move_right (self): ... bala de aula: def __init __ (self, x, y): ... Def Update (self): ... def draw (self): ... # Listas de balas balas = [] # Inicialize o jogador p = jogador (600, 500, 50, 30) # Loop de jogo principal executar = true enquanto executa: relógio.Tick (100) # Lide com eventos Para o evento em pygame.event.get (): se event.type == pygame.quit: executar = false se event.type == pygame.keydown: se event.key == pygame.k_space: Bullets.Append (Bullet (P.X P.Width // 2, P.Y)) # Atualizar objetos keys = pygame.key.get_pressed () Se keys [pygame.k_left]: p.move_left () Se keys [pygame.k_right]: p.move_right () Para B em balas: B.Update () # Atualizar posição e remover a bala se ele sair da tela Se B.Y & lt; 0: balas.remove (b) # Quadro de atualização D.Fill ((98, 98, 98)) Para B em balas: B.Draw () P.Draw () win.Update ()mudanças de chave:
as arremessos e a lógica do movimento do jogador agora são combinadas em um único loop de jogo principal.
import pygame, os
# Boilerplate setup omitted for brevity
class Player:
def __init__(self, x, y, height, width):
...
def draw(self):
...
def move_left(self):
...
def move_right(self):
...
class Bullet:
def __init__(self, x, y):
...
def update(self):
...
def draw(self):
...
# Lists of bullets
bullets = []
# Initialize player
p = Player(600, 500, 50, 30)
# Main game loop
run = True
while run:
clock.tick(100)
# Handle events
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
bullets.append(Bullet(p.x p.width//2, p.y))
# Update objects
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
p.move_left()
if keys[pygame.K_RIGHT]:
p.move_right()
for b in bullets:
b.update()
# Update position and remove bullet if it goes off-screen
if b.y < 0:
bullets.remove(b)
# Update frame
d.fill((98, 98, 98))
for b in bullets:
b.draw()
p.draw()
win.update()
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3