【问题标题】:Per Pixel Collision - Could do with some general tipsPer Pixel Collision - 可以使用一些一般提示
【发布时间】:2013-01-31 10:24:27
【问题描述】:

我了解 Xna 中 Per Pixel Collision 背后的理论,你从两个纹理中获取纹理数据,然后比较它们,检查例如你的角色纹理的 alpha 值。

我想要做的是使用 Per Pixel Collision 通过检查与某种颜色(黑色)的碰撞来检查 Player Sprite 是否接触了地图。我之前尝试过实现这一点,但字符总是从地图上掉下来,没有引发编程错误。 请将我指向文章/教程/视频,或者如果这里有人可以给我一些提示和要点,那也很棒。

【问题讨论】:

  • 我意识到这有点离题,但如果你正在开发一款新游戏,你应该知道 XNA 已经“死”了:wpcentral.com/xna-dead-long-live-xna。在你努力创造新东西之前,你可能想看看 MonoGame:monogame.codeplex.com
  • 你想展示一些你的碰撞代码吗?
  • 我已经用谷歌搜索了,是的,但是大多数文章都很老,而且看起来真的很啰嗦。我也很遗憾地知道 Xna 已经死了 :( 但我仍然觉得它是一个令人愉快的平台。我目前没有任何代码可以展示,我希望首先获得一些一般性指导,甚至是一些伪代码,因为经过多次尝试,我的代码无法正常工作。
  • 这里是一个关于如何use occlusion queries for pixel perfect collision的例子。尽管如此,我还是很难想到基于像素的碰撞系统是一个不错的选择。如何通过使用不可见的碰撞多边形将碰撞与视觉完全分离?

标签: c# xna collision


【解决方案1】:

如果我是你,我不会检查两个纹理之间的像素到像素。不过,只检查一点与地图并不算太糟糕;

//In Class-scope:
Color[] CollisionMapData;
Texture2D CollisionMap;

public void LoadContent()  
{  
    CollisionMap = Content.Load<Texture2D>("map");  
    CollisionMapData = new Color[CollisionMap.Width * CollisionMap.Height];  
    CollisionMap.GetData<Color>(CollisionMapData);  
}  

public Boolean Collision(Vector2 position)  
{  
    int index = (int)position.Y * CollisionMap.Width + (int)position.X;

    if (index < 0 || index >= CollisionMapData.Length) //Out of bounds  
        return true;

    if (CollisionMapData[index] == Color.Black)
        return true;

    return false;
}

要根据地图检查整个玩家精灵,您必须为玩家精灵中的每个像素调用 Collision 方法,创建一个 vector2 来获取正确的点。 检查几个点要容易得多(例如;topleft、topmiddle、topright、left、right、bottomleft、bottommiddle、bottomright。无需检查中间,因为侧面已经在测试。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多