方法 : スプライトを使用する
更新 : 2007 年 11 月
イメージやテキストを画面に描画するときに、スプライトを使用できます。この例では、描画とレンダリングのデモを示します。
このコード例のフォームには、次のオブジェクトがあります。
このコード例では、スプライトを作成するために、ファイルからテクスチャを読み込みます。デバイスまたはエミュレータに配置される小さなビットマップをプロジェクトに含める必要があります。
フォームのコンストラクタでは、デバイスの PresentationParameters プロパティの設定を指定し、Device オブジェクトを作成し、デバイスの Reset メソッドを呼び出します。また、Font オブジェクトを構築します。
次の表は、スプライトをレンダリングするサンプル メソッドの説明です。
メモ : |
---|
マネージ Direct3D モバイル アプリケーションでは、Windows Mobile Version 5.0 Software for Pocket PC と Windows Mobile Version 5.0 Software for Smartphone が必要です。Windows Mobile ソフトウェアおよび SDK については、「.NET Compact Framework の外部資料」を参照してください。 |
メソッド |
アクション |
---|---|
OnDeviceReset |
|
OnPaint |
|
使用例
完全なフォームを次のコード例に示します。指定されたビットマップを使用して、スプライトを描画します。
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());
}
}
コードのコンパイル方法
この例では、次の名前空間への参照が必要です。
N:Microsoft.WindowsMobile.DirectX
N:Microsoft.WindowsMobile.DirectX.Direct3D
N:System.Drawing
堅牢性の高いプログラム
デバイスのリセット時に作成し直す必要がないように、フォームのコンストラクタでスプライトとフォントを作成します。
パフォーマンスを高める場合は、スプライトを使用してテキストを描画します。そうでない場合は、DrawText の呼び出しごとに、フォント オブジェクトでスプライトの Begin メソッドおよび End メソッドが内部的に実行されます。
可能であれば、フレームごとに 1 つのスプライトを使用するときに、スプライトの Begin メソッドおよび End メソッドの 1 回の呼び出しの中でスプライトを入れ子にしてください。
レンダリングを最適化し、パフォーマンスを向上させるために、次のように SpriteFlags 値を指定します。
SortTexture は、テクスチャの切り替えを高速にするために、画面に描画する前にイメージを並べ替えます。
AlphaBlend は、特に透明や半透明の領域があるスプライトの場合に、フォントを適切にレンダリングします。
SortDepthBackToFront は、スプライトを前から後ろへと並べ替えます。これは、透明や半透明の複数のスプライトを重ねて描画する場合に便利です。
DoNotSaveState は、指定されたレンダリング状態を使用できないアプリケーションで、パフォーマンスを向上させます。
DoNotModifyRenderState は、現在のレンダリング状態を使用してパフォーマンスを最適化します。特殊効果に使用できます。
ObjectSpace および Billboard は、さまざまな特殊効果でイメージを描画できます。
参照
概念
.NET Compact Framework に関する「方法」トピック