使用 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
对象,而 Bitmap
和 Image
是 System.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 的初步回答
我正在使用 VB.NET 在 XNA 中编写游戏。我想创建一个游戏介绍,将整个屏幕缩放 in/out 并缩放每个图像以完成此操作充其量也很麻烦。我喜欢能够在整个图像上绘制大量 .PNG(或其中的一部分),然后能够在使用 spriteBatch 绘制之前操纵(缩放、旋转等)整个图像。我能找到的示例使用类似:
dim bitmap as New Bitmap
或
dim image as New Image
但是这些代码将 "Bitmap" 或 "Image" 突出显示为红色,我无法使用它们。如果能就此问题提供任何帮助,我将不胜感激!
SpriteBatch
适用于 XNA Texture2D
对象,而 Bitmap
和 Image
是 System.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 的初步回答