[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectX3D(Managed DirectX 2.0)>初期化(例外込み)

初期化(例外込み)

ここの話はMDXの1.1が出来る人を対象としています。主に2.0での変更点を取り扱います。

DLLのバージョン

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();
                }
            }
        }
    }
}

変更点

ここの時点での変更点は次にあげるものです。

「PresentParameters.IsWindowed」

プロパティの名前が変わりました。昔は「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のバージョンを確かめてみてください。それでも動かない場合は掲示板で対応しています。


ページの一番上へ
一覧に戻る 次のページへ

初版2006-3-11
[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectX3D(Managed DirectX 2.0)>初期化(例外込み)