Python(pygame)中的碰撞检测

时间:2018-07-31 15:15:20

标签: pygame

我一直想知道碰撞检测是如何工作的,我做了很多尝试,但是无法使其正常工作。我是pygame的新手,所以如果有人有足够的知识来阅读此内容,请您在我的代码中添加正确的行并进行解释。如果有人想知道这段代码是做什么的,它有2辆赛车试图踢足球并将其朝着汽车撞击的方向移动(我当时想的一种可能的方法是检查汽车旋转的角度然后将球移动该角度-180度将其向前移动)

非常感谢您

import pygame
from pygame.math import Vector2


pygame.init()
screen = pygame.display.set_mode((1150, 800))
clock = pygame.time.Clock()  
BLUECAR_ORIGINAL = pygame.Surface((100, 30), pygame.SRCALPHA)
pygame.draw.polygon(
    BLUECAR_ORIGINAL, (0, 0, 255), [(0, 0), (50, 10), (50, 20), (0, 30)])
bluecar = BLUECAR_ORIGINAL

REDCAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(
    REDCAR_ORIGINAL, (200, 0, 0), [(0, 0), (50, 10), (50, 20), (0, 30)])
redcar = REDCAR_ORIGINAL

ball = pygame.draw.circle(screen, [255,255,255],[60,60],5)






pos = Vector2(70, 70)  
vel = Vector2(7, 0)

poss = Vector2(70,70)
vell = Vector2(7,0)

redrect = redcar.get_rect(center=pos)
redangle = 0  

bluerect = bluecar.get_rect(center=pos)
blueangle = 0


run = True
while run:
ball = pygame.draw.circle(screen, [0,0,0],[575,400],30)
pygame.display.flip()
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        run = False




keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:

    redangle += 5
    vel.rotate_ip(-5)
    redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)

    redrect = redcar.get_rect(center=pos)
elif keys[pygame.K_RIGHT]:
    redangle -= 5
    vel.rotate_ip(5)
    redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
    redrect = redcar.get_rect(center=pos)


if keys[pygame.K_a]:
    blueangle += 5
    vell.rotate_ip(-5)
    bluecar = pygame.transform.rotate(BLUECAR_ORIGINAL, blueangle)
    bluerect = bluecar.get_rect(center=pos)
elif keys[pygame.K_d]:
    blueangle -= 5
    vell.rotate_ip(5)
    bluecar = pygame.transform.rotate(BLUECAR_ORIGINAL, blueangle)
    bluerect = bluecar.get_rect(center=poss)

hits = pygame.sprites.groupcollide(bluecar, ball, False, False)
hits = pygame.sprites.spritecollide(bluecar, ball, False)


pos += vel
redrect.center = pos  

poss += vell
bluerect.center = poss

bgImg = pygame.image.load("Football_pitch.png")
screen.blit(bgImg, (0,0))

screen.blit(redcar, redrect)

screen.blit(bluecar, bluerect)




pygame.display.flip()
clock.tick(60)  
pygame.quit()

1 个答案:

答案 0 :(得分:0)

有多种方法: 您可以将每个子画面的坐标另存为变量,然后将两个子画面的坐标相互比较,而不必在它们足够接近时进行任何操作,例如:

if object1_X <= object2_X+5 and object1_X>= object2_X-5 and object1_Y<= object2_Y+5 and object1_Y>=object2_X-5:
    #do something
    #all that above basically is just saying if the objects above are within a 10-pixel radius of each other do something
    pass

或者您可以使用距离公式:

distance=((object2_X-object1_X)**2+(object2_Y-object1_Y)**2)**0.5
if distance <= 10:
    #do something
    pass

利用勾股定理找到两个物体之间的距离

或者您可以使用pygame的现有功能:

object1=pygame.draw.rect(screen,color,[x,y1,50,30],0)
object2=pygame.draw.rect(screen,colorb,[x2,y2,7,7],0)
if object1.colliderect(object2):
    #do something
    pass

如果您想知道它是如何工作的,我不确定100%,但它可能会内部使用两种基本方法之一来计算