我想在旧的qbasik中绘制,在那里你可以分为5行,PSET(x,y)可以得到任何图形,或者Lissajous数字。
问题:WPF有什么更好的方法?和XNA的方式?
任何样品?
答案 0 :(得分:1)
对于WPF和Silverlight WriteableBitmap
http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap.aspx
WriteableBitmapEx库。试图通过扩展方法来补偿这种方法,这些方法像内置方法一样易于使用,并提供类似GDI +的功能: http://writeablebitmapex.codeplex.com/
答案 1 :(得分:1)
在XNA中,这通常不是最有效的,但我认为最好的办法是创建一个纹理并使用SetData设置每个像素,并使用SpriteBatch将其渲染到屏幕上。
SpriteBatch spriteBatch;
Texture2D t;
Color[] blankScreen;
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
//initialize texture
t = new Texture2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, false, SurfaceFormat.Color);
//clear screen initially
blankScreen = new Color[GraphicsDevice.Viewport.Width * GraphicsDevice.Viewport.Height];
for (int i = 0; i < blankScreen.Length; i++)
{
blankScreen[i] = Color.Black;
}
ClearScreen();
}
private void Set(int x, int y, Color c)
{
Color[] cArray = { c };
//unset texture from device
GraphicsDevice.Textures[0] = null;
t.SetData<Color>(0, new Rectangle(x, y, 1, 1), cArray, 0, 1);
//reset
GraphicsDevice.Textures[0] = t;
}
private void ClearScreen()
{
//unset texture from device
GraphicsDevice.Textures[0] = null;
t.SetData<Color>(blankScreen);
//reset
GraphicsDevice.Textures[0] = t;
}
protected override void Draw(GameTime gameTime)
{
spriteBatch.Begin();
spriteBatch.Draw(t, Vector2.Zero, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
使用此功能,您可以在更新或绘图中随意调用Set或ClearScreen。您可能必须使用纹理索引(我在本例中仅使用0,可能不适合您),而且您只需要每帧取消设置/重置一次,因此您可以根据使用方式对其进行优化它们。