碰撞检测逻辑错误

时间:2014-03-21 15:35:20

标签: python-3.x pygame

我正在研究Pong的克隆并检测碰撞btw球和我使用过这句话的踏板

if ball_pos[1] in  range(paddle_1[1],paddle_1[1]+30) and ball_pos[0] in  range(0,gutter+10) :
        ball_vel[0] *= -1

但是,如果我尝试为正确的球拍实现相同的功能,那么它就不起作用了。 这是整个代码

import time
import pygame

done = False
pygame.init()

screen_size = [320,240]

white = [255,255,255]
black = [0,0,0]

gutter = 10

ball_pos = [160,120]
ball_vel = [1,0]
paddle_1 = [0,0]
paddle_2 = [screen_size[0]-5,0]
vel_1 = [0,0]
vel_2 = [0,0]
P1 = False
P2 = False

screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption("mygame")



while not done:
    time.sleep(0.02)
    screen.fill(black)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        if event.type == pygame.KEYDOWN:
            if pygame.key.get_pressed()[pygame.K_DOWN]:
                vel_1[1] += 2
                P1 = True
            if pygame.key.get_pressed()[pygame.K_UP]:    
                P1 = True
                vel_1[1] -= 2
            if pygame.key.get_pressed()[pygame.K_s]:
                P2 = True
                vel_2[1] += 2
            if pygame.key.get_pressed()[pygame.K_w]:
                P2 = True
                vel_2[1] -= 2

        if event.type == pygame.KEYUP:
            if(P1):
                vel_1 = [0,0]
                P1 = False
            if (P2):
                vel_2 = [0,0]
                P2 = False

    if ball_pos[1] in  range(paddle_1[1],paddle_1[1]+30) and ball_pos[0] in  range(0,gutter+10) :
        ball_vel[0] *= -1

    #This Is Where I am getting a Funny Behaviour
    if ball_pos[1] in  range(paddle_2[1],paddle_2[1]+30) and ball_pos[0] in  range(230,240):
        ball_vel[0] *= -1

    if ball_pos[1] > 230 or ball_pos[1] < 5:
        ball_vel[1] *= -1

    paddle_1[0] += vel_1[0]
    paddle_1[1] += vel_1[1]
    paddle_2[0] += vel_2[0]
    paddle_2[1] += vel_2[1]

    ball_pos[0] += ball_vel[0]
    ball_pos[1] += ball_vel[1]


    pygame.draw.line(screen,white,(gutter,0),(gutter,screen_size[1]))
    pygame.draw.line(screen,white,(screen_size[0]-gutter,0),(screen_size[0]-gutter,screen_size[1]))
    pygame.draw.circle(screen,white,ball_pos,10,0)
    pygame.draw.line(screen,white,[paddle_1[0]+5,paddle_1[1]],[paddle_1[0]+5,paddle_1[1]+30],gutter)
    pygame.draw.line(screen,white,paddle_2,[paddle_2[0],paddle_2[1]+30],10)
    pygame.display.flip()




pygame.quit()

1 个答案:

答案 0 :(得分:2)

该行

if ball_pos[1] in  range(paddle_2[1],paddle_2[1]+30) and ball_pos[0] in  range(230,240):

应该是

if ball_pos[1] in range(paddle_2[1],paddle_2[1]+30) and ball_pos[0] in  range(310,320):

240是屏幕的高度,但您要检查屏幕的宽度,即320。< / p>

您的代码还有一些问题,但这超出了此答案的范围。