我在pygame中制作Pong游戏,但还没完成。代码中的变量,类和其他东西的名称是葡萄牙语,但我认为很容易知道它的作用。代码应该在用户想要时移动两个拨片,但它只显示背景和拨片。我没有收到任何错误消息。
以下是代码:
import pygame,sys,os,time
from pygame.locals import *
pygame.init()
janela=pygame.display.set_mode((800, 533),0,32)
pygame.display.set_caption("Pong!")
superficie=pygame.display.get_surface()
clock=pygame.time.Clock()
fundoFicheiro=os.path.join("Imagens","fundo2.png")
fundoImagem=pygame.image.load(fundoFicheiro).convert()
barraFicheiro=os.path.join("Imagens","barra.png")
barraImagem=pygame.image.load(barraFicheiro).convert_alpha()
def imprimirBarra(x,y):
janela.blit(barraImagem,(x,y))
class barra():
y=1
x=1
velocidade=1
def subir(self):
self.y-=self.velocidade
def descer(self):
self.y+=self.velocidade
def parar(self):
self.velocidade=0
def comecar(self):
self.velocidade=1
barra1=barra()
barra1.x=5
barra1.y=superficie.get_height()/2-barraImagem.get_height()/2
barra2=barra()
barra2.velocidade=1
barra2.x=superficie.get_width()-(barraImagem.get_width()+5)
barra2.y=superficie.get_height()/2-barraImagem.get_height()/2
def interface():
for event in pygame.event.get():
if event.type==KEYDOWN:
if event.key==K_UP:
barra2.comecar()
barra2.subir()
elif event.key==K_DOWN:
barra2.comecar()
barra2.descer()
elif event.key==K_w:
barra1.comecar()
barra1.subir()
elif event.key==K_s:
barra1.comecar()
barra1.descer()
elif event.type==KEYUP:
if event.key==K_UP:
barra2.parar()
elif event.key==K_DOWN:
barra2.parar()
elif event.key==K_w:
barra1.parar()
elif event.key==K_s:
barra1.parar()
while True:
clock.tick(60)
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
janela.blit(fundoImagem,(0,0))
imprimirBarra(barra1.x,barra1.y)
imprimirBarra(barra2.x,barra2.y)
interface()
pygame.display.update()
答案 0 :(得分:0)
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
pygame.event.get()
为您提供自上次调用以来发生的所有事件。此循环使用当前可用的所有事件。因此,当调用interface()
并再次尝试pygame.event.get()
时,不再需要检查按键事件(除非它们恰好在进行janela.blit
调用时发生,但那些应该非常快;不确定Pygame是否会在这些调用期间处理事件。)
另一个问题是,在按下按键时,您只会获得KEYDOWN
个事件,不会持续时(除非您使用pygame.key.set_repeat()
进行配置,但这个可能会干扰你的其他逻辑)。因此,您需要设置代码,以便在按住键时尝试连续移动球拍,但实际上它不会执行任何操作,因为每次按键时.subir
或.descer
只会被调用一次。
有很多方法可以解决这个问题,但无论如何你都需要重新构建一些东西。我的建议是在程序中只有一个处理事件的循环,并将它们转换为某种数据结构(例如,它可能有set
当前按下的键,以及自上次以来哪些键已更改时间)。您可以使用pygame.key.get_pressed()
来简化此操作,但请注意,您可以通过这种方式错过非常快速的按键。