Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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 Pygame与面具的碰撞不起作用_Python_Pygame_Collision Detection_Mask - Fatal编程技术网

Python Pygame与面具的碰撞不起作用

Python Pygame与面具的碰撞不起作用,python,pygame,collision-detection,mask,Python,Pygame,Collision Detection,Mask,我已经做了一个推杆游戏,现在我想添加一个斜墙类型。因此,我需要为碰撞使用遮罩(直到现在我才使用了矩形)。我花了几个小时学习面具,并试图找出我的代码无法工作的原因。没有错误,只是没有检测到碰撞 我将代码简化为更小的代码,这是一种有效测试代码的方法。从我所看到的一切来看,这似乎应该是可行的,但事实并非如此。这是: 导入pygame #Pygame初始化东西 pygame.init() 风宽=1200 风高=700 gameDisplay=pygame.display.set_模式((风宽、风高))

我已经做了一个推杆游戏,现在我想添加一个斜墙类型。因此,我需要为碰撞使用遮罩(直到现在我才使用了矩形)。我花了几个小时学习面具,并试图找出我的代码无法工作的原因。没有错误,只是没有检测到碰撞

我将代码简化为更小的代码,这是一种有效测试代码的方法。从我所看到的一切来看,这似乎应该是可行的,但事实并非如此。这是:

导入pygame
#Pygame初始化东西
pygame.init()
风宽=1200
风高=700
gameDisplay=pygame.display.set_模式((风宽、风高))
pygame.display.set_标题(“迷你高尔夫!”)
pygame.display.update()
gameExit=False
clock=pygame.time.clock()
#课程设置
班级舞会:
定义初始化(self,x,y):
self.x=x
self.y=y
self.image=pygame.image.load(“sball.png”)
self.rect=self.image.get_rect()
self.mask=pygame.mask.from_surface(self.image)
def渲染(自):
self.rect.topleft=(self.x,self.y)
blit(self.image,self.rect)
类倾斜:
定义初始化(self,x,y):
self.x=x
self.y=y
self.image=pygame.image.load(“posslant.png”)
self.rect=self.image.get_rect()
self.mask=pygame.mask.from_surface(self.image)
def渲染(自):
self.rect.topleft=(self.x,self.y)
blit(self.image,self.rect)
#创建对象
球=球(250250)
斜面=斜面(270250)
#游戏循环
gameExit=False
而不是(游戏退出):
#移动球
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
gameExit=True
elif event.type==pygame.KEYDOWN:
如果event.key==pygame.K_UP:
ball.y-=1
elif event.key==pygame.K_向下:
ball.y+=1
elif event.key==pygame.K_左:
ball.x-=1
elif event.key==pygame.K_RIGHT:
球.x+=1
#碰撞检测
偏移量_x,偏移量_y=(slante.rect.x-ball.rect.x),(slante.rect.y-ball.rect.y)
如果倾斜遮罩重叠(球遮罩,(偏移量x,偏移量y)):
打印(“点击”)
#吸引一切
gameDisplay.fill((0,0,0))
ball.render()
slate.render()
pygame.display.update()
时钟滴答(100)

方法的偏移参数是
其他掩码相对于对象的相对位置。
因此,通过从
球的坐标减去
斜面的坐标来计算偏移量:

offset\ux,offset\uy=(sland.rect.x-ball.rect.x),(sland.rect.y-ball.rect.y)

偏移=(ball.rect.x-sland.rect.x),(ball.rect.y-sland.rect.y) 如果倾斜.遮罩.重叠(球.遮罩,偏移): 打印(“点击”)

创建遮罩图像时,我建议通过调用以下命令确保图像具有每像素alpha格式:

班级舞会:
定义初始化(self,x,y):
self.x=x
self.y=y
self.image=pygame.image.load(“sball.png”)
self.rect=self.image.get_rect()

self.mask=pygame.mask.from_surface(self.image.convert_alpha())#请提供一个最小的可复制示例。在图像中是否使用透明像素?我想你应该在你的表面上调用
convert_-alpha()
(例如:
self.image=pygame.image.load(“sball.png”).convert_-alpha()
),但是我不能肯定没有你的图像。我的图像是透明的,所以我不认为我需要做任何转换我只是尝试使用
convert_-alpha()
而且它似乎没有改变任何东西。您可以看看这里吗?这是有道理的,但仍然无法修复代码。我仍然没有收到打印的声明。谢谢你的帮助,真奇怪。这和我的照片有什么关系吗?它们都是.png。我已经上传到这里:@LoganHolmes白色矩形的位深度是24。我恢复了它的深度为32,它可以工作:。但您可以通过调用
.convert\u alpha()
来解决此问题。看到答案了。非常感谢,它现在起作用了。我已经在这上面呆了很久了。你花了这么多时间来帮助我,我真是感激不尽。