DirectInput を使用するための基本設定

Page creation date :

The page you are currently viewing does not support the selected display language.

この Tips では「Microsoft Visual Studio 2005 Standard Edition」を使用して説明しますが、Visual Studio 2005 で C# が使えれば基本的に他の種類でも設定はほとんど同じです。

とりあえずここからの説明は、「Visual Studio 2005 の使い方をある程度覚えた」「C# 言語をある程度理解している」「フォームのプロパティ設定、イベントの追加の仕方が分かる」ことを前程に説明していきます。

また、必要なコンポーネント(Visual StudioDirectX SDK)などはひととおりインストールしていることとします。


最初にプロジェクトを「Windows アプリケーション」で新規に作成します。フォーム名は「Form1」から「MainForm」へと変更しておきます。

Visual Studio 2005 で DirectX 関連のプログラミングを行うには、「参照設定」に DirectX コンポーネントを追加しなくてはなりません。

DirectInput」を使用するのですから、DirectInput 関連のクラスを使用することになります。しかし、今の状態だとコードを記述してもビルド時にクラスを認識してくれません。まずはじめにクラスを「参照」できる状態にします。  ソリューションエクスプローラの「参照設定」を右クリックして「参照の追加」を選択します。

参照の追加

しばらくしてダイアログが表示されたら、「.NET」タブを選択して、以下の項目を選択します。

  • Microsoft.DirectX
  • Microsoft.DirectX.DirectInput

参照の追加ダイアログ

「OK」ボタンを押すと「参照設定」に追加されたことがわかります。

追加後


次に、DirectInput を使用した時の状態を表示するために、フォームに「ラベル」を配置しましょう。あまり複雑にコントロールを配置すると大変なので、今回はこれでいいです。  ラベルはフォームの左上あたりにでも配置してください。

メインフォーム

このラベルを外部のクラスから扱えるようにするために、ラベルのプロパティを追加します。アクセス権限を直接変える方法もありますが、どちらでもかまいません。(一般的にはプロパティを介したほうがいいと言われている)

MainForm.cs

>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MDXSample
{
    /// <summary>
    /// メインフォーム
    /// </summary>
    public partial class MainForm : Form
    {
        /// <summary>
        /// ラベル
        /// </summary>
        public Label InputLabel
        {
            get { return this.label1; }
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public MainForm()
        {
            InitializeComponent();
        }
    }
}

ではメインクラスのコード編集に移りますが、今回作成するコードはあくまでもサンプルとして説明しやすくなるように書き換えたものです。実際にソフト制作するときは、そのソフトにあわせたコードを書くようにして下さい。今回書くコードはどのソフトでも使用できるテンプレートではありません。


まずクラスをひとつ作成しましょう。基本的にサンプルはこのクラスにコードを書くようにします。プロジェクトを右クリックし、クラスを追加します。

クラス作成

下のようなダイアログが表示されますので、ファイル名を「MainSample.cs」としておきます。この名前がそのままクラス名となります。もちろん分かる人は自由に名前を付けてもらって結構です。

クラス作成

.cs」ファイルが作成され、画面に表示されました。

クラス作成


では、MainSample.cs のコードファイルを書き換えます。下のコードを参考にしてください。

「///」と記述してある部分はコメントです。ただ、「//」と違い「XML」というものが関係していますが、深く考えずにコメントだと思ってもらってかまいません。詳しく知りたい人は調べてみてください。

MainSample.cs

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectInput;

namespace MDXSample
{
    /// <summary>
    /// メインサンプルクラス
    /// </summary>
    public class MainSample : IDisposable
    {
        /// <summary>
        /// メインフォーム
        /// </summary>
        private MainForm _form = null;


        /// <summary>
        /// アプリケーションの初期化
        /// </summary>
        /// <param name="topLevelForm">トップレベルウインドウ</param>
        /// <returns>全ての初期化がOKなら true, ひとつでも失敗したら false を返すようにする</returns>
        /// <remarks>
        /// false を返した場合は、自動的にアプリケーションが終了するようになっている
        /// </remarks>
        public bool InitializeApplication(MainForm topLevelForm)
        {
            // フォームの参照を保持
            this._form = topLevelForm;

            return true;
        }

        /// <summary>
        /// メインループ処理
        /// </summary>
        public void MainLoop()
        {
        }

        /// <summary>
        /// リソースの破棄をするために呼ばれる
        /// </summary>
        public void Dispose()
        {
        }
    }
}

InitializeApplication メソッドは、DirectInput 関連のデータなどを初期化するためのメソッドです。フォームが表示される前に1度だけ呼ばれます。初期化、作成に失敗した場合は false を返すようにすると、アプリケーションがそのまま終了するようになります。メインフォームは「MainLoop」メソッドで使用するので、フィールドとして持つようにします。

MainLoop メソッドは、入力デバイスの状態を常に受け取るために使用されます。このメソッドは Program クラスで毎回呼ばれるようにします。

Dispose メソッドは、DirectInput 関連の作成したリソースなどを解放するためのメソッドです。フォームが閉じた後に1度だけ呼ばれます。このメソッドは「IDisposable インターフェース」を継承しているので、Program クラスで必ず呼ばれるように設定しています。

念のためビルドしてみて、エラーがなければ次のセクションに進んでください。エラーがあると下のようにエラー内容が出るので、そこを修正してください。

エラー 初心者は意外と「;(セミコロン)」を忘れやすい


次に Program.cs ファイルのコードを書き換えます。このように書き換えておけば、今後このファイルは DirectInput の Tips でほとんど書き換えることはありません。説明は各行のコメントを見てください。

Program.cs

using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows.Forms;

namespace MDXSample
{
    /// <summary>
    /// アプリケーション開始クラス
    /// </summary>
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            // コントロール等を Windows XP のスタイルにします。
            // はずしてもかまいません。
            Application.EnableVisualStyles();

            // GDI+ を使用してコントロールのテキストを描画します。
            // はずしてもかまいません。
            Application.SetCompatibleTextRenderingDefault(false);

            // フォームとメインサンプルクラスを作成
            // using() で作成されたリソースは {} を外れると自動的に解放される
            // ここでは frm と sample が対象
            using (MainForm frm = new MainForm())
            using (MainSample sample = new MainSample())
            {
                // アプリケーションの初期化
                if (sample.InitializeApplication(frm))
                {
                    // メインフォームを表示
                    frm.Show();

                    // フォームが作成されている間はループし続ける
                    while (frm.Created)
                    {
                        // メインループ処理を行う
                        sample.MainLoop();

                        // CPUがフル稼働しないようにちょっとだけ制限をかける。
                        // パフォーマンスを最大限にあげるなら「0」を指定、
                        // または「Thread.Sleep」をはずす。
                        Thread.Sleep(1);

                        // イベントがある場合はその処理する
                        Application.DoEvents();
                    }
                }
                else
                {
                    // 初期化に失敗
                }
            }
        }
    }
}

ビルド実行で何も問題なければ、この Tips は終了です。DirectX らしい処理は何もしていませんが、これらの設定は以降の Tips の基本として使いますので、覚えておいてください。ちなみに実行すると下のようになります。

実行