【问题标题】:Forming bounding box only around visible sprites仅在可见精灵周围形成边界框
【发布时间】:2011-01-05 07:41:54
【问题描述】:

这个网站在帮助我进行游戏开发方面真的很棒,但是我无法找到以下问题的答案(我自己也无法解决)。

我正在尝试在我的游戏中进行矩形碰撞。我的想法是 1) 获取原始碰撞边界矩形 2) 转换纹理 (pos/rot/scale) 3) 将项目的因子变化转换为矩阵,然后使用该矩阵更改项目的原始碰撞边界。

但是,我的纹理包含很多透明度,透明度会影响纹理的整体高度/宽度(我这样做是为了保持二维的幂)。

我的问题:如何创建一个矩形来形成忽略对象周围透明度的尺寸。如下图:

【问题讨论】:

    标签: c# .net xna


    【解决方案1】:

    我想您可以从顶部开始逐步遍历边界矩形中的每一行像素,通过检查其 alpha 值 (Color.A != 0) 来检查您第一次用颜色击中像素的时间。

    这样你会得到矩形的 Y 坐标。

    然后从边界矩形的左侧开始遍历每一列,寻找第一个彩色像素。

    你会这样得到 X。

    然后再次遍历每一行,但从底部开始,您将获得高度。 然后再次遍历每一列,但从右边开始,你会得到宽度。

    希望有帮助

    【讨论】:

      【解决方案2】:

      我认为dois answer是这样做的方法。我使用以下代码来查找纹理内特定点的像素值。您可以更改此代码以逐行获取像素,检查透明度并在找到具有不透明像素的行时停止。

      Color[] colorData = new Color[1];
      Texture2D texture = //Get your Texture2D here
      texture.GetData<Color>(0, new Rectangle(targetPoint.X, targetPoint.Y, 1, 1), colorData, 0, 1);
      

      要检查像素是否不透明,我这样做:

      if(colorData[0].A > 0)
      

      不过,我不知道这种操作对于碰撞检测的成本有多高。

      【讨论】:

      • 性能应该不是问题 - 只需在加载时计算边界框并将其缓存以供以后使用。
      【解决方案3】:

      我知道我的游戏,我使用圆圈。如果您的对象相当圆,它通常可以提供更接近的估计并且碰撞检测非常容易。如果物体中心之间的距离小于半径之和,则它们正在碰撞。

      如果圈子是不可能的,那么 muku 或 Dois 提供了不错的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        相关资源
        最近更新 更多