今回は本当にTipsっぽくいくつかのことを取り上げてみましょう。
using System; using System.Drawing; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace Project2 { /// <summary> /// md3d2 の概要の説明です。 /// </summary> public class md3d2:Form { public md3d2():base() { //最小サイズを設定 this.MinimumSize=new Size(80,60); this.Size = new Size(300,300); this.Text ="Direct3D-My"; } private Device device_; private PresentParameters presentParam_; /// <summary> /// スプライトを行うためのもの /// </summary> private Sprite sprite_; /// <summary> /// Direct3Dの初期化を行います。 /// </summary> /// <returns>初期化が成功したかどうか</returns> public bool DXInitialize() { try { //プレゼンテーションパラメータを作成 presentParam_ = new PresentParameters(); //ウィンドウモード presentParam_.Windowed =true; //スワップエフェクトを設定。 presentParam_.SwapEffect = SwapEffect.Discard; //デバイスを作成 device_ = new Device(0,DeviceType.Hardware,this ,CreateFlags.HardwareVertexProcessing,presentParam_); createTexture(); sprite_ = new Sprite(device_); //初期化成功 return true; } catch { //初期化失敗 return false; } } /// <summary> /// テクスチャ /// </summary> private Texture spriteTexture_; /// <summary> /// /// </summary> private void createTexture() { string openTexture = @"I:\temp\Atbl.png"; //ここを書き換える。絶対パスの方が扱いやすいです。 spriteTexture_ = TextureLoader.FromFile(device_ ,openTexture); } public void Render() { if(device_==null)return; if(this.WindowState ==FormWindowState.Minimized)return; device_.Clear(ClearFlags.Target,Color.Blue,1.0f,0); device_.BeginScene(); //スプライト描画 sprite_.Begin(SpriteFlags.AlphaBlend); sprite_.Draw2D(spriteTexture_,new Rectangle(10,10,20,20) ,new SizeF(40,40),new PointF(5,5),1 ,new PointF(40,40),Color.White.ToArgb()); sprite_.Draw2D(spriteTexture_,new Rectangle(0,0,64,32) ,new SizeF(64,32),new PointF(40,200),Color.White); sprite_.Draw2D(spriteTexture_,new PointF(32,32) ,2,new PointF(200,40),Color.White); sprite_.Draw2D(spriteTexture_,new PointF(0,0),0 ,new PointF(200,200),Color.FromArgb(128,255,255,255)); sprite_.End(); device_.EndScene(); try { //更新 device_.Present(); } catch(DeviceLostException) { resetDevice(); } } /// <summary> /// デバイスのリセットを行う /// </summary> private void resetDevice() { int result; if(!device_.CheckCooperativeLevel(out result)) { if(result ==(int)ResultCode.DeviceLost) { //ちょっと待つ System.Threading.Thread.Sleep(10); } else if(result ==(int)ResultCode.DeviceNotReset) { device_.Reset(presentParam_); } } } } /// <summary> /// エントリクラス /// </summary> class Program { public static void Main() { using(md3d2 dxform =new md3d2()) { if(!dxform.DXInitialize()) { MessageBox.Show("Diret3Dの初期化に失敗しました。" ,"初期化の失敗"); return; } dxform.Show(); while(dxform.Created) { dxform.Render(); Application.DoEvents(); } } } } }
とりあえず、描画部分のソースコードだけを抜き出してみます。
//スプライト描画
sprite_.Begin(SpriteFlags.AlphaBlend);
sprite_.Draw2D(spriteTexture_,new Rectangle(10,10,20,20)
,new SizeF(40,40),new PointF(5,5),1
,new PointF(40,40),Color.White.ToArgb());
sprite_.Draw2D(spriteTexture_,new Rectangle(0,0,64,32)
,new SizeF(64,32),new PointF(40,200),Color.White);
sprite_.Draw2D(spriteTexture_,new PointF(32,32)
,2,new PointF(200,40),Color.White);
sprite_.Draw2D(spriteTexture_,new PointF(0,0),0
,new PointF(200,200),Color.FromArgb(128,255,255,255));
sprite_.End();
半透明を利用するためには「Sprite.Begin()」の引数にSpriteFlags.AlphaBlendを指定する必要があります。
それ以降は簡単です。色の指定でアルファ値を調整してあげれば、透明になります(4つ目のスプライトで行っています)。
回転のためには中心座標と、角度が必要です。このサンプルでは1番目と3番目で回転を行っています。どちらの呼び出しにも「centerまたはrotationCenter 」と「angleまたはrotationAngle」という引数があると思います。それぞれに値を入れてあげると回転します。ちなみに角度はアングルで指定するので間違わないように。
抜き出すためには「Rectangle」構造体を用います。ここにテクスチャ側の座標を指定します。大きさの方は「destinationSize」またはそれに類するもので制御できます(バージョンによって違いがあるかもしれません))。
サンプルの1番目を利用すると良いでしょう。