XNAでマウス入力を処理する方法は?


13

XNAでカードゲームを開発しています。

OnClickXNAにオブジェクトのイベントはありますか?

プレイヤーがカードをクリックしたときにカードを動かそうとしています。このプロジェクトには、カードを描画するSpriteクラスがありますが、OnClickイベントなどを使用する方法がわからないため、少し立ち往生しています。

回答:


12

一般にXNAを使用する場合、イベント駆動型のコードパラダイムからループ駆動型のコードパラダイムに移行する必要があります。更新コードは毎秒60回ループします。そのため、毎回マウスの状態を見て、ボタンが下にあり、ポインターが四角形内にある場合、通常はOnClickイベントに配置するコードに分岐します。


2
それは意味的に正しいかもしれませんが、私の意見では間違っているようです。スレッドと各ループ中の現在の状態を調べることになっても、イベントはありません。これが、独自のイベントを作成し、対応するハンドラーを作成する理由です。大きなプロジェクトでは、フロー制御を使用してマウスダウンのすべてのインスタンスに分岐するのはおかしいと思います。代わりに、イベントを登録し、必要な場所にハンドラーを作成します。このため、そもそもイベントが考えられました。
ブランドン

5
ブランドン:「マウスダウンのすべてのインスタンスに分岐するためにフロー制御を使用する」ことはありません。各フレームの最初に現在と以前のマウスの状態を1回記録し、次にコードがマウスダウンプレスに応答するすべての場所で、単に行うだけですif(MouseLeftPress()){ DoSomething(); }。ここでMouseLeftPress()、現在と以前の左ボタンのマウスの状態を比較するために記述するメソッドがあります。ほとんどの場合、これはイベントを実装するよりも簡単です。
-Olhovsky

4
単純なポーリングは、基本的なアーケードコントロールをはるかに超えてugいものになります。ゲームパッドの状態をFlagAttributesとしてキャプチャし、デリゲートをさまざまなボタンの組み合わせにマップできる入力マネージャークラスがあります。次のステップアップは、タイミングの実装です。この議論はすべてスティーブHの主張を補強するものであり、ポーリングシステムを提供しているので、それを基に自由に構築して、好みのパラダイムをサポートできます。
michael.bartnett


6

XNAが提供するのは、独自の入力クラスを構築するのに十分なだけです。提供するユーティリティを考慮して、そうする必要があります。

このブログ投稿ソースコード)で説明されているマウス入力クラスをお勧めします。ボタンが押されている、保持されている、または放されていることを検出し、ポーリングまたはイベントを介してその情報を取得できます。

関連するメモでは、同じブログ投稿でもキーボードとゲームパッドの入力デバイスクラスが提供されています。


3

XNAでマウスクリックをチェックする実際のコードは、このようなものです。

    MouseState previousMouseState;
    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        //store the current state of the mouse
        previousMouseState = Mouse.GetState();
    }


    protected override void Update(GameTime gameTime)
    {
        // .. other update code


        //is there a mouse click?
        //A mouse click occurs if the goes from a released state
        //in the previous frame  to a pressed state 
        //in the current frame
        if (previousMouseState.LeftButton == ButtonState.Released 
            && Mouse.GetState().LeftButton == ButtonState.Pressed)
        {
            //do your mouse click response...

        }

        //save the current mouse state for the next frame
        // the current 
        previousMouseState = Mouse.GetState();

        base.Update(gameTime);
    }

2

ゲームが3Dの場合、ピッキングを実装できます。これについては、http//create.msdn.com/en-US/education/catalog/sample/picking_triangleで説明されています。基本的に、これはカメラからマウスがクリックする場所にレイを作成し(そこに小さなマトリックスが投影されていない)、オブジェクトのいずれかがレイと交差しているかどうかを確認します。

ゲームが2Dの場合、ウィンドウ座標をゲーム座標にかなり簡単に変換できるはずです。次に、選択した座標がオブジェクトの境界内にあるかどうかを確認します。


1

マウスがクリックされたかどうかを確認する最も簡単な方法はこれです

//Create this variable
MouseState mouseState;

更新メソッドでこれを追加します

mouseState = Mouse.GetState();

if (mouse.RightButton == ButtonState.Pressed)
{
     //Do Stuff
}

これが助けたことを願っています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.