[[目次へもどる>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?((ちょうど今押されたか))を定義する.