[[目次へもどる>PuyoPuyo]]
* 入力を処理しよう [#f8a2b94e]
#contents

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

#sh(ruby){{
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?((現在押されているか))やtrigger?((ちょうど今押されたか))を定義する.


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS