こんにちは。
この記事では、ゲーム製作日誌 プログラム編 No.6「マウスの入力検知部分の実装」で考えたマウス判定処理のゲームライブラリへの組み込み方法を実現したソースコード例を紹介します。No.3で扱った、SharpDXの導入が前提になっています。
今回のプログラムは、No.4のサンプルプログラムの状態更新部分を少し書き換えただけです。
以上が、ライブラリ部分です。このライブラリは、ゲーム起動時に以下のコードで初期化します。MouseInterfaceクラスの実体を作成するのです。
その後、一定周期で以下のコードを呼び出します。ゲームでは通常、メインループという一定周期で処理をする仕組みを持っているため、その中に記述すればOKです。
実際にボタン押下状況を取得するときは、以下の関数呼び出しの返り値から判断します。左ボダンの判定を例に挙げます。
マウスカーソルの座標を取得するには、以下の関数呼び出しの引数郡から判断します。
この記事では、ゲーム製作日誌 プログラム編 No.6「マウスの入力検知部分の実装」で考えたマウス判定処理のゲームライブラリへの組み込み方法を実現したソースコード例を紹介します。No.3で扱った、SharpDXの導入が前提になっています。
今回のプログラムは、No.4のサンプルプログラムの状態更新部分を少し書き換えただけです。
/////////////////////////////////////////////////
//
// マウス入力判定機能クラス
//
// Author. ウマモサク
/////////////////////////////////////////////////
using SharpDX.DirectInput;
using System.Runtime.InteropServices;
class MouseInterface{
#region API連携
//GetCursorPosで現在座標を取得
[DllImport("user32.dll")]
private static extern void GetCursorPos(
ref tagPOINT lpPoint
);
//現在座標が入る構造体
public struct tagPOINT
{
public UInt32 x;
public UInt32 y;
}
#endregion
//シングルトン
private static MouseInterface instance;
public static MouseInterface Instance
{
get
{
return instance;
}
}
private static bool initialized=false;
public static void Initialize()
{
if (initialized)
return;
initialized = true;
instance = new MouseInterface();
}
public static void Dispose()
{
if (initialized)
{
instance.DisposeDevice();
instance = null;
initialized = false;
}
}
protected MouseInterface()
{
this.InitializeDevice();
}
private DirectInput directInput;
private Mouse device;
private MouseState buttonState;
private tagPOINT cursorState;
//描画フォーム
private System.Windows.Forms.Form screenForm;
public void SetScreenForm(System.Windows.Forms.Form form)
{
screenForm = form;
}
public void InitializeDevice()
{
directInput = new DirectInput();
//マウスが存在しない場合への対処
Guid keyboardGuid = Guid.Empty;
foreach (var g in directInput.GetDevices(DeviceType.Mouse, DeviceEnumerationFlags.AllDevices))
{
keyboardGuid = g.InstanceGuid;
}
if (keyboardGuid == Guid.Empty)
{
throw new Exception("マウスが見つかりません");
}
//デバイスを生成してマウス状態の取得を開始
device = new Mouse(directInput);
device.Acquire();
buttonState = device.GetCurrentState();
}
public void DisposeDevice()
{
device.Dispose();
directInput.Dispose();
}
public void Update()
{
buttonState = device.GetCurrentState();
cursorState = new tagPOINT();
GetCursorPos(ref cursorState);
//カーソル位置をフォーム座標に変換する
if (screenForm != null)
{
System.Drawing.Point p = new System.Drawing.Point((int)cursorState.x,(int)cursorState.y);
p = screenForm.PointToClient(p);
cursorState.x = (uint)p.X; cursorState.y = (uint)p.Y;
}
}
public bool IsPressed(int button)
{
return buttonState.Buttons[button];
}
public void GetCursor(out int x, out int y)
{
x = (int)cursorState.x;
y = (int)cursorState.y;
}
}
以上が、ライブラリ部分です。このライブラリは、ゲーム起動時に以下のコードで初期化します。MouseInterfaceクラスの実体を作成するのです。
MouseInterface.Initialize();
その後、一定周期で以下のコードを呼び出します。ゲームでは通常、メインループという一定周期で処理をする仕組みを持っているため、その中に記述すればOKです。
MouseInterface.Update();
実際にボタン押下状況を取得するときは、以下の関数呼び出しの返り値から判断します。左ボダンの判定を例に挙げます。
MouseInterface.IsPressed(0)
マウスカーソルの座標を取得するには、以下の関数呼び出しの引数郡から判断します。
ゲーム終了時には、作成した実体を消去してデバイスを開放する必要があります。
int cursorX,cursorY;
MouseInterface.GetCursor(out cursorX,out cursorY);