【问题标题】:How do I detect the collision of two sprites using pygame?如何使用 pygame 检测两个精灵的碰撞?
【发布时间】:2015-04-13 19:34:17
【问题描述】:

到目前为止,这是我的代码,我可以移动它并放置一个 blip 来拾取,我只需要知道如何注册它并将 blip 移动到一个新的随机位置! 我对 pygame 很陌生,也不是 100% 精通 python,但我很不错。如果有 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)

【问题讨论】:

    标签: python pygame sprite collision


    【解决方案1】:

    使用矩形的colliderect方法:

    if ballrect.colliderect(bliprect):
        print 'Do something here'
    

    【讨论】:

    • 我可以用它说'if ballrect.colliderec(bliprect): 然后将blip的位置更改为新的吗?
    • 是的,这不是重点吗?在 if 语句下,只需设置要更改的矩形的位置。如果可以,请标记为答案。
    【解决方案2】:

    基本的碰撞检测是这样工作的(假设您使用两个矩形):

    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
    

    幸运的是,Pygame 包含这样的方法,所以你应该使用@MalikBrahimi 的答案——使用colliderect 函数调用,它会为你做数学计算。

    【讨论】:

    • 嘿,多米。如果有预定义的方法可以为您完成工作,则无需测试坐标。
    • 晚上 Malik,很高兴了解真正的游戏开发者应该知道的碰撞背后的数学原理! :)
    • 这是一个相关的article,可以彻底解释理论。
    【解决方案3】:

    你也可以试试pygame.sprite.spritecollide():

    if pygame.sprite.spritecollide(a, b, False):
        pass
        #Do something
    

    a 这是碰撞中精灵之一的类的变量名。 b 这是您的第二个精灵所在的。您可以将最后一个设置为 True,这将从 group 中删除精灵。设置为 False 将保持原样。这是一个例子:

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

    我的精灵的变量名是my_ball。包含此碰撞中其他精灵的组是ballGroup。我将最后一个设置为 False 以将所有精灵保留在表面上。如果我设置为 True,来自ballGroup 的精灵将从组和屏幕中删除。希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2017-09-14
      • 1970-01-01
      • 2019-11-05
      相关资源
      最近更新 更多