くるくる

BASIC入門編

ひろじいべーしっくch 第11回の動画の解説・補足。(0-011)

結論

以下の命令を説明します。

SIN サイン(正弦)を計算するよ。

COS コサイン(余弦)を計算するよ。

RAD 角度の単位を度からラジアンに変換するよ。

INT 小数点以下を切り捨てるよ。

ABS 絶対値にするよ。

SIN、COS、RADを利用して一部の絵を真ん中で回転して見える様にします。

プログラム

今回のプログラムはこちら。(公開キー44425K433、LOAD“N11_KURUKURU”)

本プログラム、「くるくる」は、最初にSPDEF定義番号を入力し、以下のモードのより「ノーマル」(1を入力)か「へんこう」(2を入力)して選択した絵を回転させて楽しむものです。

表示がない箇所(横棒になっている箇所、5672未満で下中央、5672以上で左上)については、想定外の箇所であったので真ん中で回すことができません。

動画「【Switch】ゲームを作る11 くるくる【プログラミング入門プチコン4】」の5分58秒あたり。

動画「【Switch】ゲームを作る11 くるくる【プログラミング入門プチコン4】」の5分58秒あたり。

実行例。

このブログにおいてはなるべく専門用語を使用せずに非常に短く簡潔に説明しています。

詳細を知りたい方は公式リファレンス等も参照してください。

[]については省略可能ですが、一部の命令(例えばDIM命令等)については最低一つの[]は必要です。

SIN

SIN(角度)

読み方は「サイン」。サイン(正弦)を計算します。角度はラジアン単位の角度です。

COS

COS(角度)

読み方は「コサイン」。コサイン(余弦)を計算します。角度はラジアン単位の角度です。

RAD

RAD(数値)

読み方は「ラジアン」。角度の単位を度からラジアンに変換します。数値は度単位の角度です。SIN命令やCOS命令は通常によく使われる度(一周する場合は0°~360°、以下「通常の角度」とします。)をそのまま使用するのではなく、それぞれの()内はラジアン単位で指定します。

そこで、ラジアン単位を理解する必要があります。

1ラジアン=180度÷πということです。RAD命令はこの変換の役割を行います。

変数Rを通常の角度とした場合、SIN命令やCOS命令は下記の様に組み合わせて行うことができます。

例 ?COS(RAD(60)) → 実行すると画面上に0.5がプリントされます。

INT

INT(数値)

読み方は「イント」または「インテジャー」。英語integerの省略。

整数型に変換します。小数点以下は切り捨てられます。

関連する命令として、FLOOR(切り下げ)、ROUND(四捨五入)、CEIL(切り上げ)があります。

例 ?INT(4.6) → 4がプリントされます。

ABS

ABS(数値)

読み方は「アブソリュート」。英語absolute valueの省略。

絶対値(0からの距離)を取得します。すなわち、マイナス符号の数値がプラス符号の数値になります。

例 ?ABS(-46) → 46がプリントされます。

動作の説明

おおまかな動作の説明です。

3行目から7行目まで、ラベルSELECTのところでSPDEF定義番号を入力して絵を選びます。

8行目から21行目まで、ラベルSHOKIのところでは画面の表示をしている。

22行目から、24行目まで、ラベルMAINのところで、絵の表示位置を特に変更しない場合にはヨコ100、タテ100の位置。他は位置を補正して表示している。

25行目から、34行目まで、ラベルMAIN2のところで、画面をタッチした時の判定をしている。

29行目については反時計回り

30行目については時計回り

31行目についてはブレーキ

32行目についてはアクセルです。

38行目ではRという角度のために設定した変数について、360で割った時に余りに変更しているので、360を超えない仕様になっています。

SINやCOSによる回転位置補正の説明

真ん中で回転する様に見える回転位置の補正についての説明です。

この位置の補正について参考にさせていただいたのは、KT.氏のブログのサイト、http://ktstg.blog.shinobi.jp/Entry/832/です。なお、同サイトにおいてはプチコン3についての解説ですので、そのままプチコン4に当てはまることができないことから、こちらで紹介する内容からかなり改変しています。

まず、高校の数学1で習う(?)三角比の図が以下の通りです。

円状の座標については、通常の角度をΘ(シータ)と表した時、その座標は、COSΘがX軸(ヨコ)、SINΘがY軸(タテ)です。

ここで、第3回0-003で紹介した、「コンピュータ言語のグラフはY軸が逆になっている」ということに習ってY軸を下向きにします。また原点(0,0)においては、そのままでは全体が表示されないことから、良く見える位置に移動するということでヨコ0、タテ0の位置からヨコ100、タテ100に移動することとします。つまりそれぞれ100を加算した状態が下図です。

次に、第8回0-008で紹介した、「SPROTは時計回りに回転させる」ということに習って、時計の12時に相当する上中央部分が0度になる様に反時計回りに90度回転させた図が下図です。

23行目において半径50の円状に調整しているのは、23行目が「原点が下中央」にある絵を「原点を真ん中」に補正する際には、「下中央を中央として回転している際の、真ん中の軌跡」を観測点として補正します。

詳細は動画「【Switch】ゲームを作る11 くるくる【プログラミング入門プチコン4】」の17分31秒あたりをごらんになって検証して下さい。

動画「【Switch】ゲームを作る11 くるくる【プログラミング入門プチコン4】」の19分15秒あたり。

動画「【Switch】ゲームを作る11 くるくる【プログラミング入門プチコン4】」の19分15秒あたり。

そこで、半径50を観測点として23行目は以下の通りになっています。

なお、動画も完成してこのブログを書くにあたり、論理的には半径は48がふさわしいということになりました。SPDEF定義番号5672以上で、ほとんどの絵は大きさがヨコ32、タテ32であり、下中央をもつ絵については原点がヨコ16,タテ31、すなわちズレは16です。これを3倍のサイズにしていることから、論理的には半径は48がふさわしいということになります。実際に検討したところ、大きな変化が見られませんでしたがこちらが最も正しいということになります。

SPDEF定義番号5672未満にていては、24行目で処理をしています。ほとんどの絵は大きさがヨコ16、タテ16であり、原点が左上にもつ絵が多くヨコ,0タテ0、すなわち真ん中(8,8)に対してのズレはヨコ8、タテ8です。これを4倍のサイズにしていることから、論理的には半径は32がふさわしいということになります。なお、プログラム発表時には半径25になっています。また上に補正し、左に補正していることから、下図の様な2段構成になっています。

2段構成であり、1段目は黄色い点。そして2段目はその黄色い点をスタートとした緑の点が最終補正地点。

実際に検討したところ、半径25から半径32にした方が真ん中で回っている様にみえます。

つまり、最も理想的な24行目は、「IF M==2 AND SZ==4 THEN SPOFS 0, 100+32*SIN(RAD(R-90))+32*SIN(RAD(R)),100-32*COS(RAD(R-90))-32*COS(RAD(R)) ELSE SPOFS 0,100,100」となります。

改造例1

例1:右側に外れたところにもう一枚絵を表示し、これにあわせて同じ角度になるのを目標にするゲームにする。

実行例。

動画「【Switch】ゲームを作る11 くるくる【プログラミング入門プチコン4】」の12分43秒あたり。

動画「【Switch】ゲームを作る11 くるくる【プログラミング入門プチコン4】」の12分43秒あたり。

以下の5ステップで改造します。

ステップ1

ステップ2

ステップ3

ステップ4

ステップ5

新36行目の「しんくろ率」については、変数RRが目標の角度であり、変数Rを現在の角度としています。RRとRの差にABSを利用しています。またこの割合全体に対してINT命令で小数点以下切り捨て、すなわち整数化しています。

改造例2

例2:右側に外れたところにもう一枚絵を表示し、これにあわせて近い角度に早く合わせて得点を争うゲームにする。

実行例。

以下の4ステップで改造します。

ステップ1

ステップ2

ステップ3

ステップ4

まとめ

真ん中で回転している様に見えるには、「(下中央や左上で)回転している際の、真ん中の軌跡」を観測点として補正すればよく、その命令は角度に対応していることから三角比を利用して行います。

動画内では条件分岐の終了の行であるENDIFの命令の紹介もしています。

コメント

タイトルとURLをコピーしました