2

如果我想用单独颜色的像素填充我的游戏屏幕,我该怎么做?

例如,如果我想编写一个“生命游戏”类型的游戏,其中每个像素都是一个单元,我将如何使用 XNA 来实现呢?

我尝试使用屏幕大小的值数组调用SetData()一个对象,但它抱怨:Texture2DColor

在 GraphicsDevice 上主动设置资源时,您不能在资源上调用 SetData。

在调用 SetData 之前从设备取消设置它。

我该怎么做?或者更好……有没有一种替代的、更好的、有效的方法来用任意像素填充屏幕?

4

4 回答 4

1

关于您遇到的错误,这意味着您正在尝试修改纹理数据,而它仍然绑定到设备上的采样器单元之一。您是在 SpriteBatch.Begin/End 块内调用 SetData 吗?如果是,那就是问题所在(在进行任何绘图之前更新您的纹理)。否则,您是否使用 GraphicsDevice.Textures[x] = yourTexture 直接在设备的纹理采样器之一上设置纹理?如果是,请在开始更改数据之前将 Textures[x] 设置为 null。

就您所做工作的效率而言,它并不理想,但对于您的目的而言可能并不重要。尝试保持图像分辨率合理,并意识到使用这种方法可能不会达到 200 FPS,但我会尝试一下,看看它是否足够快,然后再开始担心性能。

于 2011-01-04T02:19:56.550 回答
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。

于 2011-01-13T01:13:38.833 回答
1

最理想的方法是让你的着色器为你做这件事。在只使用着色器之前,我已经实现了一个生活模拟游戏,其他人也用 XNA http://www.xnainfo.com/content.php?content=21做了同样的事情。

这个想法是使用两种纹理,一种用于旧状态,一种用于新状态。设置它,以便您渲染到新纹理并从旧纹理中读取。你可以直接在着色器中做你的细胞自治:)。

你可以通过这个获得很好的性能,我使用 1024x1024 网格有大约 300fps。

于 2011-01-15T14:25:48.557 回答
0

您可以使用我在此处提到的技术使用 SpriteBatch 绘制矩形。然后,您可以使用它来绘制覆盖屏幕的 1x1 矩形。我不知道那会如何,但它应该可以工作。

这篇App Hub 帖子似乎在谈论您要解决的确切问题。

于 2010-12-23T12:03:57.000 回答