トップ回答者
using Microsoft.DirectXの参照がうまくいかない

質問
-
こんばんは、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の参照のようなものではないのでしょうか?
あまりその事は詳しくないので・・・・・・
この対処方法のご教授をお願いします。
回答
-
using Microsoft.DirectX;とした場合、Microsoft.DirectX名前空間に含まれるクラス、構造体は名前空間を省略できますが、Microsoft.DirectX.Direct3D名前空間の全部あるいは一部を省略することはできません。
途中までは同じであっても別の名前空間であるため、このような使い方はできません。
(上の場合のDirect3D.DeviceとはMicrosoft.DirectX.Direct3D名前空間のDeviceを意味するのではなく、Direct3D名前空間のDeviceを意味するので、見つからないとエラーになります)
Microsoft.DirectX.Direct3DをusingするとDeviceという型が重複する問題がありますので、エイリアスを使ってみてください。
Code Snippetusing Direct3D = Microsoft.DirectX.Direct3D;
// 省略
private Direct3D.Device d3d_device; // Direct3Dデバイス
すべての返信
-
using Microsoft.DirectX;とした場合、Microsoft.DirectX名前空間に含まれるクラス、構造体は名前空間を省略できますが、Microsoft.DirectX.Direct3D名前空間の全部あるいは一部を省略することはできません。
途中までは同じであっても別の名前空間であるため、このような使い方はできません。
(上の場合のDirect3D.DeviceとはMicrosoft.DirectX.Direct3D名前空間のDeviceを意味するのではなく、Direct3D名前空間のDeviceを意味するので、見つからないとエラーになります)
Microsoft.DirectX.Direct3DをusingするとDeviceという型が重複する問題がありますので、エイリアスを使ってみてください。
Code Snippetusing Direct3D = Microsoft.DirectX.Direct3D;
// 省略
private Direct3D.Device d3d_device; // Direct3Dデバイス
-
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ディレクティブのもうひとつの使い方を知りました。
どうも、本当にありがとうございました。
また何かあったらよろしくお願いします。