python - 精灵蒙版碰撞不起作用(矩形碰撞起作用)
问题描述
当我使用时碰撞有效:
pygame.sprite.collide_rect
但是当我使用时它不起作用:
pygame.sprite.collide_mask
这是我的 2 节课:
class Ball():
def __init__(self):
self.rect = balltexture.get_rect()
self.rect.x=225
self.rect.y=400
self.radius = 100
self.velx=0
self.vely=0
self.action=False
self.switchx=0
self.switchy=0
pygame.sprite.Sprite.__init__(self)
self.mask = pygame.mask.from_surface(balltexture)
def draw(self):
win.blit(balltexture, self.rect)
class rock():
def __init__(self, y):
self.rect = rocktexture.get_rect()
self.rect.x = screensize.current_w
self.rect.y = y
self.width = 120
pygame.sprite.Sprite.__init__(self)
self.mask = pygame.mask.from_surface(rocktexture)
def draw(self, win):
win.blit(rocktexture, self.rect)
这是碰撞检查
for i in rocks:
if pygame.sprite.collide_rect(i, Player):
print(1)
if pygame.sprite.collide_mask(i, Player):
print(2)
因此,当它们发生碰撞时,它始终打印 1。
顺便说一句,我正在移动矩形坐标(例如 Player.rect.x)来移动播放器/岩石,我也尝试了遮罩重叠方法,但它也不起作用
offset = (Player.rect.x-i.rect.x, Player.rect.y-i.rect.y)
if i.mask.overlap(Player.mask, offset):
print(2)
解决方案
不太清楚发生了什么,但这里有一些事情可以尝试:
您可以使用 self.mask.fill() 将掩码设置为全 1。此时,蒙版碰撞应该与基于矩形的碰撞相同。
您可以调用 print(self.mask.count()),它将显示设置的像素数。确保它不是 0 或其他东西。
您可以调用 i.mask.overlap(Player.mask (0, 0)),并在它们具有相同的左上角时确认它们是否重叠。
这要么是创建蒙版的问题,要么是偏移量在某种程度上是错误的;这应该缩小问题的范围。
推荐阅读
- groovy - 如何在某个步骤中暂停所有线程组,直到其他线程组中的进程完成 - Jmeter
- sql - SQL Server 使用查找转换导入的数据
- algorithm - 我们可以构建的三角形数量
- node.js - 从一个数组 Firestore (Firebase) 中选择随机值
- powerbi - 修复内存密集型计算列
- c - 良好的风格实践:C 变量
- .net - 使用 Octopus Deploy 部署 TopShelf Windows 服务每两次都失败
- php - 调用数据库查询时创建的新 PHPSESSID(使用 Directus)
- flowtype - 我可以一次导入所有流类型吗?
- spring-boot - Spring boot,Security,OAuth2:是否可以使用自定义 AuthorizationCodeResourceDetails?身份验证服务器需要重定向 url 中的特定参数