Python 如何使用pygame检测两个精灵的碰撞?

Python 如何使用pygame检测两个精灵的碰撞?,python,pygame,sprite,collision,Python,Pygame,Sprite,Collision,这是到目前为止我的代码,我可以移动,它会放置一个光点来拾取,我只需要知道如何注册它,并将光点移动到一个新的随机点! 我对pygame非常陌生,python也不是100%流利,但我很正派。如果有pdf:s,那么对于中级程序员来说,当涉及到python时,这将是非常棒的 import sys, pygame, os, math from random import randint pygame.init() size = width, height = 800, 600 speed = [2,

这是到目前为止我的代码,我可以移动,它会放置一个光点来拾取,我只需要知道如何注册它,并将光点移动到一个新的随机点! 我对pygame非常陌生,python也不是100%流利,但我很正派。如果有pdf:s,那么对于中级程序员来说,当涉及到python时,这将是非常棒的

import sys, pygame, os, math
from random import randint

pygame.init()

size = width, height = 800, 600
speed = [2, 2]
black = 1, 1, 1
screen = pygame.display.set_mode(size)
pygame.display.set_caption('Pick up the squares!')
UP='up'
DOWN='down'
LEFT='left'
RIGHT='right'

ball = pygame.image.load("ball.png")
ballrect = ball.get_rect()
ballx = 400
bally = 300

blip = pygame.image.load("blip.png")
bliprect = blip.get_rect()
blipx = randint(1,800)
blipy = randint(1,600)

background = pygame.Surface(screen.get_size())
background = background.convert()

background.fill((250, 250, 250))


clock = pygame.time.Clock()

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()


    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT]:
        ballx  -= 5
    if keys[pygame.K_RIGHT]:
        ballx += 5
    if keys[pygame.K_UP]:
        bally -= 5
    if keys[pygame.K_DOWN]:
        bally +=5    

    screen.fill(black)
    screen.blit(ball, (ballx,bally))
    screen.blit(blip, (blipx, blipy))
    pygame.display.update()
    clock.tick(40)

使用矩形的
colliderect
方法:

if ballrect.colliderect(bliprect):
    print 'Do something here'
def does_collide(rect1, rect2):
    if rect1.x < rect2.x + rect2.width and rect1.x + rect1.width > rect2.x \ 
       and rect1.y < rect2.y + rect2.height and rect1.height + rect1.y > rect2.y:
        return True
    return False

基本碰撞检测的工作原理如下(假设您使用的是两个矩形):

def不冲突(rect1,rect2):
如果rect1.xrect2.x\
和rect1.yrect2.y:
返回真值
返回错误

幸运的是,Pygame中包含了这些方法,因此您应该使用@MalikBrahimi的答案-使用
colliderect
函数调用,这将为您提供数学依据

您也可以尝试使用
pygame.sprite.spritecollide()

a
这是冲突中某个精灵的类的变量名
b
这是您的第二个精灵将加入的小组。您可以将最后一个设置为True,这将从组中删除精灵。设置为False将保持原样。以下是一个例子:

if pygame.sprite.spritecollide(my_ball, ballGroup, False):
    Ball.speed[0] = -Ball.speed[0]
    hit.play()
Ball.move()

我的精灵的变量名是
my\u ball
。包含此冲突中其他精灵的组是
ballGroup
。我将最后一个设置为False,以使所有精灵保持在曲面上。如果我设置为True,则将从组和屏幕中删除
ballGroup
中的精灵。我希望这对你有帮助

又来了,多米。当有预定义的方法为您完成工作时,无需测试坐标。晚上好,Malik,了解碰撞背后的数学是很好的,这是一个真正的游戏开发人员应该知道的!)这里有一个相关的例子可以彻底解释这个理论。我可以用它来说‘如果ballrect.colliderec(bliprect):然后将光点的位置更改为一个新的位置吗?是的,这不是重点吗?在if语句下,只需设置要更改的矩形的位置。如果可以的话,请注明答案。
if pygame.sprite.spritecollide(my_ball, ballGroup, False):
    Ball.speed[0] = -Ball.speed[0]
    hit.play()
Ball.move()