ここの話はMDXの1.1が出来る人を対象としています。主に2.0での変更点を取り扱います。
2.0のDLLの中には不具合のあるものがあるらしいです。なるべく一番最新のものを利用するのがよいと思います。2006-4-11現在一番新しいSDKは「2006Feb」です。DLLは「v2.0.5727」を使ってください。古いものだと「FileNotFound」が出ることがあります。
なお、2.0がフル実装されているのか分からないため、出来ないことがある可能性があります。その点はご理解願います。
using System; using System.Drawing; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace Project1 { /// <summary> /// md3d2 の概要の説明です。 /// </summary> public class md3d2 : Form { public md3d2() : base() { //最小サイズを設定 this.MinimumSize = new Size(80, 60); this.ClientSize = new Size(300, 300); //ウィンドウの名前(かっこいいのを付けてあげてください) this.Text = "Direct3D-My"; } private Device device_; private PresentParameters presentParam_; /// <summary> /// Direct3Dの初期化を行います。 /// </summary> /// <returns>初期化が成功したかどうか</returns> public bool DXInitialize() { try { presentParam_ = new PresentParameters(); //名前が変わった presentParam_.IsWindowed = true; presentParam_.SwapEffect = SwapEffect.Discard; device_ = new Device(0, DeviceType.Hardware, this.Handle , CreateFlags.HardwareVertexProcessing, presentParam_); return true; } catch { return false; } } public void Render() { if (device_ == null) return; if (this.WindowState == FormWindowState.Minimized) return; device_.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0); device_.BeginScene(); device_.EndScene(); try { //更新 device_.Present(); } catch (DeviceLostException) { resetDevice(); } } /// <summary> /// デバイスのリセットを行う /// </summary> private void resetDevice() { ResultCode result; result = device_.CheckCooperativeLevelResult(); if (result == ResultCode.DeviceLost) { //ちょっと待つ System.Threading.Thread.Sleep(10); } else if (result == 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(); } } } } }
ここの時点での変更点は次にあげるものです。
プロパティの名前が変わりました。昔は「Windowed」でした。
コントロールを渡すところだったものがコントロールのハンドルを渡すように変わっています。第3引数です。
device_ = new Device(0, DeviceType.Hardware, this.Handle , CreateFlags.HardwareVertexProcessing, presentParam_);
ハンドルの説明はどこかよそに任せます。とりあえず渡してあげてください。
ResultCode result; result = device_.CheckCooperativeLevelResult(); if (result == ResultCode.DeviceLost) { //ちょっと待つ System.Threading.Thread.Sleep(10); } else if (result == ResultCode.DeviceNotReset) { device_.Reset(presentParam_); }
戻り値でのでの判定が出来るようになりました。前よりもすっきりとしています。
ここではまだ「ジェネリクス」は使用されていません。頂点バッファの所で使うことになるでしょう。とりあえずはこのような感じです。もしもエラーが出た場合はDLLのバージョンを確かめてみてください。それでも動かない場合は掲示板で対応しています。