python - 如何仅从加载的图像的一部分制作 pygame 表面对象?
问题描述
来自多精灵图像的像素完美碰撞
我想做像素完美的碰撞检查。我有一个带有透明背景的PNG格式的6帧精灵,但它们都在一个精灵表上。(“敌人”精灵每个有 2 帧。)我可以为它们设置动画并很好地移动它们。
如何仅从加载的图像的一部分制作pygame 表面对象?我想我可以单独加载每个精灵帧,但这很费力,而且看起来不像是好的编码。
更多信息
我可以很容易地将整个 spritesheet 变成一个掩码,如下所示(最初在 spritesheet 类中,但在这里进行了简化):
# Load image
sheet = pygame.image.load("spritesheet.png")
# Create mask
sheet_mask = pygame.mask.from_surface(sheet)
我可以简单地使用当前帧的矩形来检测碰撞,但这会非常不令人满意,因为有时碰撞似乎会在没有接触的情况下发生。一个 pygame 为这类事情提供了这个美妙的掩码对象。
在主游戏循环的每个循环中,我想检查一个精灵的适当帧与另一个精灵的适当帧。我一直在尝试为每个帧创建一个蒙版,然后将它们存储在一个列表中。
解决方案
使用subsurface()方法从 a 获得一个矩形次表面pygame.Surface
:
sheet = pygame.image.load("spritesheet.png")
rect_area = pygame.Rect(left, top, width, heigth)
sprite_from_sheet = sheet.subsurface(rect_area)
推荐阅读
- microsoft-teams - 为什么当我将它添加到 Microsoft 团队时我的选项卡是空白的?
- flutter - 如何将 CupertinoDatePicker 保持在屏幕底部而不是整个屏幕?
- angular - ng build throws 无法读取空异常的属性“startTag”
- mql4 - 为什么这个基本的 MQL4 代码要花这么长时间才能加载到我的 MT4 上?
- git - Git:区分函数列表
- vue.js - Vue判断组件是否挂载
- hyperledger-fabric - 在对等点上实例化链码时出错
- ios - POST API 在更改 Rest API 的基本 URL 后停止在 iOS Swift 中工作
- r - 如何删除列中小数点后面不必要的零
- sql-server - 删除最近 2 个函数集 (mastersp_id, exec_id) 日志以外的执行日志