-5

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

1 回答 1

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(),但请注意,您可能会错过这种方式非常快速的按键。

于 2013-08-24T12:36:27.060 回答