Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何让碰撞检测在矩形之间工作?_Python 3.x_Pygame_Collision Detection - Fatal编程技术网

Python 3.x 如何让碰撞检测在矩形之间工作?

Python 3.x 如何让碰撞检测在矩形之间工作?,python-3.x,pygame,collision-detection,Python 3.x,Pygame,Collision Detection,我的代码没有收到任何错误,但是它的行为并不像我期望的那样 问题在于: if bomb_rect.colliderect(pacman_rect)==True: print("hello") 只有在两个矩形发生碰撞时才应执行打印(“hello”),但无论发生什么情况,它都会执行。我不确定我忽略了什么 编辑: 很抱歉给你带来了困惑。对不起,让我再解释一遍,我有两张进口的照片,一张是炸弹,一张是吃豆人。当两张图片发生冲突时,将打印“hello”。错误的来源不是bomb_rect.collid

我的代码没有收到任何错误,但是它的行为并不像我期望的那样

问题在于:

if bomb_rect.colliderect(pacman_rect)==True:
    print("hello")
只有在两个矩形发生碰撞时才应执行
打印(“hello”)
,但无论发生什么情况,它都会执行。我不确定我忽略了什么

编辑: 很抱歉给你带来了困惑。对不起,让我再解释一遍,我有两张进口的照片,一张是炸弹,一张是吃豆人。当两张图片发生冲突时,将打印“hello”。错误的来源不是bomb_rect.collide rect(pacman_rect),而是设置图像的地方。炸弹的坐标是随机设定的。Pacman将出现在(0,0)处。但是,当我移动Pacman时,我发现即使炸弹图像设置在其他位置,仍然有一个不可见的炸弹图像设置为(0,0)。因为当我移动Pacman图像超过(0,0)时,“hello”停止打印

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")
import pygame,sys,random
从pygame.locals导入*
pygame.init()
蓝色=(0250,0)
红色=(255,0,0)
黑色=(0,0,0)
screen=pygame.display.set_模式((1080720))
bomb=pygame.image.load(“bomb2.bmp”)
bomb\u rect=bomb.get\u rect()
pacman=pygame.image.load(“pacman.png”)
pacman_rect=pacman.get_rect()
pygame.display.set_标题('game')
background=pygame.Surface(screen.get_size()).convert()
背景填充((255255))
randBombX=random.randrange(0,屏幕。获取宽度()-200)
randBombY=random.randrange(0,屏幕。获取高度()-200)
炸弹直线移动(randBombX,randBombY)
dir_x=0
dir_y=0
clock=pygame.time.clock()
移动=真
移动时:
时钟滴答(20)
屏幕光点(背景,(0,0))
pacman直接移动ip(方向x,方向y)
screen.blit(吃豆人,吃豆人)
屏幕。blit(炸弹,(随机炸弹,随机炸弹))
pygame.display.flip()
对于pygame.event.get()中的e:
如果e.type==pygame.QUIT:
退出
如果e.type==KEYDOWN:
如果e.key==K_转义:
移动=错误
退出
如果e.key==K_左:
如果dir_x==0且dir_x>=0:
dir_x-=10
如果dir_x==10:
dir_x-=20
dir_y=0
如果e.key==K_RIGHT:
如果dir_x==0且dir_x=screen.get_width():
dir_x*=-1
如果pacman_rect.top<0或pacman_rect.bottom>=screen.get_height():
dir_y*=-1
如果bomb_rect.collide rect(pacman_rect)=True:
打印(“你好”)
有点多余
a==True
与布尔值的
a
相同(如果
a
True
a==True
True
;否则为
False
)。但这不应改变程序的行为

但是:


如果
dir\u x==0
(可能您混淆了
以及
?无论哪种情况,一个条件都包含在另一个条件中)。如果代码中有
s,则这些
会更多;我不太确定他们应该做什么,但据我所知,这可能会改变游戏的行为,而不是你所期望的。

codeReview资料,不是真正的stackOverflow。试着检查你的支票是否有效。这可能是单元测试的一个例子。@MarcusMüller不,这不是实质性的。此代码未按预期工作,而未按预期工作的代码则显式脱离主题。事实上,尽管这可能是一个好问题,也可能不是一个好问题,但它完全在我们的讨论范围之内。用户代码未按预期工作,正在请求帮助修复。如果这不是我的主题,我不知道是什么;迈克尔,请接受我的道歉。然而,我仍然认为不清楚你在问什么,因为你没有解释你试图做什么来确定哪里出了问题;如果你能做到这一点,并提出你遇到的问题,我想你会给我们一个更好回答的问题。@MarcusMüller我编辑了他的问题——我想现在问的问题更清楚了。谢谢,试着回答:)谢谢你指出这一点,应该是
。我也有大量的if语句,我将尝试修复它们。我认为问题在于
bomb\u rect.move(randBombX,randBombY)
这里,我不确定图像是否随机设置。
if bomb_rect.colliderect(pacman_rect)==True:
            if dir_x ==0 and dir_x >=0:
                dir_x-=10