使用VB.NET在XNA上绘制屏幕之前绘制图像

时间:2016-06-23 08:34:14

标签: vb.net image xna

我使用VB.NET在XNA中编写游戏。我想创建一个游戏介绍,放大/缩小整个屏幕并缩放每个图像以实现这一点,这是最麻烦的。我希望能够将大量的.PNG(或其中的一部分)绘制到整个图像上,然后能够在使用spriteBatch绘制之前操纵(缩放,转动等)整个图像。我可以找到的例子使用类似的东西:

dim bitmap as New Bitmap

dim image as New Image

但这些代码突出显示了" Bitmap"或"图像"为红色,我不能使用它们。感谢你对这个问题的任何帮助!

2 个答案:

答案 0 :(得分:1)

SpriteBatch适用于XNA Texture2D个对象,而BitmapImage属于System.Drawing个类型。他们不能一起工作。

您可以创建新的RenderTarget2D,使用GraphicsDevice.SetRenderTarget()将其设置为有效,然后使用SpriteBatch进行绘制。然后,您可以使用SpriteBatch将存储的渲染目标绘制到屏幕,因为渲染目标是Texture2D的类型。

答案 1 :(得分:0)

所以我尝试了Petri Laarne的答案,最后提出了一个可行的代码(大多数在线示例都使用C#,并没有解释整个过程)。试着在这里解释一下:

在公共课Game1:

Private WithEvents graphics As GraphicsDeviceManager
Private WithEvents spriteBatch, spriteBatch2 As SpriteBatch

在Loadcontent中:

Public render2 As RenderTarget2D
spriteBatch2 = New SpriteBatch(GraphicsDevice)
spriteBatch = New SpriteBatch(GraphicsDevice)
render2 = New RenderTarget2D(GraphicsDevice, 1024, 768)

在平局中:

spriteBatch2.GraphicsDevice.SetRenderTarget(render2)
        GraphicsDevice.Clear(Color.Black)
        srcRect = New Rectangle(440, 0, 440, 440) : destRect = New Rectangle(100, 335, 440, 440)
        spriteBatch2.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend) : spriteBatch2.Draw(introNEWMirrorDecos, destRect, srcRect, Color.White) : spriteBatch2.End()
        destRect = New Rectangle(300, 335, 440, 440)
        spriteBatch2.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend) : spriteBatch2.Draw(introNEWMirrorDecos, destRect, srcRect, Color.White) : spriteBatch2.End()
        spriteBatch2.GraphicsDevice.SetRenderTarget(Nothing)
        GraphicsDevice.Clear(Color.Black)
        destRect = New Rectangle(512, 384, 1024, 768) : srcRect = New Rectangle(0, 0, 1024, 768)
        spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend) : spriteBatch.Draw(render2, destRect, srcRect, Color.White, PI / 12, New Vector2(512, 384), SpriteEffects.None, 0) : spriteBatch.End() 

这是来自实际游戏的示例代码,它按照预期的方式工作:在备用渲染图像上绘制2个东西,然后将它们绘制为单个图像(在这种情况下能够通过pi / 12旋转它)。

对于如何以不同方式或更高效率执行此操作的任何评论都表示赞赏,并感谢最初的答案@Petri Laarne