-1

Pong ゲームを pygame で作成していますが、まだ完成していません。コード内の変数、クラス、その他の名前はポルトガル語ですが、どちらが何をするのかを知るのは簡単だと思います。このコードは、2 つのパドルと、ゲーム ウィンドウの上限と下限に当たると跳ね返る 1 つのボールを作成します。パドルに当たったときにバウンスするはずですが、それは起こっていません。パドルを無視して窓の外に出ます。エラーメッセージは表示されません。

完全なコード:

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 に答える