Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第9章 キーボードと状態の切り替え

マウスは連続した位置を渡します。キーボードは、押されたキーに応じて「夜へ変える」「動きを止める」「色を選ぶ」といった切り替えに向いています。ここではキー入力を、作品の状態を変える合図として使います。

9.1 矢印キーで位置を変える

keyIsDown を使うと、指定したキーが現在押されているかを調べられます。

def setup
  createCanvas(500, 320)
  @x = width / 2
  @y = height / 2
end

def draw
  @x -= 3 if keyIsDown(LEFT_ARROW)
  @x += 3 if keyIsDown(RIGHT_ARROW)
  @y -= 3 if keyIsDown(UP_ARROW)
  @y += 3 if keyIsDown(DOWN_ARROW)

  background(245)
  fill(235, 90, 120)
  ellipse(@x, @y, 60, 60)
end

if を行末へ置く書き方は、Ruby の後置 if です。条件が短く、実行する処理も 1 行なら、動きの対応が見やすくなります。複雑な条件では通常の複数行の if のほうが読みやすくなります。

9.2 押している状態と押した瞬間

移動では、押している間ずっと位置を変えたいので keyIsDown が合います。一度だけ色を切り替える処理を毎フレーム実行すると、押している短い間に何度も切り替わることがあります。

rbCanvas/p5 では、キーが押されたときに呼ばれるイベントメソッドを定義できます。

def setup
  createCanvas(500, 320)
  @dark = false
end

def draw
  if @dark
    background(20, 25, 40)
    fill(255, 220, 120)
  else
    background(240, 230, 200)
    fill(235, 90, 120)
  end

  ellipse(width / 2, height / 2, 100, 100)
end

def keyPressed
  @dark = !@dark if key == " "
end

スペースキーを押すたび、@darkfalsetrue の間で切り替わります。! は真偽値を反転する演算子です。

イベントメソッド名は rbCanvas/p5 の API 表記に合わせて keyPressed と書きます。通常の Ruby の命名慣習とは異なる camelCase ですが、ここで snake_case へ変えると自動で呼ばれません。

9.3 状態は画面の現在を説明する

@dark は背景色そのものを保存していません。「今は暗い場面か」という意味を保存しています。描画側は、その状態から背景色と円の色を決めます。

色を直接何度も書き換える方法もあります。しかし要素が増えると、背景は夜なのに太陽だけ昼の色という、ちぐはぐな状態が起こりやすくなります。状態を一つ持ち、すべての描画をその状態から決めると関係を保てます。

9.4 3 つ以上ならシンボルで名前を付ける

昼と夜の 2 状態は真偽値で表せます。朝、昼、夜の 3 状態になると、truefalse では足りません。Ruby のシンボルで名前を付けます。

def setup
  createCanvas(500, 320)
  @scene = :morning
end

def draw
  case @scene
  when :morning
    background(250, 180, 150)
    fill(255, 235, 190)
  when :day
    background(120, 200, 250)
    fill(255, 220, 80)
  when :night
    background(20, 25, 50)
    fill(255, 220, 120)
  end

  ellipse(width / 2, height / 2, 100, 100)
end

def keyPressed
  @scene = :morning if key == "1"
  @scene = :day if key == "2"
  @scene = :night if key == "3"
end

case は、@scene の値に合う when だけを実行します。背景と円の色を同じ状態から決めているため、「夜の背景なのに昼の円」というずれが起こりません。実行したら、数字の 123 を順に押して画面の変化を確かめます。

状態へ名前を付けると、コードが作品の構成を語り始めます。次章では、文字列を画面へ置き、操作説明だけではない視覚素材として扱います。

濃紺の500×320のキャンバス中央に淡い黄色の円がある、数字の3を押したあとの夜の場面
図 9-1 数字の3を押すと、night状態から背景と円の色を決定する。
水色の500×320のキャンバス中央に黄色い円がある、数字の2を押したあとの昼の場面
図 9-2 同じコードでday状態にすると、背景と円の組み合わせが昼の色へ変わる。

図9-1と図9-2を見比べると、円の位置と大きさは同じまま、状態から選ぶ色だけが変わっています。

9.5 キーで世界の季節を変える

状態は背景色だけでなく、同じ風景の読み方をまとめて変えられます。1を春、2を夏、3を夜として、背景、地面、空に浮かぶものを場面ごとに選びます。

  • 春では小さなピンクの楕円を散らす
  • 夏では黄色い円と濃い影を置く
  • 夜では月と窓の明かりだけを残す

最初は図形の位置を共通にし、色だけを切り替えます。その後、一つの場面にだけ図形を足します。キー入力を「色変更ボタン」で終わらせず、同じ場所に別の時間が流れる作品へ育てられます。

この章の小さな区切り

  • キーを押して画面の色か場面を切り替えられた
  • 今どの場面かを変数で覚えられた
  • 余裕があれば、一つの場面だけへ形を足した

二つの場面を切り替えられれば、三つ目を作らなくても保存して次章へ進めます。

参考資料