2

Pygame で Pong クローンを構築しています。ボールとパドルに衝突検出を追加して、ボールがパドルから跳ね返るようにする方法がわかりません。これどうやってするの?ボールがパドルに当たったときにボールを反対方向に移動させるにはどうすればよいですか?

bif="bg.jpg"

import pygame, sys
from pygame.locals import *

pygame.init()
pygame.display.set_caption("Griffin West's Python Pong")
pygame.mixer.init()
sounda= pygame.mixer.Sound("Music.wav")

sounda.play()

screen=pygame.display.set_mode((1280,720),0,32)
background=pygame.image.load(bif).convert()

color1=(255,255,255)
color2=(255,255,0)
color3=(0,0,255)
color4=(0,255,0)
pos1=(640,0)
pos2=(640,720)
pos3=(640,360)
pos4=(0,360)
pos5=(1280,360)
radius=(100)
x1,y1=75,0
x2,y2=1175,0
x3,y3=1,1
clock=pygame.time.Clock()
speedx=750
speedy=750
movex1, movey1=0,0
movex2, movey2=0,0
s1=0
s2=0


while True:


    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type==KEYDOWN:
            if event.key==K_w:
                movey1=-2
            elif event.key==K_s:
                movey1=+2
            if event.key==K_UP:
                movey2=-2
            elif event.key==K_DOWN:
                movey2=+2
        if event.type==KEYUP:
            if event.key==K_w:
                movey1=0
            elif event.key==K_s:
                movey1=0
            if event.key==K_UP:
                movey2=0
            elif event.key==K_DOWN:
                movey2=0

    x1+=movex1
    y1+=movey1
    x2+=movex2
    y2+=movey2


    milli=clock.tick()
    seconds=milli/1000.0
    dx=seconds*speedx
    dy=seconds*speedy
    x3+=dx
    y3+=dy

    if x3>1280: 
        x3+=-dx  # get ball out of the wall
        speedx = -speedx  # change direction
        s1=s1+1
    if y3>720:
        y3+=-dy
        speedy = -speedy
    if x3<0:
        x3+dx
        speedx = -speedx
        x3=x3+1
        s2=s2+1
    if y3<0:
        y3=y3+1
        y3+=dy
        speedy = -speedy
    if x3<=y3y3+30:
        speedx = -speedy


    screen.blit(background, (0,0))

    screen.lock()
    pygame.draw.line(screen, color1, pos1, pos2, 1)
    pygame.draw.circle(screen, color1, pos3, radius, 1)
    pygame.draw.circle(screen, color1, pos4, radius, 1)
    pygame.draw.circle(screen, color1, pos5, radius, 1)
    pygame.draw.rect(screen, color3, Rect((x1,y1),(30,100)))
    pygame.draw.rect(screen, color2, Rect((x2,y2),(30,100)))
    pygame.draw.circle(screen, color4, (int(x3),int(y3)), 15)

    screen.unlock()
    myfont = pygame.font.SysFont("Press Start 2P", 50)
    myfont2 = pygame.font.SysFont("Press Start 2P", 25)
    label = myfont.render("Python", 1, (255,0,0))
    screen.blit(label, (494, 115))
    label = myfont.render("Pong", 1, (255,0,0))
    screen.blit(label, (544, 175))
    label = myfont2.render("Player 1: "+str(s1), 1, (255,255,255))
    screen.blit(label, (25, 675))
    label = myfont2.render("Player 2: "+str(s2), 1, (255,255,255))
    screen.blit(label, (950, 675))
    pygame.display.update()
4

2 に答える 2

3

この回答には、衝突検出を含むサンプルポン実装があります。具体的には、bounce以下にリストされているコード内のメソッドに関心があります。

Pong クラスでは:

def move_all(self):
    for obj in self.p1, self.p2, self.ball:
        obj.move()
        if obj is not self.ball:
            obj.bounce(self.ball)

パドルクラスでは:

def bounce(self, ball):
    minimum = self.size.x + ball.radius
    if self.position.x != ball.position.x and self.overlap(ball, minimum):
        if not self.just_bounced:
            self.just_bounced = True
            self.score += abs(ball.velocity.y)
        sign = +1 if self.position.x < ball.position.x else -1
        if self.collision_area == self.PART.center:
            ball.position.x = self.position.x + minimum * sign
        else:
            ball.position.adjust(self.middle_point, minimum)
        ball.velocity.x = copy_sign(ball.velocity.x, sign)
        ball.change_speed()
    else:
        self.just_bounced = False

ボールクラスでは:

def bounce(self):
    if self.position.y - self.radius < 0:
        self.position.y = self.radius
        self.velocity.y = copy_sign(self.velocity.y, +1)
        self.change_speed()
    elif self.position.y + self.radius > self.board.y:
        self.position.y = self.board.y - self.radius
        self.velocity.y = copy_sign(self.velocity.y, -1)
        self.change_speed()
于 2013-01-25T13:34:56.050 に答える
0

ボールの x 座標がパドルの x 座標を超えたかどうか、およびボールの y 座標がパドルの上下の y 座標内にあるかどうかを確認する if ステートメントを作成します。その場合、ボールの x 速度に -1 を掛けます。

于 2013-01-25T04:25:36.607 に答える