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