如果我想用单独颜色的像素填充我的游戏画面,我该怎么做?
例如,如果我想编写一个“game of life”类型的游戏,其中每个像素都是一个单元格,我将如何使用XNA实现这一目标?
我尝试使用屏幕大小的SetData()
值数组在Texture2D
对象上调用Color
,但它抱怨:
在图形设备上主动设置资源时,您可能无法在资源上调用SetData。
在调用SetData之前从设备取消设置。
我该怎么办?或者更好的是......是否有一种替代的,更好,更有效的方法来填充具有任意像素的屏幕?
答案 0 :(得分:1)
关于您获得的错误,这意味着您正在尝试修改纹理数据,同时它仍然绑定到设备上的某个采样器单元。你在SpriteBatch.Begin / End块中调用SetData吗?如果你是,那就是问题(在你做任何绘图之前更新你的纹理)。否则,您是否使用GraphicsDevice.Textures [x] = yourTexture直接在其中一个设备的纹理采样器上设置纹理?如果是,请在开始更改数据之前将Textures [x]设置为null。
就你所做的效率而言,它并不理想,但它可能对你的目的无关紧要。尝试保持图像分辨率合理,并意识到你可能不会用这种方法达到200 FPS,但我会尝试它,看看它是否足够快,在你开始担心性能之前。
答案 1 :(得分:1)
在Texture2D上设置数据后,您无法再对其进行更改。解决这个问题的方法是创建1x1 Texture2D并将其颜色设置为白色。然后,您将使用您想要像素的颜色绘制它。由于您的纹理是白色的,因此所需的颜色将完美地呈现出您选择的颜色。
Texture2D pixel = new Texture2D(App.GraphicsDevice, 1, 1);
colors = new Color[1];
colors[0] = Color.White;
pixel.SetData(colors);
这是一个使用上面像素绘制像素的示例函数。
public void DrawPixel(SpriteBatch spriteBatch, Vector2 pos, Color tint)
{
spriteBatch.Draw(pixel, pos, tint);
}
为每个像素绘制重用此Texture2D。
答案 2 :(得分:1)
最理想的方法是让着色器为您完成。我在使用着色器之前实现了一个生命模拟游戏,其他人也使用XNA http://www.xnainfo.com/content.php?content=21做了同样的事情。
这个想法是使用两个纹理,一个用于旧状态,一个用于新状态。进行设置,以便渲染到新纹理并从旧纹理中读取。您可以直接在着色器中执行细胞自主瘤:)。
你可以用这个获得很好的性能,我使用1024x1024网格大约有300fps。
答案 3 :(得分:0)
你可以使用我提到here的技术来使用SpriteBatch绘制矩形。然后,您可以使用它来绘制覆盖屏幕的1x1矩形。我不知道会有多高效,但应该有效。
这App Hub post似乎在讨论您要解决的确切问题。