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

第4章 draw が静止画を動かす

アニメーションは、円そのものが動いているわけではありません。少し違う静止画を短い間隔で描き直し、目が動きとして受け取っています。rbCanvas/p5 の draw は、この描き直しを自動で繰り返します。

背景を描く、形を描く、位置を変える、という処理が繰り返される図
図解 4-A `draw` は一周するたび、次の一枚を描き始める。

4.1 setup の 1 回と draw の反復

次のコードを実行すると、円が右へ進みます。

def setup
  createCanvas(480, 240)
  @x = 0
end

def draw
  background(245)
  fill(235, 90, 120)
  ellipse(@x, height / 2, 60, 60)
  @x += 2
end

setup は最初に 1 回、draw はそのあと繰り返し呼ばれます。rbCanvas/p5 の公式資料では、既定の draw は 1 秒あたり 60 回です。端末の性能や処理内容により、実際の間隔は変わることがあります。

@x += 2 は、現在の @x に 2 を足し、その結果を再び @x へ代入する省略記法です。

4.2 なぜ @x には @ が付くのか

次のように setup で普通のローカル変数 x を作っても、draw からは使えません。

def setup
  x = 0
end

def draw
  ellipse(x, 100, 60, 60)
end

ローカル変数は、そのメソッドの中だけで使える値です。setup が終わると、drawx を見つけられません。

@x はインスタンス変数です。同じ実行中の別のメソッドからも参照できるため、setup で用意した位置を draw が読み、更新できます。アニメーションには「前のフレームの値を次のフレームまで覚える」必要があり、インスタンス変数がその記憶になります。

4.3 background が軌跡を消している

次の draw は変更部分です。4.1の長いコードにある def draw から対応する end までと置き換え、background(245) をコメントにした結果を比べます。

def draw
  # background(245)
  fill(235, 90, 120)
  ellipse(@x, height / 2, 60, 60)
  @x += 2
end

円の軌跡が帯のように残ります。円が伸びたのではなく、前のフレームを消さず、その上へ新しい円を描き足しています。

どちらが正しいかは、作りたいものによります。物体の輪郭をはっきり動かすなら、毎回背景を描き直します。筆跡や時間の蓄積を見せるなら、背景を最初の setup だけで描く方法があります。

def setup
  createCanvas(480, 240)
  background(245)
  @x = 0
end

def draw
  fill(235, 90, 120, 35)
  noStroke
  ellipse(@x, height / 2, 60, 60)
  @x += 2
end

透明度を下げたため、重なった場所ほど濃くなります。時間が画面へ積もる表現です。

薄い背景の横長キャンバスに、半透明の赤い円が左から右へ重なって帯のような軌跡を作っている実行結果
図 4-1 背景を毎回消さないと、円が通った時間が軌跡として残る。

4.4 位置と速度を分ける

@x += 22 は、1 フレームで進む距離です。これを速度として別にすると、動きの調整箇所が明確になります。

def setup
  createCanvas(480, 240)
  @x = 0
  @speed = 2
end

def draw
  background(245)
  ellipse(@x, height / 2, 60, 60)
  @x += @speed
end

@speed-2 にすると左へ動きます。-2 は 0 より小さい数で、「マイナス 2」と読みます。ここでは 1 回の描き直しごとに x を 2 小さくするため、円が左へ進みます。2-2 のプラス・マイナスが、進む方向の違いになります。

4.5 画面から消えることも結果

しばらくすると円は右端から消えます。プログラムが止まったのではありません。@x は増え続け、円がキャンバスの外で描かれています。

このまま軌跡を作るのも一つの作品です。端で戻したい場合は、位置に応じて処理を変える必要があります。第5章では、その分岐を if で書きます。

4.6 動く円を流れ星へ変える

円の前に線を加えると、同じ横移動が流れ星に見えてきます。line(ライン)は、始点のxとy、終点のxとyを受け取り、その2点を直線で結びます。

def setup
  createCanvas(520, 280)
  @x = -80
end

def draw
  background(15, 20, 45)

  stroke(255, 210, 100)
  strokeWeight(5)
  line(@x - 90, 110, @x, 150)

  noStroke
  fill(255, 235, 150)
  ellipse(@x, 150, 24, 24)

  @x += 4
end

stroke(ストローク)は線の色、strokeWeight(ストローク・ウェイト)は線の太さを決めます。星を速くする、尾を長くする、斜め上へ進ませる、のどれか一つから改造できます。円の移動を学んでいるのは同じでも、作品の時間が生まれます。

濃紺の背景を、黄色い尾を引いた丸い流れ星が右へ進む場面
図 4-2 線と円を同じ位置から動かすと、尾を引く流れ星になる。

この章の小さな区切り

  • drawが同じ処理を繰り返すことを画面で確認した
  • @xまたは@speedを変え、動く向きか速さを変えた
  • 円、軌跡、流れ星から、もう一度見たい版を保存した

円が画面外へ消えても失敗ではありません。動いていたことを確認できれば第5章へ進めます。

参考資料