2

我在开发我的简单游戏时偶然发现了一个问题并且已经坚持了很长一段时间,我希望任何人都可以为我提供一个优雅的解决方案或朝着正确的方向迈出一步。

我目前有一个简单的自上而下的滚动条,玩家现在只是一个白色立方体,地图周围是旋转 45 度的Krypton光锥。玩家必须避免被灯光看到,所以我正在尝试创建一个像素碰撞方法来在玩家落入照明区域范围内时触发事件。

Krypton 有一个属性可以返回围绕灯光的边界矩形,但我不能将它用于碰撞,因为它会在灯光的整个区域周围绘制一个巨大的正方形,所以即使你站在后面,玩家也会被检测到光。我要准确。

我也尝试在照明区域周围画一个三角形,但这里的问题是它没有我想要的那么准确,因为一些光线穿过走廊,我无法准确地拾取使用静态三角形,加上三角形穿过墙壁,因为光线的范围实际上大于地图的一半,但大部分只是被阴影外壳阻挡。玩家必须能够躲避墙壁后面的灯光。这是我的意思的图像示例。图片

所以我认为最好的方法是检查播放器像素之一的颜色是否已更改为某个 .. RGB 值。这需要一些硬编码,但它是一个简单的游戏,所以我不介意这种方法。但是在这里我遇到了一些麻烦。

我读过这个Texture2D.GetData<>方法,我可以这样做,但是它返回一个实际导入纹理的颜色数组,它总是白色的。它不返回后处理的结果。这是有道理的,因为场景中可以有多个纹理。

我尝试的下一个是GraphicsDevice.GetBackBufferData<>返回视口的所有像素,这会立即使我的 FPS 降至零,有过载只能检索特定范围内的像素,但它们似乎对我不起作用,因为我总是对超出索引异常。这是我在使用此方法时尝试的方法:

Color[] colors = new Color[10]
GraphicsDevice.GetBackBufferData<Color(colors, 0, 10);

(只是一个例子,但我似乎无法理解为什么这不起作用。)

因此,或多或少地切入正题,我正在寻找一种方法来检索某个区域的颜色数组或我的视口坐标,这样我就可以比较所述数组中的所有颜色以查看它们是否匹配。

抱歉,如果它有点长,但我会非常感谢任何建议或指导,因为我不知道我错过了什么,我已经关注了大多数关于这个的教程,他们似乎都比较了两个碰撞纹理的颜色值纹理,但如果我没记错的话,纹理本身实际上永远不会改变颜色,因为它只是一个被绘制的导入资产。我想我需要检索纹理被绘制的地方的颜色,以正确检查是否有变化。

亲切的问候

编辑:

我让它工作,作为 GetBackBufferData 中的参数的矩形运行良好,禁用 MultiSampling 使滞后不存在。感谢您的建议,@Bjarke Søgaard 和 @thomas88wp。

Color colorArray = new Color[player.Bounds.Width * player.Bounds.Height];
Color[] colors = new Color[player.Bounds.Width * player.Bounds.Height];
GraphicsDevice.GetBackBufferData<Color>(rec, colors, 0, colors.Count());
4

0 回答 0