スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

カテゴリ : スポンサー広告

System.getKeyStateの隠れ機能メモ

System.getKeyStateにはリファレンスで省略されている第二引数があります。

System.getKeyState(code, getcurrent=true)
code:状態を取得する仮想キーコード
getcurrent:現在の状態を取得するか

第二引数を省略するか、trueのときはSystem.getKeyStateを呼び出した瞬間にキーが押されていればtrue、押されていなければfalseが返ります。
第二引数をfalseにすると、前回同じキーコードでSystem.getKeyStateを呼び出したときから、今回の呼び出しまでの間に1度でもキーが押されていればtrueになります。


そんなに使うことはないと思っていたのですがContinuouseHandlerでキー取得するには必須でした。
class KeyPolling
{
  function KeyPolling()
  {
    System.addContinuousHandler(onContinuousHandler);
  }
  
  function finalize()
  {
    System.removeContinuousHandler(onContinuousHandler);
  }
  
  function onContinuousHandler(tick)
  {
    if (System.getKeyState(VK_MEDIA_STOP)) {
      Debug.message("停止");
    } else if (System.getKeyState(VK_MEDIA_PLAY_PAUSE)) {
      Debug.message("再開/一時停止");
    } else if (System.getKeyState(VK_MEDIA_NEXT_TRACK)) {
      Debug.message("次のトラックへ");
    } else if (System.getKeyState(VK_MEDIA_PREV_TRACK)) {
      Debug.message("前のトラックへ");
    }
  }
}

var keyPollingObject = new KeyPolling();
マルチメディアキーに対応するメモの続きになりますが、マルチメディアキーはウィンドウがアクティブでなくても反応して欲しいのでWindow.onKeyDownやLayer.onKeyDownは使えません。
Timerを使ってSystem.getKeyStateでも構いませんがここではContinuousHandlerを使っています。

この場合、onContinuousHandlerが呼ばれる合間にだけ一瞬キーを押して離すとメッセージが出力されません。
60fpsだとすれば16ミリ秒程度の短い合間なのですが、実際やってみるとたまにキー入力を無視されていらっとします。
低スペックPCだったり、コマンドライン引数でfps制限をかけたりするとさらに合間が長くなってまずいです。

逆にキーが押しっぱなしになっている場合、押している間ずっとメッセージが出力されてしまいます。
一度押されるごとに一度だけ出力したいです。


これらを解決するために第二引数を使います。
class KeyPolling
{
  function KeyPolling()
  {
    System.addContinuousHandler(onContinuousHandler);
    System.getKeyState(VK_MEDIA_STOP, false);
    System.getKeyState(VK_MEDIA_PLAY_PAUSE, false);
    System.getKeyState(VK_MEDIA_NEXT_TRACK, false);
    System.getKeyState(VK_MEDIA_PREV_TRACK, false);
  }
  
  function finalize()
  {
    System.removeContinuousHandler(onContinuousHandler);
  }
  
  function onContinuousHandler(tick)
  {
    if (System.getKeyState(VK_MEDIA_STOP, false)) {
      Debug.message("停止");
    } else if (System.getKeyState(VK_MEDIA_PLAY_PAUSE, false)) {
      Debug.message("再開/一時停止");
    } else if (System.getKeyState(VK_MEDIA_NEXT_TRACK, false)) {
      Debug.message("次のトラックへ");
    } else if (System.getKeyState(VK_MEDIA_PREV_TRACK, false)) {
      Debug.message("前のトラックへ");
    }
  }
}

var keyPollingObject = new KeyPolling();
onContinuousHandlerが呼び出される前にコンストラクタでSystem.getKeyStateを呼び出しているのに注意してください。
これを忘れると、最初のonContnuousHandlerでkeyPollingがnewされる前のキー入力を拾ってしまいます。

このようにすればキーが一度押されるごとに一度だけメッセージが出力されるようになります。
スポンサーサイト

タグ : 吉里吉里 TJS

カテゴリ : 吉里吉里

コメントの投稿

非公開コメント

最新記事
カテゴリ

openclose

記事一覧
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。