Scratch

Scratchの「回転方法」

More than 1 year has passed since last update.

Scratchに最初から実装されている「回転方法」についてまとめてみました。

スプライトの回転

回転座標

Scratchでは、真上を0度、真下を180度、右を90度、左を-90度としています。
言い換えると、スプライトの角度は、真上を基準(0度)に、-179度~180度の範囲をとることになります。

回転命令の種類

スプライトの回転に関する命令は、「○度回す」と「○度に向ける」の2種類があります。
(厳密にいえば、「○度回す」は時計回りと反時計回りの2つにわけられますが、ここではまとめて扱います)

この2つの命令の違いは、回転角度を絶対的に指定するか、相対的に指定するかの違いです。

  • 「○度回す」:現在の回転角度に対して、追加で○度回転させる
  • 「○度に向ける」:現在の回転角度に関わらず、スプライトを○度回転させた状態にする

ここで、スプライトの回転角度を保持する内部パラメータをθとすれば、

  • 「α度回す」:θ = θ + α
  • 「β度に向ける」:θ = β

と書くことができます(=は代入の演算子)。

「回転方法」

謎の命令「回転方法を () にする」

Scratchには、回転に関する命令としてもう一つ、「回転方法を () にする」という命令があります。
多くのScratch入門において、この命令は以下のような状況下で登場します:

スプライトが右方向(=90度の方向)へ移動しつづけ、画面の右端に到達したら、
スプライトを左方向(=-90度の方向)に向けて、左方向へ移動するようにします。
このとき、スプライトが左方向を向くと上下がひっくり返った状態になってしまうので、
「回転方法を『左右のみ』にする」の命令を併せて実行すれば、
上下ひっくり返るのを防ぐことができます。

プログラマとしての疑問

・・・確かにその通りなのですが、ここで画像を扱ったことのあるプログラマとしては色々疑問が湧いてくるわけです。

  • それって「回転」じゃなくて「左右反転」なのでは?
  • 「上下反転」をしたい場合はどうすればいいの?
  • 「回転方法を () にする」の選択肢にある『回転しない』って何?

Scratch wikiには…

Scratch wikiの当該ページにはこのように書かれていました:

回転方法を () にするブロック(動きブロック/スタックブロック)は、
プロジェクトで選択中のスプライトについて、見た目の回転方法 を設定するブロックである。
なお、どの回転方法が選択されている場合でも、変数「向き」の値自体は保持されており、
変更できる(回転方法によっては、画面表示が固定されるため
「向き」が変更できないように見えるが、「向き」の値自体は変わっている)。

・・・つまり、

  • 「回転方法を () にする」という命令は、スプライトの回転の「見え方」を変える命令
  • あくまでも「見え方」を変えるだけなので、回転角度の内部パラメータの値は操作しない

ってこと?

検証

テスト用のスケッチを書いてみました。

方法

緑の旗をクリックしても何も起こりません。
「中を見る」をクリックし、直に命令をダブルクリックして使ってください。

20170501-1.png

  • 回転角度は45度刻みで行う前提になっています。
  • スプライトの猫の頭上には、回転角度の内部パラメータに対応する数値が表示されています。

コスチュームを見ていただければわかりますが、
それぞれの角度によって頭上の数値が変わるコスチュームを用意し、
角度が変更されたときに、内部パラメータに対応したコスチュームに変更することで
この機能を実装しています。(なんと原始的!)

これで、上3つの命令

  • 「回転方法を『左右のみ』にする」
  • 「回転方法を『回転しない』にする」
  • 「回転方法を『自由に回転』にする」

のそれぞれを実行した後で、回転命令を実行するとどうなるのか、確認してみます。

結果

「回転方法を『左右のみ』にする」
20170501-2.png
※なお、-1度及び-179度は、-153度~-45度と同様、反転表示になった。

「回転方法を『回転しない』にする」
20170501-3.png

「回転方法を『自由に回転』にする」
20170501-4.png

結論

  • 「回転方法」とは、スプライトの回転角度のパラメータに対してどのように画像を表示させるかを指示する命令。
    • 『自由に回転』が最も単純で、回転角度のパラメータの通り、画像を回転させて表示
    • 『回転しない』は、文字通り、回転角度のパラメータを無視し、常にデフォルトの角度で表示(ただし『デフォルトの角度』とは90度のこと)
    • 『左右のみ』が最も奇怪(少なくとも私にとっては)で、
      • 回転角度のパラメータが0度~180度:90度で表示
      • 回転角度のパラメータが-1度~-179度:90度の表示を左右反転させて表示

なお、最初から実装されている命令には、「反転」という命令はないらしく、したがって、上下反転だけを行うことはできないっぽい。