簡體   English   中英

PyGame中的Pong,移動的槳葉導致擊球時球停止再生

[英]Pong in PyGame, Moving paddles causes the ball to stop regenerating when hitting the side

因此,我嘗試使用pygame創建一個簡單的單人Pong游戲。 球開始了,當它碰到牆壁時,它就會再生....只要我不移動球拍。 當我移動槳葉時,球會從所有牆壁反彈,甚至不考慮槳葉是否在那里。 任何代碼來解決這個問題將不勝感激。 謝謝!

import sys
import pygame
pygame.init()

size = width, height = 1000, 800
screenColor = 0, 0, 0
outline = 0, 0, 255

paddleOne = pygame.image.load("PONGPADDLE.png")
ball = pygame.image.load("Bullet.png")
ballRect = ball.get_rect()
speed = [1, 1]
paddleOne_x = 980
paddleOne_y = 400

paddleOnePos_x = 0
paddleOnePos_y = 0

screen = pygame.display.set_mode(size)

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                paddleOnePos_y = -1
            if event.key == pygame.K_DOWN:
                paddleOnePos_y = +1

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                paddleOnePos_y = 0
            if event.key == pygame.K_DOWN:
                paddleOnePos_y = 0

    ballRect = ballRect.move(speed)

    if ballRect.left < 0:
        speed[0] = -speed[0]
    if ballRect.top < 0 or ballRect.bottom > height:
        speed[1] = -speed[1]
    if ballRect.right == 980:
        if ballRect.right > paddleOne_y & ballRect.right < paddleOne_y:
            speed[0] = -speed[0]
        else:
            ballRect = ball.get_rect()

    paddleOne_y += paddleOnePos_y

    screen.fill(screenColor)
    screen.blit(paddleOne, (paddleOne_x, paddleOne_y))
    screen.blit(ball, ballRect)
    pygame.draw.rect(screen, outline, ((0, 0), (width, height)), 5)
    pygame.display.flip()

好的,我對您的代碼進行了一些調試,原因似乎是此行。

if ballRect.right > paddleOne_y & ballRect.right < paddleOne_y:

我將復制粘貼一些我用來幫助解釋的調試信息。 我將這些行插入到您的代碼中。

if ballRect.right == 980:
    print('ballRect.right > paddleOne_y ' + str(ballRect.right) + '>' + str(paddleOne_y) + str(paddleOne_y & ballRect.right > paddleOne_y))
    print('ballRect.right < paddleOne_y ' + str(ballRect.right) + '<' + str(paddleOne_y) + str(paddleOne_y & ballRect.right < paddleOne_y))
    print(str(paddleOne_y & ballRect.right) + ' paddleOne_y & ballRect.right')
    print('ballRect.right > paddleOne_y & ballRect.right < paddleOne_y')
    print(str(ballRect.right) + '>' + str(paddleOne_y & ballRect.right) + '<' + str(paddleOne_y))
    print()
    if ballRect.right > paddleOne_y & ballRect.right < paddleOne_y:
        speed[0] = -speed[0]
    else:
        ballRect = ball.get_rect()

以下代碼是不移動撥片時發生的情況。

ballRect.right > paddleOne_y 980>400 False
ballRect.right < paddleOne_y 980<400 False
400 paddleOne_y & ballRect.right
ballRect.right > paddleOne_y & ballRect.right < paddleOne_y
980 > 400 < 400

if ballRect.right > paddleOne_y & ballRect.right < paddleOne_y:該行首先評估paddleOne_y & ballRect.right ,如果您不移動槳葉, paddleOne_y = 400問我為什么,也許有人可以幫忙,但是paddleOne_y & ballRect.right如果您不動,您的撥片的評估值為980和400,我想這paddleOne_y & ballRect.right 400。 因此,它永遠不會進入for循環並反彈的原因是ballRect.right > paddleOne_y & ballRect.right < paddleOne_y計算結果為980 > 400 < 400並且400不小於400。例如,您會得到諸如

ballRect.right > paddleOne_y 980>231 False
ballRect.right < paddleOne_y 980<231 True
196 paddleOne_y & ballRect.right
ballRect.right > paddleOne_y & ballRect.right < paddleOne_y
980 > 196 < 231

如果將槳向下移動,您將得到。

ballRect.right > paddleOne_y 980>710 False
ballRect.right < paddleOne_y 980<710 True
708 paddleOne_y & ballRect.right
ballRect.right > paddleOne_y & ballRect.right < paddleOne_y
980 > 708 < 710

只要您在屏幕上顯示小鍵盤,中間數字就始終位於其他兩個數字之間,因此它始終滿足if語句。

我希望這有助於澄清問題。 附帶說明一下,您在乒乓球比賽中有一個很好的開始,我建議在更新槳葉運動之前確保槳葉處於邊界,這是一項出色的工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM