如果没有精灵,我无法在pygame中检测到碰撞



我试图在不使用精灵的情况下制作一个乒乓游戏,但我似乎无法正确检测碰撞。第一个if语句正确地检测到碰撞并适当地反弹,但第二个if语句根本没有检测到碰撞,我不知道为什么。

if ballx <= rectx2 and ((bally >= recty and bally <= recty2) or (bally2 >= recty and bally2 <= recty2)):
    ballright = True
    print("paddle 1 collision")
if ballx2 >= rect2x and ((bally >= rect2y and bally <= rect2y2) or (bally2 >= rect2y and bally2 <= rect2y2)): #DOES NOT DETECT COLLISION
    ballright = False
    print("paddle 2 collision")

这是完整的代码。

import pygame, sys
from pygame.locals import *
import random
pygame.init()
import os
os.environ['SDL_VIDEO_WINDOW_POS'] = "0,0"
info = pygame.display.Info()
screenWidth = info.current_w
screenHeight = info.current_h
screenSize = [screenWidth, screenHeight]
screen = pygame.display.set_mode(screenSize)
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()
#colors     R      G      B
white = (255, 255, 255)
black = (    0,     0,     0)
blue =  (    0,     0, 255)
red =    (255,     0,     0)
ballx = 30
bally = 345
balldiam = 10
bally2 = bally + balldiam
ballx2 = ballx + balldiam
if random.randint(0,100)> 50:
    balldown = True
else:
    balldown = False
ballright = True
ballspeed = 10
balllocation = (ballx, bally)
rectx = 5
recty = 290
rectx2 = 30
recty2 = 460
paddle01location = (rectx, recty, rectx2, recty2)
def drawPaddle01():
    pygame.draw.rect(screen, black, [rectx, recty, 25, 170], 0)
rect2x = 1335
rect2y = 290
rect2x2 = 1360
rect2y2 = 460
paddle02location = (rect2x, rect2y, rect2x2, rect2y2)
def drawPaddle02():
    pygame.draw.rect(screen, black, [rect2x, rect2y, 25, 170], 0)
def moveBall():
    global ballx, bally, balldown, ballright, bally2
    #Do we need to bounce?
    if balldown and bally >= screenHeight - balldiam:
        balldown = False
    if not balldown and bally <= 0:
        balldown = True
    if ballright and ballx >= screenWidth - balldiam:
        ballright = False
    if not ballright and ballx <= 0:
        ballright = True
    #Check for collision with paddle 01
    if ballx <= rectx2 and ((bally >= recty and bally <= recty2) or (bally2 >= recty and bally2 <= recty2)):
        ballright = True
        print("paddle 1 collision")
    #Check for collision with paddle 02
##    if ballx2 == 1270 and rect2y <= bally <= rect2y2 or rect2y <= bally2 <= rect2y2: DETECTS BALL COLLISION W/ PADDLE 02 WHEN THERE IS NO COLLISION
    if ballx2 >= rect2x and ((bally >= rect2y and bally <= rect2y2) or (bally2 >= rect2y and bally2 <= rect2y2)): #DOES NOT DETECT COLLISION
        ballright = False
        print("paddle 2 collision")
    #Move ball in correct directions
    if balldown == True and ballright == True:
        bally += ballspeed
        ballx += ballspeed
        bally2 += ballspeed
    if balldown == True and ballright == False:
        bally += ballspeed
        ballx -= ballspeed
        bally2 += ballspeed
    if balldown == False and ballright == True:
        bally -= ballspeed
        ballx += ballspeed
        bally2 -= ballspeed
    if balldown == False and ballright == False:
        bally -= ballspeed
        ballx -= ballspeed
        bally2 -= ballspeed
player1score = 0 
player2score = 0     
def score():
    global player1score, player2score
    if ballx == 0:
        player2score += 1
    if ballx + balldiam >= screenWidth:
        player1score += 1
def drawBall():
    pygame.draw.ellipse(screen, red, [ballx, bally, balldiam, balldiam], 0)
def pollKeys():
    global rectx, recty, recty2, rectx2, rect2x, rect2y, rect2y2, rect2x2
    keys = pygame.key.get_pressed()
    if keys[K_w] and recty - 10 > 0:
        recty -= 10
        recty2 -= 10
    if keys[K_s] and recty2 + 10 < 765:
        recty += 10
        recty2 += 10
    if keys[K_UP] and rect2y - 10 > 0:
        rect2y -= 10
        rect2y2 -= 10
    if keys[K_DOWN] and rect2y2 + 10 < 765:
        rect2y += 10
        rect2y2 += 10
def pollKeysEsc():
    keys = pygame.key.get_pressed()
    if keys[K_ESCAPE]:
        pygame.quit()
done = False
while not done:
    # 1. Process events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
    pollKeys()
    # 2. Program logic, change variables, etc.
    moveBall()
    score()
    # 3. Draw stuff
    screen.fill(white)
    #Draw paddle 1st player
    drawPaddle01()
    #Draw paddle 2nd player
    drawPaddle02()
    #Draw ball
    drawBall()
    #Draw Scoreboards
    font = pygame.font.Font(None, 36)
    text = font.render("P1 = %d" % player1score, True, blue)
    screen.blit(text, [10, 10])
    text2 = font.render("P2 = %d" % player2score, True, blue)
    screen.blit(text2, [1200, 10])
    #Draw winning text
    if player1score >= 1: #MAKE SURE YOU CHANGE THIS BEFORE TURNING IT IN!!!!!
        font2 = pygame.font.Font(None, 50)
        text3 = font2.render("Player 1 wins!!! Press ESC to quit.", True, red)
        pollKeysEsc()
        screen.blit(text3, [400, 300])
    elif player2score >= 1: #MAKE SURE YOU CHANGE THIS BEFORE TURNING IT IN!!!!!
        font2 = pygame.font.Font(None, 50)
        text3 = font2.render("Player 2 wins!!! Press ESC to quit", True, red)
        pollKeysEsc()
        screen.blit(text3, [400, 300])
    pygame.display.flip()
    clock.tick(30)
pygame.quit()
bally2 = bally + balldiam
ballx2 = ballx + balldiam

这些全局变量定义一次。因为它们是相对于一直变化的ballyballx的,所以当球改变位置时,必须在循环内更新它们。

没有冲突时的检测可能是因为或比bally <= rect2y2 or rect2y <= bally2中的其他运算符具有更高的优先级。

当你为球添加速度时,你永远不会更新ballx2,这里:

bally += ballspeed
ballx -= ballspeed
bally2 += ballspeed

相关内容

  • 没有找到相关文章

最新更新