我在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"
答案 0 :(得分:0)
如果你想检查球是否与桨碰撞,为什么不使用碰撞方法?
代码看起来像这样:
barraImagemRect = barraImagem.get_rect()
bolaImagemRect = bolaImagem.get_rect()
isCollided = bolaImagemRect.colliderect(barraImagemRect)
希望有所帮助
答案 1 :(得分:0)
为了检测碰撞,我一直在使用:
for dot in particles:
if get_dist(dot.rect,boom.rect)<dot.radius+boom.radius :
particles.remove(dot)
使用定义半径来显示大小,当半径连接时,它会移除粒子(球)。这样,它有一个恒定的检测方法来确定球是否碰撞。
这必须处于始终处于活动状态并在程序开始时定义。
请注意,这并不会直接导致碰撞效果,但可以通过反转速度或根据角度进行即时旋转来轻松改变。