ゲームでマウスクリックとマウスダウンを識別するにはどうすればよいですか?


8

ゲームでマウスクリックを処理する最も一般的な方法は何ですか?

マウスからの入力を検出する方法は、ボタンが上か下かだけであると仮定します。

私は現在、マウスのクリックがクリックであることに依存していますが、この単純なアプローチでは、達成したいことが大きく制限されます。たとえば、マウスクリックで1回だけ実行する必要があるコードがありますが、マウスクリックとしてマウスダウンを使用すると、ボタンを押している時間に応じて、コードが複数回実行される可能性があります。だから、私はそれをワンクリックで行う必要があります!

しかし、クリックを処理する最良の方法は何ですか?マウスが上から下、または下から上に移動したときのクリックか、ボタンがxフレーム/ミリ秒未満の時間でクリックされた場合のクリックであり、そうである場合は、マウスがダウンしたと見なされ、クリックされた場合のクリックxフレーム/ミリ秒またはクリックしてからマウスダウン

それぞれのアプローチに用途があることがわかりますが、ゲームで最も一般的なのはどれですか。そして多分私はRTSゲームで最も一般的であるものをより具体的に尋ねますか?


1
あなたは正しい軌道に乗っています。マウスダウンとマウスアップの両方が互いに(またはクリックされたオブジェクトの境界内に)ある必要があり、それがわかっていることについて、何かを追加します。ボタンをクリックしてからドラッグしてボタンを離すのは、マウスのクリックではありません。ただし、ボタンをクリックしてボタンの任意の場所に移動するのはマウスクリックです。
Tim Holt、

回答:


12

マウスが下から上に移行するタイミングを把握し、そのためのハンドラーを作成して、正しい方向に進んでいます。多くのゲームでは、mouseUpイベントをクリックとして扱うのに十分です。

ゲームによっては、両方のイベントを処理する必要がある場合があります。たとえば、RTSでは、ドラッグボックス選択だけでなくシングルクリック選択も組み込む必要があります。違いは、リリースされる前にマウスがダウン状態であった時間を決定することです。

(はい、あなたは基本的にあなた自身の質問に答えました)


2
他のコメンターが指摘したように、シングルクリックで作業しているときに、同じターゲットがmouseDownとmouseUpでポイントされていることを確認することもできます。
ビル

私はちょっと確信が持てません。たとえば、Windowsボタンは、ボタンがマウスアップイベントを受け取る限り、マウスがマウスダウンされた場所を気にしません。多分他のオペレーティングシステムはもっと気にかけます。
ジョンマクドナルド

@John McDこれは、「ユーザーが実際にクリックするつもりだったものを把握する」という要件ではなく、技術的な要件です。
ビル

1
@ジョンMcD。それは真実ではない。デスクトップのどこかでマウスボタンを押し、カーソルをスタートメニューに移動して放します。スタートメニューがポップアップしますか?それは私にはありません。
カイロタン2011

@Kylotan、正解ですが、スタートメニューの「ボタン」の動作は、他のすべての標準ボタンとは異なります。ウィンドウの標準ボタンのように見えますが、実際にはマウスダウンイベントとマウスアップイベントの両方が必要ですが、マウスはボタンの境界の外に移動できます。最小化、最大化、閉じるはすべてこのように機能し、アプリケーション内の通常のボタンも同様です。ただし、マウスボタンを離すまでアクションは発生しないことに注意してください(スタートボタンを除く)。私のような人が気付くでしょう。とにかく...ビルは正しいです、それは要件に帰着します。
ジョンマクドナルド

4

「ベスト」というものはありません。それらすべてが必要です。

銃を発砲している場合、マウスが放されて武器の発砲エフェクトがトリガーされるのを待ちたくありません。また、ユニットの束の周りにボックスをドラッグしている場合は、マウスダウンでドラッグアクションを開始します。

一方、GUIアイテムをクリックしている場合は、慣れているため、フルクリックを待ちます。

したがって、おそらくマウスダウン、マウスアップ、マウスドラッグ(マウスダウンと大幅に異なる場所でのマウスアップ)、およびマウスクリック(マウスダウンと同じ場所でのマウスアップ)を実装し、ゲームの一部にそれらをフックする必要があります。あなたは合うと思います。


1

ほとんどのウィンドウシステムがそれを処理する方法、および私が取り組んだ(そして自分で部分的に実装する必要があった)ゲームは、マウスが所定のボタンの上でマウスダウン状態になったかどうかを検出する各ボタンにビットを置くことです。マウスが下がるフレームのみが設定され、マウスボタンが離されたときにのみクリアされます。マウスがボタン上でリリースされ、ビットが設定されている場合に限り、ボタンクリックイベントを発生させます。

(おそらく、ビットが設定され、マウスがボタンの上に置かれているときにtrueに設定されるフラグが必要になるため、ボタンを変更して、通常のテクスチャではなく、押されたテクスチャを使用できます。)

これは、ほとんどのボタンの背後にある基本的なスキームです。先に進み、ダイアログプロンプトを見つけます。キャンセルボタンを押しますが、離さないでください。マウスがボタンの上にある間、ボタンは押し下げられ、マウスがボタンの上に移動しなくなると通常に戻りますが、ボタンの上に戻るとボタンは押した状態に戻ります。手放し、それを超えた場合にのみ、アクションが実行されます。ミリ秒カウントは使用しないでください。これは主に、しきい値内のダブルクリックを検出するためだけのものです。

(そして、本当に気になりたい場合は、それらの遷移のそれぞれにフックできるイベントを用意してください。たとえば、EnterとExitでのMouseOver、MouseDownのEnter / Exit、MouseUpのEnter / Exit、MouseClickedのEnter / Exitなど。 )


1

マウスボタンとキーボードのキーには、さまざまなイベントがあります。使用できるものは、言語/ライブラリの選択によって異なりますが、最も一般的です。

キーダウン、ボタンが押されたときにトリガーされます。
キーアップ、ボタンが離されたときにトリガーされます。
キーを押し下げるのを遅らせ、ボタンが押されたときにトリガーし、キーが離されるまで、システムに依存する間隔で繰り返し起動します。

これに加えて、キーが現在押されているかどうかを通知する呼び出しがある場合もあります。

使用しているツールを正確に認識することが重要です。最も一般的には、最初に2つのツールが必要になります。使用できない場合は、使用可能なものからビルドします。

マウスを使用して画面上のボタンが押されたことを登録する標準的な方法は、同じボタンがダウンイベントとアップイベントの両方でポイントされたことをアサートすることです。ただし、多くのゲーム要素ではこれが遅すぎる可能性があるため、多くのアクションでは、ダウンイベントで発生させるのが賢明です。


0

XOrはこの状況であなたの友達になることができます。

bool oldIsButtonUp = true;

void pollMouse(bool isButtonUp) {
    if ((oldIsButtonUp ^ isButtonUp) && isButtonUp) {
        sendMouseClickEvent();
    }
    oldIsButtonUp = isButtonUp;
}

これにより、マウスボタンの状態がfalseからtrueに変わるたびにsendMouseClickEvent()が呼び出されます。


4
または、そのプログラマは、彼(?彼女の)頭の中でtruthtableを作る作らないように:if (!oldIsButtonUp && isButtonUp) {
減速

-1

このコードの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 begins if the button 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); 
} 

これとは別に、MouseClickではなく、MouseUpのコードです-Updateはどのくらいの頻度で実行されますか?クリックがゲームのタイムティックより短い場合はどうなりますか?
Kromster 2012年

ゲームによって異なりますが、XNAではデフォルトで約60 fpsの更新が行われます。この時間枠でマウスボタンを押して離すのは非常に困難です。
Ken

実際には、マウスダウンイベントを検出するコードです。
Ken

この抽象的なXNAコードサンプルで実際の質問に対する実際の回答が
見当たらない

修正してくれてありがとう、私は小さなテストを行ったところ、クリックは確かにたまたま16〜100ミリ秒かかりました。それでも、特に入力をキューイングしない場合、タイムステップの更新ループで入力を処理することは60fps未満になる可能性があることはお勧めしません。
Kromster 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.