Python中的碰撞检测(pygame)

Python中的碰撞检测(pygame),pygame,Pygame,我一直在想碰撞检测是如何工作的,我已经尝试过很多次了,但都没有成功。我是pygame的新手,所以如果有人愿意阅读本文,请您在我的代码中添加正确的行并进行解释。如果有人想知道这个代码是怎么做的,它有两个赛车正试图击中一个足球,并将其向汽车撞击的方向移动(我想一个可能的方法是检查汽车旋转的角度,并将球向前移动180度) 多谢各位 import pygame from pygame.math import Vector2 pygame.init() screen = pygame.display.

我一直在想碰撞检测是如何工作的,我已经尝试过很多次了,但都没有成功。我是pygame的新手,所以如果有人愿意阅读本文,请您在我的代码中添加正确的行并进行解释。如果有人想知道这个代码是怎么做的,它有两个赛车正试图击中一个足球,并将其向汽车撞击的方向移动(我想一个可能的方法是检查汽车旋转的角度,并将球向前移动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()
有多种方法: 您可以将每个精灵的坐标保存为变量,然后将两个精灵的坐标相互比较,而不是在它们足够接近时执行任何需要的操作,例如:

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
如果您想知道它是如何工作的,我不是100%确定,但它可能会在内部使用两种基本方法中的一种来计算它

distance=((object2_X-object1_X)**2+(object2_Y-object1_Y)**2)**0.5
if distance <= 10:
    #do something
    pass
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