如何使用 pygame 检测两个精灵的碰撞?
How do I detect the collision of two sprites using pygame?
到目前为止,这是我的代码,我可以移动它并放置一个 blip 来拾取,我只需要知道如何注册它并将 blip 移动到一个新的随机位置!
我对 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
幸运的是 Pygame 包含了这样的方法,因此您应该使用 @MalikBrahimi 的答案 - 使用 colliderect
函数调用,这将为您计算。
您也可以尝试使用 pygame.sprite.spritecollide()
:
if pygame.sprite.spritecollide(a, b, False):
pass
#Do something
a
这是碰撞中其中一个精灵的 class 的变量名称。 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
的精灵将从组和屏幕中删除。希望对您有所帮助!
到目前为止,这是我的代码,我可以移动它并放置一个 blip 来拾取,我只需要知道如何注册它并将 blip 移动到一个新的随机位置! 我对 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
幸运的是 Pygame 包含了这样的方法,因此您应该使用 @MalikBrahimi 的答案 - 使用 colliderect
函数调用,这将为您计算。
您也可以尝试使用 pygame.sprite.spritecollide()
:
if pygame.sprite.spritecollide(a, b, False):
pass
#Do something
a
这是碰撞中其中一个精灵的 class 的变量名称。 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
的精灵将从组和屏幕中删除。希望对您有所帮助!