-1

我正在 pygame 中制作 Pong 游戏,但它还没有完成。代码中的变量、类和其他内容的名称是葡萄牙语,但我认为很容易知道它的作用。该代码使两个桨和一个球在击中游戏窗口的上限和下限时反弹。当它击中桨时,它也应该弹跳,但这并没有发生。它只是从窗户里出来,忽略了桨。我没有收到任何错误消息。

完整代码:

import pygame,sys,os
import random
from pygame.locals import *

pygame.init()

janela=pygame.display.set_mode((800, 500),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()
fundoFinal=pygame.transform.smoothscale(fundoImagem,(superficie.get_width(),superficie.get_height()))

barraFicheiro=os.path.join("Imagens","barra.png")
barraImagem=pygame.image.load(barraFicheiro).convert_alpha()

bolaFicheiro=os.path.join("Imagens","bola.png")
bolaImagem=pygame.image.load(bolaFicheiro).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=5
    def check(self):
        if self.y<20:
            self.y=20
        elif self.y>superficie.get_height()-barraImagem.get_height()-20:
            self.y=superficie.get_height()-barraImagem.get_height()-20     



barra1=barra()
barra1.x=5
barra1.y=superficie.get_height()/2-barraImagem.get_height()/2
barra2=barra()
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==QUIT:
            pygame.quit()
            sys.exit()
        if event.type==KEYDOWN:
            if pygame.key.get_pressed()[K_UP]:              
                barra2.comecar()
                barra2.check()
                barra2.subir()
            elif pygame.key.get_pressed()[K_DOWN]:
                barra2.comecar()
                barra2.check()
                barra2.descer()
            if pygame.key.get_pressed()[K_w]:
                barra1.comecar()
                barra1.check()
                barra1.subir()
            elif pygame.key.get_pressed()[K_s]:
                barra1.comecar()
                barra1.check()
                barra1.descer()  
        if event.type==KEYUP:
            if event.type==K_UP:
                barra2.parar()
            elif event.type==K_DOWN:
                barra2.parar()
            elif event.type==K_w:
                barra1.parar()
            elif event.type==K_s:
                    barra1.parar()

class bola():
    y=1
    x=1
    velocidadeX=1
    velocidadeY=1
    mover="a"
    ultimaPosX=1
    ultimaPosY=1
    pontuacao1=0
    pontuacao2=0
    def subirDireita(self):
        self.x+=self.velocidadeX
        self.y-=self.velocidadeY
    def subirEsquerda(self):
        self.x-=self.velocidadeX
        self.y-=self.velocidadeY
    def descerDireita(self):
        self.x+=self.velocidadeX
        self.y+=self.velocidadeY
    def descerEsquerda(self):
        self.x-=self.velocidadeX
        self.y+=self.velocidadeY
    def colisao(self):
        lista1=range(barra1.y,barra1.y+barraImagem.get_height()+1)
        lista2=range(barra2.y,barra2.y+barraImagem.get_height()+1)
        if self.y<1 and self.x<self.ultimaPosX:
            self.velocidadeY=random.uniform(self.velocidadeX-0.5,self.velocidadeX+3.1)
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="descerEsquerda"  
        elif self.y<1 and self.x>self.ultimaPosX:
            self.velocidadeY=random.uniform(self.velocidadeX-0.5,self.velocidadeX+3.1)
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="descerDireita"    
        elif self.y>superficie.get_height()-bolaImagem.get_height()-1 and self.x>self.ultimaPosX:
            self.velocidadeY=random.uniform(self.velocidadeX-0.5,self.velocidadeX+3.1)
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="subirDireita"
        elif self.y>superficie.get_height()-bolaImagem.get_height()-1 and self.x<self.ultimaPosX:
            self.velocidadeY=random.uniform(self.velocidadeX-0.8,self.velocidadeX+3.1)
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="subirEsquerda"
        elif self.x<5+barraImagem.get_width()-1 and self.y>self.ultimaPosY and self.y in lista1:
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="descerDireita" 
        elif self.x<5+barraImagem.get_width()-1 and self.y<self.ultimaPosY and self.y in lista1:
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="subirDireita" 
        elif self.x>superficie.get_width()-5-barraImagem.get_width()-bolaImagem.get_width()-1 and self.y<self.ultimaPosY and self.y in lista2:
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="subirEsquerda"
        elif self.x>superficie.get_width()-5-barraImagem.get_width()-bolaImagem.get_width()-1 and self.y>self.ultimaPosY and self.y in lista2:
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="descerEsquerda"
        elif self.x<0-bolaImagem.get_width():
            self.pontuacao1+=1
            self.comecar()
        elif self.x>superficie.get_width():
            self.pontuacao2+=1
            self.comecar()    
    def font1(self):
        font=pygame.font.Font(None,100)
        text=font.render(str(self.pontuacao1),1,(255,255,255))
        textPos=text.get_rect(right=(superficie.get_width()/2+superficie.get_width()/4),y=(superficie.get_height()-superficie.get_height()+50))
        janela.blit(text,textPos)
    def font2(self):
        font=pygame.font.Font(None,100)
        text=font.render(str(self.pontuacao2),1,(255,255,255))
        textPos=text.get_rect(left=(superficie.get_width()/2-superficie.get_width()/4),y=(superficie.get_height()-superficie.get_height()+50))
        janela.blit(text,textPos)






    def comecar(self):
        self.velocidadeY=8
        self.velocidadeX=5
        bola1.x=superficie.get_width()/2-bolaImagem.get_width()/2
        bola1.y=superficie.get_height()/2-bolaImagem.get_height()/2 
        aleatorio=random.randint(1,4)
        self.ultimaPosX=superficie.get_width()/2-bolaImagem.get_width()/2
        self.ultimaPosY=superficie.get_height()/2-bolaImagem.get_height()/2 
        if aleatorio==1:
            self.mover="subirEsquerda"
        elif aleatorio==2:
            self.mover="subirDireita"
        elif aleatorio==3:
            self.mover="descerDireita"
        elif aleatorio==4:
            self.mover="descerEsquerda"                   
    def continuar(self):
        if self.mover=="subirEsquerda":
            self.subirEsquerda()
        elif self.mover=="subirDireita":
            self.subirDireita()
        elif self.mover=="descerDireita":
            self.descerDireita()
        elif self.mover=="descerEsquerda":
            self.descerEsquerda()            






bola1=bola()
bola1.comecar()


def imprimirBola(x,y):
    janela.blit(bolaImagem,(x,y))



pygame.key.set_repeat(1)


while True:
    clock.tick(60)
    interface()
    bola1.colisao()
    bola1.continuar()
    janela.blit(fundoFinal,(0,0)) 
    imprimirBarra(barra1.x,barra1.y)
    imprimirBarra(barra2.x,barra2.y)
    imprimirBola(bola1.x,bola1.y)
    bola1.font1()
    bola1.font2()


    pygame.display.update()

我认为问题出在哪里(在方法内部colisao()class bola()它应该检查球是否击中桨):

        elif self.x<5+barraImagem.get_width()-1 and self.y>self.ultimaPosY and self.y in lista1:
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="descerDireita" 
        elif self.x<5+barraImagem.get_width()-1 and self.y<self.ultimaPosY and self.y in lista1:
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="subirDireita" 
        elif self.x>superficie.get_width()-5-barraImagem.get_width()-bolaImagem.get_width()-1 and self.y<self.ultimaPosY and self.y in lista2:
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="subirEsquerda"
        elif self.x>superficie.get_width()-5-barraImagem.get_width()-bolaImagem.get_width()-1 and self.y>self.ultimaPosY and self.y in lista2:
            self.ultimaPosX=self.x
            self.ultimaPosY=self.y
            self.mover="descerEsquerda"
4

2 回答 2

0

如果您想检查球是否与桨发生碰撞,为什么不使用 colliderect 方法?

代码看起来像这样:

barraImagemRect = barraImagem.get_rect()

bolaImagemRect = bolaImagem.get_rect()
isCollided = bolaImagemRect.colliderect(barraImagemRect)

希望有帮助

于 2013-08-28T02:27:32.603 回答
0

为了检测碰撞,我一直在使用:

for dot in particles:
             if get_dist(dot.rect,boom.rect)<dot.radius+boom.radius :
                 particles.remove(dot)

使用定义半径来显示大小,当半径连接时,它会移除粒子(球)。这样,它就有一个恒定的检测方法来找出球是否发生碰撞。

这必须始终处于活动状态并在程序开始时定义。

请注意,这不会直接导致碰撞效果,但可以通过反转速度或根据角度进行即时旋转来轻松更改它。

于 2018-04-24T10:42:00.713 回答