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

Drawing on an image before drawing on screen in XNA using VB.NET

我正在使用 VB.NET 在 XNA 中编写游戏。我想创建一个游戏介绍,将整个屏幕缩放 in/out 并缩放每个图像以完成此操作充其量也很麻烦。我喜欢能够在整个图像上绘制大量 .PNG(或其中的一部分),然后能够在使用 spriteBatch 绘制之前操纵(缩放、旋转等)整个图像。我能找到的示例使用类似:

dim bitmap as New Bitmap

dim image as New Image

但是这些代码将 "Bitmap" 或 "Image" 突出显示为红色,我无法使用它们。如果能就此问题提供任何帮助,我将不胜感激!

SpriteBatch 适用于 XNA Texture2D 对象,而 BitmapImageSystem.Drawing 类型。他们不一起工作。

您可以创建一个新的 RenderTarget2D,使用 GraphicsDevice.SetRenderTarget() 将其设置为活动状态并使用 SpriteBatch 将其绘制到那里。然后,您可以使用 SpriteBatch 将存储的渲染目标绘制到屏幕上,因为渲染目标是 Texture2D.

的一种类型

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

在PublicClass游戏1中:

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

在加载内容中:

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 的初步回答