- スターター作品
- なし
- 今回の完成サンプル
- なし
さぁ、スクラッチでナニ作る!?
変数GRAVITYに1か-1を格納し、速度・向き・判定など全ての値に掛け算するだけで重力方向を一括反転する設計が際立っている。条件分岐を増やさずに動作を反転させる「符号反転」パターンは、コードの重複ゼロという明快な結論を生む。griffpatchのGeometry Dashシリーズでも実践されているこの手法が、わずか2スプライトのシンプルな作品にどう組み込まれているか、作り方を見ていこう。
動画で見てみよう
[talk]チャンネル登録して応援よろしく!チャンネル登録する[/talk]チュートリアルの元になった作品
[prj-embed prj="1310856708" mini="1" title="プレイしておこう" prj-title="小技:重力反転" prj-author="ok-scratch"]今回の[prj-link prj="1310856708" title="小技:重力反転" author="ok-scratch"]スクラッチを作る参考作品[/prj-link]です。[/prj-embed]今回の目標
スターター作品をリミックスしよう
このチュートリアルにはスターター作品があります。使わなくても大丈夫だけど、最低限の素材などが用意されてるので便利です。
スターター作品をダウンロード
#1ネコの初期設定
[talk class="m-l-n"]旗が押されたらニンジャキャットの準備をするよ。回転方法・初期位置・速度をリセットして、毎回同じ状態からスタートできるようにするんだ。[/talk]準備
スプライト「ニンジャキャット」を開く
| スプライトについて |
|---|
| 重力に従って縦方向に動くニンジャキャットのスプライト。上矢印キーでジャンプし、着地・上昇・下降に応じてコスチュームが切り替わる |
| どんな役割か |
| 重力に引っ張られながらジャンプするネコを作るよ!上矢印キーを押すとネコが飛び上がるんだ。重力の方向が変わると動き方もガラッと変わるよ! |
変数「縦速度」を追加
縦方向の移動速度。重力によって毎フレーム変化し、ジャンプ時に初期値がセットされる
実装
回転方法を ( ) にするを「自由に回転」にして、ネコが自由に回れるようにしておくよ。x座標を ( ) 、y座標を ( ) にするで座標(0, -100)に配置して、「縦速度」を0にリセットするんだ。
#2重力変数とゲーム開始
[talk class="m-l-n"]ここからがこの作品のキモだよ。「■重力」という変数を用意して、重力の向きを数値で管理するよ。[/talk]準備
変数「■重力」を追加
重力の強さと方向を表すグローバル変数。1または-1の値を取り、GravityFlipがクリックされると反転する
メッセージ「スタート」を追加
ゲーム開始を知らせるメッセージ。フラグを押したときにNinjaCatが送信する
実装
「■重力」に1をセットして、( ) を送るで「スタート」メッセージを送るよ。この1という値があとで大活躍するんだ。-1にするだけで重力がひっくり返る仕掛けで、もしこの変数を使わなかったら、上向きと下向きで別々のコードを書く必要が出てきてしまうんだよ。
#3重力加速度のループ
[talk class="m-l-n"]初期設定とゲーム開始の合図ができたから、次は重力の仕組みを作るよ。「スタート」を受け取って、ネコに重力をかけ続けるループを回すんだ。[/talk]ずっとの中で、「縦速度」を( ) * ( )で-1×「■重力」を計算した分だけ変えるんだ。「■重力」が1なら毎フレーム-1ずつ減って下に落ちるし、-1なら+1ずつ増えて上に飛んでいく。
[talk]普通、重力を反転させようと思ったら「もし上向きなら〜、下向きなら〜」って条件分岐を書くよね。でもこの作品では「■重力」に1か-1を入れて、全部の値に掛け算するだけで反転を実現してるんだ。コードの量は変わらないし条件分岐もゼロ。griffpatchのGeometry Dashシリーズでも使われている「符号反転」テクニックで、プロのゲーム開発でも定番の手法だよ。[/talk]
#4着地の条件判定
[talk class="m-l-n"]重力で落ち続けるだけだと地面を突き抜けちゃうから、着地したかどうかの判定を作るよ。[/talk]もし ( ) ならの条件はちょっと長いけど、やってることは2つの質問を同時にしてるだけ。y座標×「■重力」が-100より小さいかどうかで「地面より下にいるか」をチェックして、さらに「ジャンプ中フラグ」が0のときだけ着地処理に入る。y座標に「■重力」を掛けることで、重力がどっち向きでも同じ条件式で判定できるのがミソだね。
#5着地処理とy座標の移動
[talk class="m-l-n"]着地の条件を満たしたら、ネコを止めてコスチュームを戻すよ。そしてループの最後で実際にy座標を動かす。[/talk]着地時は「縦速度」を0にして、コスチュームを「待機」に切り替えるんだ。y座標を ( ) ずつ変えるで「縦速度」の分だけy座標を変えるのは、この条件判定の外側に置くよ。そうすればジャンプ中も落下中も着地後も、毎フレーム速度に応じて移動が行われるんだ。
#6ジャンプ入力の受付
[talk class="m-l-n"]重力ループとは別に、もう1本「スタート」を受け取るスクリプトを作るよ。こっちはジャンプ入力とコスチューム切り替え専用だ。[/talk]ずっとの中でまず( ) 度に向けるを90×「■重力」にセットするよ。「■重力」が1なら普通の向き、-1なら反転した見た目になって、重力の方向が視覚的にわかるんだ。そのあと上矢印キーが押されたかをチェックするよ。
#7ジャンプの実行
[talk class="m-l-n"]上矢印キーが押されたら、いよいよネコをジャンプさせるよ![/talk]準備
変数「ジャンプ中フラグ」を追加
ジャンプ中かどうかを示すフラグ。1でジャンプ中、0で着地状態
実装
「ジャンプ中フラグ」を1にして、「縦速度」に12×「■重力」をセットするんだ。「■重力」が1なら速度は+12で上に、-1なら-12で下に飛ぶ。コスチュームを「ジャンプ1」に切り替えて、飛び上がる見た目にするよ。
ジャンプの高さは「縦速度」の初期値12で決まるんだ。大きくすればもっと高く飛べるし、小さくすれば低いジャンプになるよ。
#8落下の検知
[talk class="m-l-n"]ジャンプの頂点を過ぎて落ち始めたことを検知して、コスチュームを切り替えるよ。[/talk]「縦速度」×「■重力」が0より小さくなったら、ネコは落下に転じたということ。( ) < ( )で比較して、「ジャンプ中フラグ」を0に戻しコスチュームを「ジャンプ2」に切り替えるんだ。ここでも掛け算のおかげで、どちらの重力方向でも正しく検知できる仕組みで、もしこの掛け算をしなかったら重力反転時に落下の判定がおかしくなってしまうんだよね。
#9重力反転スイッチ
[talk class="m-l-n"]ニンジャキャットの動きが完成したから、次は重力反転スイッチを作っていくよ。クリック一発で世界の重力をひっくり返す仕掛けなんだ。[/talk]準備
スプライト「重力反転スイッチ」を開く
| スプライトについて |
|---|
| クリックすると重力の方向を反転させるスプライト。GRAVITY変数に-1を掛けることで上下の重力方向を切り替える |
| どんな役割か |
| クリックするだけで重力をひっくり返す仕掛けを作るよ!クリックするとネコが天井側に引き寄せられるようになるんだ。もう一度クリックすれば元に戻るよ! |
実装
このスプライトが押されたときで重力反転スイッチがクリックされたら、「■重力」に「■重力」×(-1)をセットするよ。1は-1に、-1は1になるトグルスイッチの仕組みだね。ニンジャキャット側のコードを一切変えなくても動作が反転するのが、この設計のすごいところだよ。
クリックしたことが分かるように、( ) の効果を ( ) にするで「明るさ」を30にして0.1秒待ってから画像効果をリセットするよ。ピカッと光る一瞬のフィードバックが、操作感をグッと良くしてくれる。[talk]ゲームデザインでは、プレイヤーの操作に対して即座に反応を返すことがめちゃくちゃ大事と言われているよ。ボタンが光る、音が鳴る、画面が揺れる――こういう小さなフィードバックの積み重ねが「触って気持ちいい」ゲームを作るんだ。[/talk]
まとめ
どうだった?変数に1か-1を入れて掛け算するだけで、重力方向がまるごとひっくり返ったよね。条件分岐ゼロでこんな仕掛けが作れるって、なかなかスマートだと思わない?このGRAVITY変数パターンはgriffpatchのGeometry Dashでも使われているテクニックで、カメラやパーティクルにも応用できるよ。ぜひ自分のゲームにも取り入れてみてね!