这个pygame程序中的错误是什么?

时间:2013-08-24 09:58:48

标签: python pygame

我在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()

1 个答案:

答案 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()来简化此操作,但请注意,您可以通过这种方式错过非常快速的按键。