C#XNA检索矩形内的像素

C#XNA检索矩形内的像素,c#,xna,krypton,C#,Xna,Krypton,我在做我的简单游戏时偶然发现了一个问题,并且已经被困了很长一段时间,我希望任何人都能为我提供一个优雅的解决方案,或者朝着正确的方向迈出一步 我现在有一个简单的自上而下的滚动条,播放器现在只是一个白色的立方体,在地图周围旋转45度的光锥。 播放器必须避免被灯光看到,所以我尝试创建一个像素碰撞 方法在玩家落在点亮区域的范围内时触发事件 Krypton有一个属性,返回灯光周围的边框,但我不能将其用于碰撞,因为它会在整个灯光区域周围绘制一个巨大的正方形,因此即使你站在灯光后面,玩家也会被检测到。我要准确

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

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

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

我也试着在照明区域周围画一个三角形,但问题是它没有我想要的那么精确,因为有些光线穿过走廊,我不能用静态三角形准确地捕捉到,加上三角形穿过墙壁,因为光线的范围实际上超过了地图的一半,但大部分只是被阴影外壳挡住了。玩家必须能够躲开墙后的灯光。这里有一个图像例子来说明我的意思

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

我读到了
Texture2D.GetData
方法,我可以这样做,但是它返回实际导入纹理的颜色数组,该数组始终为白色。它不会返回后处理的结果。这很有意义,因为场景中可以有多个纹理

下一个我尝试的是
GraphicsDevice.GetBackBufferData
,它返回视口的所有像素,这会立即将我的FPS降为无,有重载只检索特定范围内的像素,但它们似乎对我不起作用,因为我总是对索引外异常感到惊讶。以下是我在使用此方法时尝试的内容:

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

GraphicsDevice.GetBackBufferDataI从未完成过类似的工作,因此我建议的唯一解决方案是使用RenderTarget。但我想到的过程,听起来与GetBackBufferData非常相似。基本上,将所有内容渲染到rendertarget,并使用它从中获取像素。但这可能与图形设备相同。我同意上面的方法可能会更好。另外,如果您要使用您的方法,我将使用第三个重载,如果GetBackBufferData,并在渲染角色的位置向它传递一个Rect。只需确保数组大小正确(矩形的宽度*高度)。不过,这似乎是一个非常可行的方法。我真的很感谢您的输入,我在我的player类中添加了一个矩形属性,并按照建议将其传递给GetBackBufferData。这似乎是可行的,我得到了我的角色雪碧正确的颜色。因此,更进一步的修补似乎奏效了,但矩形仅为35*35像素,每当我运行该方法时,我的fps仍会下降到5左右,这一点我觉得很奇怪。其他游戏经常对多个对象使用像素碰撞方法,而我只是迭代1225个像素。你觉得有什么可以补救的吗?不管怎样,我都要感谢你的时间。我很确定大多数游戏实际上并不是在所有像素上循环。可能只是上述图像的边界。要么这样,要么他们跟踪每个像素(同样,仅在边界上)并用其进行测试。那样的话,你只会循环遍历所有真正重要的像素,而不是每次循环遍历像素时都在读取(也就是解析它们)。请注意,在每一帧中循环像素要比保存矢量2的集合并循环像素要困难得多。你说得对!但是,我并没有遍历我的后缓冲区中的所有像素。(就我而言)我正在从中检索一个35*35的矩形,我在其中循环。它仍然比一般正确编码的游戏更多,也不仅仅是扫描边界,但我会想办法改进这一点。我现在很满意。
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());