none
using Microsoft.DirectXの参照がうまくいかない RRS feed

  • 質問

  • こんばんは、UDONです。

    今回質問する内容は、using Microsoft.DirectXの参照がうまくいかないことです。

     

    以下のソースコードをご覧ください

     

    //////////////////////////////
    // 以下の名前空間を利用する
    using System.Windows.Forms;
    using System.Drawing;

     

    //////////////////////////////////////////////

    // メインクラス(フォームを継承する)
    public class MainClass : Form
    {
     //////////////////////////////////////////////////////////////////
     // 静的メイン関数(MainClassのインスタンスを生成してあとはお任せ)
     static void Main() { Application.Run(new MainClass()); }
     //////////////////////////////////////////////////////////////////

     

     //////////////////
     // 変数宣言
     private Microsoft.DirectX.Direct3D.Device d3d_device; // Direct3Dデバイス
     private Microsoft.DirectX.DirectInput.Device di_device; // DirectInputデバイス

     

     //////////////////////////////////////////////////////////////////
     // MainClassコンストラクタ(色んな意味で最初の初期化はここから)
     private MainClass()
     {
      // ウィンドウサイズとスタイルを設定
      this.MaximizeBox = false;
      this.FormBorderStyle = FormBorderStyle.FixedSingle;
      this.ClientSize = new Size(800, 600);
      this.StartPosition = FormStartPosition.CenterScreen;

      // DirectXの初期化をする

     }
    }

     

    見ての通り、変数宣言のところで変数の型を宣言するときに Microsoft.Dire.......

    のように長くなっています。

    この場合は using Microsoft.DirectX;

    のように参照したいのですが、どうもうまくいかずエラー内容は以下のようになります。

    "型または名前空間名 'Direct3D' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
    "

    のように怒られます。

     

    しかし、dllの参照もしていますしusingしていないときは正常に動作します。

    アセンブリ参照というのはdllの参照のようなものではないのでしょうか?

     

    あまりその事は詳しくないので・・・・・・

     

    この対処方法のご教授をお願いします。

    2008年1月22日 16:49

回答

  • using Microsoft.DirectX;とした場合、Microsoft.DirectX名前空間に含まれるクラス、構造体は名前空間を省略できますが、Microsoft.DirectX.Direct3D名前空間の全部あるいは一部を省略することはできません。

    途中までは同じであっても別の名前空間であるため、このような使い方はできません。

    (上の場合のDirect3D.DeviceとはMicrosoft.DirectX.Direct3D名前空間のDeviceを意味するのではなく、Direct3D名前空間のDeviceを意味するので、見つからないとエラーになります)

     

    Microsoft.DirectX.Direct3DをusingするとDeviceという型が重複する問題がありますので、エイリアスを使ってみてください。

     

    Code Snippet

    using Direct3D = Microsoft.DirectX.Direct3D;

    // 省略

    private Direct3D.Device d3d_device; // Direct3Dデバイス

     

     

    2008年1月22日 22:51
    モデレータ

すべての返信

  • using Microsoft.DirectX;とした場合、Microsoft.DirectX名前空間に含まれるクラス、構造体は名前空間を省略できますが、Microsoft.DirectX.Direct3D名前空間の全部あるいは一部を省略することはできません。

    途中までは同じであっても別の名前空間であるため、このような使い方はできません。

    (上の場合のDirect3D.DeviceとはMicrosoft.DirectX.Direct3D名前空間のDeviceを意味するのではなく、Direct3D名前空間のDeviceを意味するので、見つからないとエラーになります)

     

    Microsoft.DirectX.Direct3DをusingするとDeviceという型が重複する問題がありますので、エイリアスを使ってみてください。

     

    Code Snippet

    using Direct3D = Microsoft.DirectX.Direct3D;

    // 省略

    private Direct3D.Device d3d_device; // Direct3Dデバイス

     

     

    2008年1月22日 22:51
    モデレータ
  • Azuleanさんどうも解決法と返答をして頂きありがとうございます。

    無事問題の解決ができました。

     

    解決後のソースコードは以下のようになりました。

     

    //////////////////////////////
    // 以下の名前空間を利用する
    using System.Windows.Forms;
    using System.Drawing;
    using Direct3D = Microsoft.DirectX.Direct3D;
    using DirectInput = Microsoft.DirectX.DirectInput;

     

    ////////////////////////////
    // イメージバッファ構造体
    public struct ImageBuffer
    {
     int x;
     int y;
     int width;
     int height;
     Direct3D.Sprite sprite;
     Direct3D.Texture textur;
    }

     

    //////////////////////////////////////////////
    // メインクラス(フォームを継承する)
    public class MainClass : Form
    {

     ///////////////////////
     // 静的メイン関数
     static void Main()
     {
      // メインクラスのインスタンスを生成してゴリゴリやる
      MainClass mc = new MainClass();
      if (mc.d3d_device == null) return;
      mc.Show();

     

      ////////////////////////////////////////////////////////////////////////////
      // ウィンドウが表示されている間無限ループ(事実上ここがゲームのメインループ)
      while (mc.Visible)
      {
       // デバイスメモリをクリアしてシーンを開始して描画
       mc.d3d_device.Clear(Direct3D.ClearFlags.Target, Color.Black, 0, 0);
       mc.d3d_device.BeginScene();
       mc.d3d_device.EndScene();
       mc.d3d_device.Present();

       // Windowsメッセージを処理する
       Application.DoEvents();
      }

     }

     

     ///////////////////
     // 定数宣言
     private const int k_MaxImageCount = 10;

     

     //////////////////
     // 変数宣言
     private Direct3D.Device d3d_device;   // Direct3Dデバイス
     private DirectInput.Device di_device;   // DirectInputデバイス
     private ImageBuffer[] image = new ImageBuffer[k_MaxImageCount]; // イメージバッファ

     

     //////////////////////////////////////////////////////////////////
     // MainClassコンストラクタ(色んな意味で最初の初期化はここから)
     private MainClass()
     {
      // ゲームに適したウィンドウサイズとスタイルを設定
      base.MaximizeBox  = false;
      base.FormBorderStyle = FormBorderStyle.FixedSingle;
      base.ClientSize   = new Size(800, 600);
      base.StartPosition  = FormStartPosition.CenterScreen;

      // DirectXの初期化のためにプレゼントパラメータを設定
      Direct3D.PresentParameters pp = new Direct3D.PresentParameters();
      pp.EnableAutoDepthStencil = true;
      pp.AutoDepthStencilFormat = Direct3D.DepthFormat.D16;
      pp.BackBufferCount   = 3;
      pp.BackBufferFormat   = Direct3D.Manager.Adapters[0].CurrentDisplayMode.Format;
      pp.BackBufferHeight   = base.ClientSize.Height;
      pp.BackBufferWidth   = base.ClientSize.Width;
      pp.PresentationInterval  = Direct3D.PresentInterval.Immediate;
      pp.SwapEffect    = Direct3D.SwapEffect.Discard;
      pp.Windowed     = true;

      // DirectXの初期化をする(出来るだけ最速の)
      try
      {// まずはハードウェア処理ができる状態で初期化
       d3d_device = new Direct3D.Device(0, Direct3D.DeviceType.Hardware,
        this, Direct3D.CreateFlags.HardwareVertexProcessing, pp);
      }
      catch
      {
       try
       {// だめならリファレンスモードで初期化
        d3d_device = new Direct3D.Device(0, Direct3D.DeviceType.Reference,
         this, Direct3D.CreateFlags.HardwareVertexProcessing, pp);
       }
       catch
       {
        try
        {// さらにだめならソフトウェアモードで初期化
         d3d_device = new Direct3D.Device(0, Direct3D.DeviceType.Software,
          this, Direct3D.CreateFlags.HardwareVertexProcessing, pp);
        }
        catch
        {// これでもダメなら諦める
         MessageBox.Show("Direct3Dの初期化が出来ませんでした", "初期化に失敗", MessageBoxButtons.OK, MessageBoxIcon.Error);
         return;
        }
       }
      }

      // DirectInputのインスタンスを生成して権利を取得する(キーボード)
      di_device = new DirectInput.Device(DirectInput.SystemGuid.Keyboard);
      di_device.Acquire();
     }
    }

     

    usingディレクティブのもうひとつの使い方を知りました。

     

    どうも、本当にありがとうございました。

    また何かあったらよろしくお願いします。

    2008年1月23日 14:28