【问题标题】:Qt QImage - check sprites collideQt QImage - 检查精灵碰撞
【发布时间】:2016-08-25 15:07:21
【问题描述】:

我有 2 个精灵 (QImage) = 两张具有透明背景的图片。我想知道精灵是否碰撞。 我已经检查了两个矩形是否重叠。但我想知道这两个图像是否真的重叠(红色区域)。

我的第一个想法是使用 QPainter 和 QPainter::CompositionMode_SourceIn 或 QPainter::CompositionMode_DestinationIn 创建两个图像重叠的图像(粉红色矩形)。这样,如果图像真正重叠,新图像将不会完全透明。 但是如何快速检查它是否完全透明呢?

如何快速检查两个图像是否真的重叠? 你的方法是什么?

【问题讨论】:

  • 请问精灵有多大?如果它们足够小(例如 32x32),那么您建议的方法应该可以通过简单地扫描QImage::constBits 返回的合成图像数据来正常工作。而且您只需要在边界矩形相交时执行该检查。
  • 精灵的大小由用户选择。所以图片可以大也可以小。

标签: qt sprite game-engine qpainter qimage


【解决方案1】:

你的方法没有错。合成图像可以是将 8 个像素打包成一个字节的位图。将源图像转换为位图(透明像素 = 0 值,不透明 = 1 值),然后将它们组合在一起,然后扫描非零值。这将非常快 - 与内存带宽一样快。但它会消耗合成图像的内存。

您还可以为任一图像生成 n 元空间分区树,树节点表示不透明片段,并通过合并树来检测冲突,同时仅包括树 2 中与树 1 重叠的节点。开创性论文Merging BSP Trees Yields Polyhedral Set Operations 给出了算法。

基准测试需要决定哪种方法更快,以及混合方法(BSP 降低到某个单元大小,然后位图表示)是否会更快。

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多