Como: Usar sprites
Você pode usar sprites para desenho de imagens e de texto na tela.Este exemplo demonstra o desenho e o processamento.
O formulário para este exemplo de código possui os seguintes objetos:
Este exemplo de código carrega uma textura a partir de um arquivo para criar o sprite.Será necessário incluir um bitmap pequeno em seu projeto a ser implantado para o dispositivo ou emulador.
O construtor do formulário especifica as configurações do dispositivo de PresentationParameters propriedade, cria um Device objeto e chama o dispositivo Reset método. Ele também constrói um Font objeto.
A tabela a seguir descreve métodos de exemplo que processam o sprite.
Observação: |
---|
Aplicativos móveis de Direct3D gerenciado requerem software Windows Mobile versão 5.0 para Pocket PCs e Smartphones.Consulte Recursos externos para o .NET Compact Framework Para obter informações sobre o software Windows Mobile e SDKs. |
Método |
Ações |
---|---|
OnDeviceReset |
|
OnPaint |
|
Exemplo
O exemplo de código a seguir fornece um formulário completo.Ele desenha um sprite usando um bitmap fornecido.
Class Sprites
Inherits Form
' The objects that will be used to show
' the uses of the Sprite class
Private device As Device
Private d3dFont As Microsoft.WindowsMobile.DirectX.Direct3D.Font
Private sprite As Sprite
Private texture As Texture
Public Sub New()
Dim present As PresentParameters
Dim gdiFont As System.Drawing.Font
Me.Text = "Using Sprites"
' Give the application a way to be closed.
' This must be done before the device is created
' as it will cause the hwnd of the Form to change.
Me.MinimizeBox = False
present = New PresentParameters()
present.Windowed = True
present.SwapEffect = SwapEffect.Discard
device = New Device(0, DeviceType.Default, Me, CreateFlags.None, present)
AddHandler device.DeviceReset, AddressOf OnDeviceReset
' Construct a new Sprite.
' Sprites do not need to be recreated
' when a device is reset.
sprite = New Sprite(device)
gdiFont = New System.Drawing.Font(FontFamily.GenericSansSerif, 10F, FontStyle.Regular)
' Construct a new font. Fonts do not need
' to be recreated when a device is reset.
d3dFont = New Microsoft.WindowsMobile.DirectX.Direct3D.Font(device, gdiFont)
OnDeviceReset(Nothing, EventArgs.Empty)
End Sub
Private Sub OnDeviceReset(ByVal sender As Object, ByVal e As EventArgs)
' Textures must be recreated whenever a device is reset
' no matter what pool they are created in.
texture = TextureLoader.FromFile(device, "image.bmp")
End Sub
Protected Overrides Sub OnPaintBackground(ByVal e As PaintEventArgs)
' Do nothing.
End Sub
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
' Begin the scene and clear the back buffer to black
device.BeginScene()
device.Clear(ClearFlags.Target, Color.Black, 1.0F, 0)
' When using sprites it is important to
' specify sprite flags passed to Sprite.Begin
sprite.Begin(SpriteFlags.SortTexture Or SpriteFlags.AlphaBlend)
' Draw an image to the screen using Sprite.Draw
Dim spriteY As Integer = 5
sprite.Draw(texture, Vector3.Empty, New Vector3(0, spriteY, 0), Color.White.ToArgb())
spriteY += texture.GetLevelDescription(0).Height + 5
' Draw a portion of an image to the screen
' using Sprite.Draw. This shall be drawn such
' that the image is modulated with the color green.
sprite.Draw(texture, New Rectangle(4, 4, 24, 24), Vector3.Empty, New Vector3(0, spriteY, 0), Color.Green)
spriteY += 30
' Draw text to the screen. Using a sprite to draw text
' to the screen is essential for good performance.
' Otherwise the font object will perform a
' Sprite.Begin/Sprite.End internally for
' each call to Font.DrawText. This can cause severe
' performance problems.
spriteY = 150
d3dFont.DrawText(sprite, "This is text.", 5, spriteY, Color.Red)
spriteY += d3dFont.Description.Height + 5
d3dFont.DrawText(sprite, "This is another line of text.", 5, spriteY, Color.Green)
spriteY += d3dFont.Description.Height + 5
d3dFont.DrawText(sprite, "Only one call to Sprite.Begin.", 5, spriteY, Color.Blue)
' End drawing using this sprite. This will cause the
' sprites to be flushed to the graphics driver and will
' reset the transformation matrices, textures states,
' and renderstates if the SpriteFlags specified in Begin
' call for that to happen.
sprite.End()
' Finish the scene and present it on the screen.
device.EndScene()
device.Present()
End Sub
Shared Sub Main()
Application.Run(New Sprites())
End Sub
End Class
class Sprites : Form
{
// The objects that will be used to show
// the uses of the Sprite class
private Device device;
private Microsoft.WindowsMobile.DirectX.Direct3D.Font d3dFont;
private Sprite sprite;
private Texture texture;
public Sprites()
{
PresentParameters present;
System.Drawing.Font gdiFont;
this.Text = "Using Sprites";
// Give the application a way to be closed.
// This must be done before the device is created
// as it will cause the hwnd of the Form to change.
this.MinimizeBox = false;
present = new PresentParameters();
present.Windowed = true;
present.SwapEffect = SwapEffect.Discard;
device = new Device(0, DeviceType.Default, this,
CreateFlags.None, present);
device.DeviceReset += new EventHandler(OnDeviceReset);
// Construct a new Sprite.
// Sprites do not need to be recreated
// when a device is reset.
sprite = new Sprite(device);
gdiFont = new System.Drawing.Font
(FontFamily.GenericSansSerif,
10.0f, FontStyle.Regular);
// Construct a new font. Fonts do not need
// to be recreated when a device is reset.
d3dFont= new Microsoft.WindowsMobile.DirectX.Direct3D.Font
(device, gdiFont);
OnDeviceReset(null, EventArgs.Empty);
}
private void OnDeviceReset(object sender, EventArgs e)
{
// Textures must be recreated whenever a device is reset
// no matter what pool they are created in.
texture = TextureLoader.FromFile(device, "image.bmp");
}
protected override void OnPaintBackground(PaintEventArgs e)
{
// Do nothing.
}
protected override void OnPaint(PaintEventArgs e)
{
// Begin the scene and clear the back buffer to black
device.BeginScene();
device.Clear(ClearFlags.Target, Color.Black, 1.0f, 0);
// When using sprites it is important to
// specify sprite flags passed to Sprite.Begin
sprite.Begin(SpriteFlags.SortTexture | SpriteFlags.AlphaBlend);
// Draw an image to the screen using Sprite.Draw
int spriteY = 5;
sprite.Draw(texture, Vector3.Empty, new Vector3(0,
spriteY, 0),
Color.White.ToArgb());
spriteY += texture.GetLevelDescription(0).Height + 5;
// Draw a portion of an image to the screen
// using Sprite.Draw. This shall be drawn such
// that the image is modulated with the color green.
sprite.Draw(texture, new Rectangle(4, 4, 24, 24),
Vector3.Empty,
new Vector3(0, spriteY, 0), Color.Green);
spriteY+= 30;
// Draw text to the screen. Using a sprite to draw text
// to the screen is essential for good performance.
// Otherwise the font object will perform a
// Sprite.Begin/Sprite.End internally for
// each call to Font.DrawText. This can cause severe
// performance problems.
spriteY = 150;
d3dFont.DrawText(sprite, "This is text.",
5, spriteY, Color.Red);
spriteY += d3dFont.Description.Height + 5;
d3dFont.DrawText(sprite, "This is another line of text.",
5, spriteY, Color.Green);
spriteY += d3dFont.Description.Height + 5;
d3dFont.DrawText(sprite, "Only one call to Sprite.Begin.",
5, spriteY, Color.Blue);
// End drawing using this sprite. This will cause the
// sprites to be flushed to the graphics driver and will
// reset the transformation matrices, textures states,
// and renderstates if the SpriteFlags specified in Begin
// call for that to happen.
sprite.End();
// Finish the scene and present it on the screen.
device.EndScene();
device.Present();
}
static void Main()
{
Application.Run(new Sprites());
}
}
Compilando o código
Este exemplo requer referências aos seguintes namespaces:
N:Microsoft.WindowsMobile.DirectX
N:Microsoft.WindowsMobile.DirectX.Direct3D
N:sistema. desenho
Programação robusta
Crie sprites e fontes no construtor do formulário para que eles não precisam ser recriados quando o dispositivo ser redefinido.
Para um bom desempenho, use um sprite para desenhar o texto.Caso contrário, o objeto fonte internamente realiza sprite Begin e End métodos para cada telefonar para DrawText.
Se possível, ao usar um sprite por quadro, aninhar o sprite em uma telefonar a Begin e End métodos para um sprite.
Especifique o seguinte SpriteFlags valores para otimizar o renderização e melhorar o desempenho:
SortTexture classifica imagens antes de desenho na tela para que a alternância de texturas pode ser mais rápido.
AlphaBlend processa fontes corretamente, especialmente para sprites que possuem áreas transparente ou translúcidas.
SortDepthBackToFront classifica sprites em ordem de frente para trás, que é útil se você tiver vários sprites translúcidos ou transparente para serem desenhados em cima do Outros.
DoNotSaveState melhora o desempenho para aplicativos que não é possível usar estados de render especificado.
DoNotModifyRenderState otimiza o desempenho usando o estado de processamento e pode ser usada para efeitos especiais.
ObjectSpace e Billboard ativam o desenho de imagens com diferentes efeitos especiais.
Consulte também
Conceitos
Tópicos "como" do .NET compact estrutura