如何在矩形之间进行碰撞检测?

时间:2015-03-29 16:46:13

标签: python-3.x pygame collision-detection

我的代码没有出现任何错误,但它的行为并不像我期望的那样。

问题在于:

if bomb_rect.colliderect(pacman_rect)==True:
    print("hello")

print("hello")只应在两个矩形碰撞时执行,但无论何时都会执行。我不确定我忽略了什么。

编辑: 对困惑感到抱歉。我道歉,让我再解释一下,我有两张进口图片,一张是炸弹,一张是吃豆子。当两张照片发生碰撞时,"你好"将被打印。错误的来源不是bomb_rect.colliderect(pacman_rect),而是设置图像的位置。炸弹的坐标是随机设置的。和Pacman将出现在(0,0)。然而,当我移动Pacman时,我发现即使炸弹图像设置在其他地方,仍然有一个隐藏的炸弹图像设置在(0,0)。因为当我将Pacman图像移动到(0,0)以外时,"你好"停止打印。

import pygame,sys,random
from pygame.locals import *
pygame.init()
blue=(0,250,0)
red=(255,0,0)
black=(0,0,0)

screen = pygame.display.set_mode((1080, 720))

bomb=pygame.image.load("bomb2.bmp")
bomb_rect = bomb.get_rect()

pacman=pygame.image.load("pacman.png")
pacman_rect = pacman.get_rect()

pygame.display.set_caption('game')
background=pygame.Surface(screen.get_size()).convert()
background.fill((255,255,255))



randBombX = random.randrange(0,screen.get_width()-200)
randBombY = random.randrange(0,screen.get_height()-200)
bomb_rect.move(randBombX ,randBombY)


dir_x = 0
dir_y = 0
clock = pygame.time.Clock()
moving=True
while moving:

    clock.tick(20)
    screen.blit(background, (0,0))

    pacman_rect.move_ip(dir_x, dir_y)
    screen.blit(pacman, pacman_rect)
    screen.blit(bomb,(randBombX ,randBombY))
    pygame.display.flip()

    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            quit()
        if e.type == KEYDOWN:
            if e.key == K_ESCAPE:
                moving = False
                quit()
            if e.key == K_LEFT:
                if dir_x ==0 and dir_x >=0:
                    dir_x-=10
                if dir_x == 10:
                    dir_x-=20
                dir_y=0
            if e.key == K_RIGHT:
                if dir_x == 0 and dir_x <=0:
                    dir_x+=10
                if dir_x == -10:
                    dir_x+=20
                dir_y=0
            if e.key == K_UP:
                if dir_y ==0 and dir_y <=0:
                    dir_y -=10
                if dir_y == 10:
                    dir_y -=20
                dir_x=0
            elif e.key == K_DOWN:
                if dir_y ==0 and dir_y >=0:
                    dir_y +=10
                if dir_y == -10:
                    dir_y +=20
                dir_x=0


    if pacman_rect.left < 0 or pacman_rect.right >= screen.get_width():
        dir_x *= -1
    if pacman_rect.top < 0 or pacman_rect.bottom >= screen.get_height():
        dir_y *= -1
    if bomb_rect.colliderect(pacman_rect)==True:
        print("hello")

1 个答案:

答案 0 :(得分:0)

if bomb_rect.colliderect(pacman_rect)==True:

有点多余;对于布尔值,a == Truea相同(如果aTruea==TrueTrue;否则为False })。但这不应该改变你的程序的行为。

但是:

            if dir_x ==0 and dir_x >=0:
                dir_x-=10

如果dir_x == 0(或许你会混淆andor,就会发生这种情况?无论哪种情况,其中一个条件都包含在另一个条件中)。您的代码中有更多if个;我不太确定他们应该做些什么,但据我所知,这可能会改变你的游戏行为,使其与你期望的一致。