目次へもどる

入力を処理しよう

コントロールブロックの大まかな流れは実装できたので,これを操作するための機構InputController?を作ろう.

class InputController
  @@keys = [:up, :down, :right, :left, :button1, :button2]
  @@keymap = []
  @@keymap[1] = { # Player1 keymap
    :up => :w,
    :down => :s,
    :right => :d,
    :left => :a,
    :button1 => :f,
    :button2 => :g
  }
  @@keymap[2] = { # Player2 keymap
    :up => :up,
    :down => :down,
    :right => :right,
    :left => :left,
    :button1 => :numpad2,
    :button2 => :numpad3
  }

  def initialize(player)
    @player = player
    @press_count = {}
    @@keys.each do |key|
      @press_count[key] = 0
    end
  end

  def update
    input_keys = StarRuby::Input.keys(:keyboard)
    @@keys.each do |key|
      if input_keys.include? @@keymap[@player][key]
        @press_count[key] += 1
      else
        @press_count[key] = 0
      end
    end
  end

  def press?(key); @press_count[key] > 0; end
  def trigger?(key); @press_count[key] == 1; end
end

まず入力キー一覧と各プレイヤーのキーマップをクラス変数で定義しておく. インスタンスの生成時にプレイヤー番号とキーそれぞれが何フレーム押されているかを記録する@press_countを作る.

updateメソッドが呼ばれるとStarRuby?のInputモジュールを用いて現在押されているキーの一覧を取得する. これを用いて@press_countを更新する.

あとは@press_countに基づいてpress?*1やtrigger?*2を定義する.


*1 現在押されているか
*2 ちょうど今押されたか

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-08-30 (金) 22:01:38 (1902d)