スクラッチに挑戦している皆さん、どうも!スクラッチコーチです。
動く床のギミックがあれば、タイミングをはかってジャンプするゲーム性が生まれたり、マグマのエリアを緊張感持ってジャンプして乗り越えるみたいな楽しさがある。
でも待てよ?床が動いたら、その上に乗ってるスクラッチキャットも一緒に動かないと不自然だよね。それってどうやるんだろうか。単純にXとYを合わせればOKというわけでもなさそうだな。うーん、こりゃ厄介だぞ。よし、いっしょに見てみようか!
- ① まずはここからレッツゴー!
- ② リファクタリング)ステージをスプライトにしよう
- ③ シーンの切り替えのベース処理
- ④ ヒットボックスを使おう
- ⑤ アニメーションを実装しよう
- ⑥ 絶望の坂道処理を克服する
- ⑦ 長押しで大ジャンプする
- ⑧ 壁をツツ〜っとスライドする
- ⑨ か、壁ジャンプだと!?かっこよすぎるだろ
- ⑩ ステージがヨコにだけ続くと誰が言った?タテ構造
- ⑪ うわ!障害物が行く手をさえぎるぞ
- ⑫ 動く床のギミックを作ろう! (いまここ)
- ⑬ ギミックに乗っているときの衝突処理 (11月16日に公開予定)
今回の目標
- 動く床を作る
- ギミックにつぶされたら強制的にリスポーンするようにする
- その上に乗ってるスクラッチキャットも一緒に動くようにする
ステージを少し改造する
ステージを開いてコスをちょっと改造しよう。
スペースが必要だから、このひし形は削除する。
スプライト「ギミック」を作る
新しいスプライトを作るよ。描く、を選ぼう。
スプライト名は「ギミック」がいいかな。
グリフパッチさんの動画だと「Platform」というスプライト名だけど、日本語に翻訳してもなじみがないからぜんぜん違う名前にしているよ。
ギミックが描けたかテストする
まぁテストってほどじゃないけど(^_^;)
うん、描けたけど何も反応しない状態だね。ここから作り込んでいこうか!
スプライト「プレイヤー」を改修する
とりあえずプレイヤーがギミックに乗れるようにしようか。
プレイヤーを開いて、定義「_ステージに触れているか調べる」の条件式に「ギミックに触れたか」という条件を追加しよう。これだけで乗れる。
↓こんなかんじ!
スプライト「ギミック」を作り込む
っと、シーン2に行くとシーン1で表示したギミックがそのまま表示された状態だね。
メッセージ「シーンを切り替える」を受け取ったとき
シーンを切り替えたときの処理を作ろう。そこでいったん隠すブロックを置こうか。
条件ブロックでシーン番号が1か調べれて、表示するブロックを置けばOK!
定義「動く」を作る
シーンを切り替えるときに実行ブロックを置こう。
動く処理を作ろう
とりあえずXとY座標を自分の好きな場所に指定しよう。
◯秒でX座標とY座標を変わるブロックを置こう。今回は上下に動かしたいから、X座標は固定にしてY座標を変えるようにしよう。値はなんでもOKだから、自分が作っているステージに合わせて調整してね。
さらにもう1つ同じブロックを置いて、X座標は固定でY座標を元の場所に戻そう。これで上下の動きができる。
この2つのブロックを、ずっとブロックで囲う。これでシーンが表示されている間は動き続ける。
ただ、タイミングの調整として1秒待つブロックを合間に置こう。
ギミックが上下するかテストする
おっけー!
でもギミックにつぶされたときに通り抜ける状態だね。これも直したい。それとギミックに乗ったときの処理から作り込んでいこうか。よっしゃ!
スプライト「プレイヤー」にギミックの処理を作る
まずはプレイヤーがギミックに潰されたら通り抜けないようにしていく。
定義「_ギミックで動く」を作る
メッセージ「プレイヤーの処理を行う」を受け取ったときに実行する
埋もれを修正する
これでつぶされたときに「埋もれ」が発生するので、それを修正する。
ギミックに潰されるとステージに埋もれるかテストする
よく見てみると、ギミックにつぶされたあとスクラッチキャットが上から降ってきてギミック(と障害物)が消えていることが分かる。いろいろ変数の値がおかしくなってしまうようだけど、とりあえずはつぶされる処理としてはOK。このあと修正していくので、いったん次の挙動に移りたい。
スプライト「ギミック」で移動距離を計算する
動くギミックの上にスクラッチキャットが乗っているとき、どうすればギミックとスクラッチキャットを一緒に動かせるだろうか。
ここではギミックが自分の移動距離を計算して変数に持ち、それをスクラッチキャットからも参照して座標に反映することで一緒に動いているように見せていく作戦を取りたい。少し複雑だね。だいじょうぶ、一緒に見ていこう。
まずギミックを開いてみて。
わかりやすく左右に動くように処理を改変しようと思う。
さっきとは逆に、X座標を変えてY座標は固定にする。
ギミックが左右に動くかテストする
よき。
メッセージ「ギミックの処理を行う」を作る
送る場所はあとで指定するね。
定義「_更新する」を作る
ギミックの情報を更新する定義を作っておく。これは再描画無しにしたい。
これをメッセージを受け取ったタイミングで実行するようにしておく。
変数「直前のX」を作る
変数「直前のY」を作る
それぞれ初期化する。
更新処理はあとで作り込みたいから、ひとまず「◯と言う」ブロックを置いて、意図した通りの値が取れているかテストするためだけの処理にしておいてほしい。
スプライト「プレイヤー」を開く
メインループの処理を行うところで、プレイヤーの処理を行う前に、今回のギミックの処理を行うようにしてほしい。順番が大切。
移動距離が取れているかテストする
さっき「◯と言う」ってやったところをテストしよう。
Xと直前のXの差分が表示されている感じならOKだよ。
スプライト「ギミック」を開く
これを段階的に作っていきたいので、次はプレイヤーとギミックが接触しているときだけ「◯と言う」ようにしてみよう。
単純に条件ブロックで囲えばOK。条件ブロックは「もしーでなければー」の方を使っておいてね。
プレイヤーとギミックが接触しているときに「◯と言う」ようになったかテストする
うん、よさげ。
あー、でもチラチラしてるの分かる?
スクラッチキャットが歩くと「◯と言う」が一瞬消えてるよね。これはプレイヤーのコスチュームが変わったりすることで、スクラッチキャットとギミックが一瞬だけでも離れてしまっているから。
「◯と言う」だけなら問題ないけど、あとで「プレイヤーとギミックが接触してたら、プレイヤーとギミックを一緒に動かす」状態を作るわけだから、プレイヤーが歩いてるときに「接触してない」状態が一瞬でもあると困る。たぶんムーンウォークみたいに、歩いてるのに進まないバグが生まれるんだ。
だからスクラッチキャットがギミックに乗っているときは必ず接触しているようにしたいので少し改善してみようか。
確実にプレイヤーとギミックが接触するようにする
更新する際に条件ブロックを追加するよ。
ここで引数Yと直前のYを比べてみてね。
引数Y、つまり今のYが直前のYよりも大きいときはどういうとき?
答えはギミックが上方向に動いてるときだね。そのときはギミックのY座標にプラス1して、上に乗っているかもしれないスクラッチキャットと確実に触れるようにする。
逆にギミックが下方向に下がっているときや、ギミックが横に移動しているときは、Y座標を「直前のY + 1」にすることで、スクラッチキャットと確実に触れてるようにしたい。
説明が複雑かもしれないけど、シンプルにギミックのY座標をプラス1してスクラッチキャットと触れる状態を作ってるだけだよ。
この変更はあくまでこのあとに続く「プレイヤーに触れたかどうか」という条件式のために行ったものなので、処理の最後に座標を元に戻すブロックを置いておこう。
現状ではX座標はいじってないけど、XとYの両方にセットするブロックを使っておこう。
変数「★ギミックの差分X」を作る
変数「★ギミックの差分Y」を作る
この2つの変数を「◯と言う」の代わりに使っていくよ。
これで移動距離を持つ変数を用意できた。これらをプレイヤーから参照して、プレイヤーの座標にも反映すればギミックとプレイヤーが一緒に動くはずだ。やってみよう!
スプライト「プレイヤー」にギミックの移動距離(差分)を反映する
メインループの初期処理を行うとき
まずは初期化として、この差分変数に空白を入れておこう。
こうしておかないと、ギミックに乗ってないときでもギミックと一緒に動いちゃう。そのため、メインループの初期処理で行うことが肝要です。
定義「_ギミックで動く」で差分を反映する
プレイヤーとギミックが一緒に動くようになったかテストする
おっけぃ!ショート動画だと棒立ちだけど、歩いてみても一緒に動くよ。
まとめ
一見すると当たり前で、まさかここにロジックが必要だったなんて思わなかった人も多いのでは?そうなんだよね、こういう「プレイしてても全然気にならない」事象の裏にはプログラマーの努力が隠れていたりするんだ。そしてそれこそがゲームの品質を支えていたりする。おもしろいと僕は感じる。神は細部に宿る、って感じで楽しい。
そしてさらにギミックに乗っているときの判定を洗練させることで、もっと自然なゲームに仕立て上げていきたい。
いまってギミックに乗ったまま壁に当たったらどうなると思う?
こんなんなっちゃう!これは不自然すぎる。勝手に降りちゃったもん。せっかく自然なゲーム物理を作り込んでいるのだから、このあたりもこだわっていきたい!お見逃しなく〜。
- ① まずはここからレッツゴー!
- ② リファクタリング)ステージをスプライトにしよう
- ③ シーンの切り替えのベース処理
- ④ ヒットボックスを使おう
- ⑤ アニメーションを実装しよう
- ⑥ 絶望の坂道処理を克服する
- ⑦ 長押しで大ジャンプする
- ⑧ 壁をツツ〜っとスライドする
- ⑨ か、壁ジャンプだと!?かっこよすぎるだろ
- ⑩ ステージがヨコにだけ続くと誰が言った?タテ構造
- ⑪ うわ!障害物が行く手をさえぎるぞ
- ⑫ 動く床のギミックを作ろう! (いまここ)
- ⑬ ギミックに乗っているときの衝突処理 (11月16日に公開予定)