スクラッチに挑戦している皆さん、どうも!スクラッチコーチです。
質問テンプレート(素早く3回クリックすると全選択できるのでコピーしよう)
・◯◯ ... 記事のどこまで実装が終わったのかを記入しよう。・□□ ... どんな問題が起きているのか、どういうときに起きるのか、具体的に書こう。
・共有済みURL ... たまに共有してない作品URLを書いてる人がいるけど、共有しないとこちらから確認できないからよろしくね。
前回に引き続き、敵モブを作り込みます。
敵モブの動きをグレードアップする
ここまでで次のことが実現されました。
- レベルによって敵モブの配置を変えることができる
- 敵モブはプレイヤーが近づくまでスポーンしない
- スポーン後は、画面内では表示されて、画面外に行くと非表示になる
- 一定の速度で移動する
方向転換する
引き続き次の仕様も実現していきます。
- 壁に当たると反転する
- 坂を登ることができる
- 重力の影響を受ける
- 移動中はアニメーションする
ブロック定義「障害物に触れているか調べる」を作る
変数「障害物に触れているかどうか」を作る
ブロックかレベルに触れたらTRUEにする
ブロック定義「方向転換する」を作る
利用する
障害物に触れているどうか調べる
障害物に触れている場合を作る
坂を登る傾斜を指定する
とりあえず3座標分の傾斜なら坂を登るようにしていきます。
坂を検証するためには、坂を作っておく必要があります。まだシーンに坂がない方は、緩やかな坂を用意してください。こだわらなくてOKです。ただ斜めの四角で十分です。
また障害物に触れているか調べる
Y座標を高くしてもまだ当たっているか調べます。
壁に当たったと見なす
まだ当たっているなら、それは坂ではなく壁であると見なして、いったんY座標を戻します。
反転する
変数「進行方向」を-1なら1に、1なら-1に逆転させます。
動作確認する
壁に当たると移動方向が変わるようになりました!
重力の影響を受けるようにする
坂の処理を確かめるには、重力の影響を受ける必要があります。坂を下る動きができないからです。
変数「スピードY」を作る
初期化する
ブロック定義「Y軸に移動する」を作る
利用する
重力を適用する
接触判定用のループを作る
プレイヤーでも作った、1座標ずつY座標を変えて、何かに接触しているかどうかを判断する処理を作ります。
変数「直前のY座標」を作る
Y座標を記録する
1座標ずつズラす
スピードYは、ジャンプ中はプラスですが、落下中はマイナス方向に値が動きます。プラスかマイナスか、条件分岐して判断する代わりに、絶対値の割り算でプラスとマイナスを判断します。
数字でも解説しておきます。
スピードYが10なら、10 ÷ 10 = 1です。
スピードYが-10なら、-10 ÷ 10 = -1となります。
これで条件分岐せずに、上昇中は1座標だけ上を調べられて、下降中は1座標だけ下を調べられます。
障害物に触れているか調べる
触れていたら減速する
Y座標を元に戻す
動作確認する
※このミニ動画は3倍速になっています
動画の最初にちょっと高めのところにスポーンしたスライムが、重力の影響を受けて着地している様が確認できます。また、坂を下るようにも動いています。壁でも反転して、画面外に行くと消えることも見て取れます。
バグを直す
重力によるバグを確認する
一見上手くいったように見えますが、実はバグがあります。画面外に消えたスライムが、二度と現れなくなるのです。
実はスライムは消えたわけではなく、赤と緑のシーンの間でフルフルしています。画面の下を見て探してみてください。
なぜこのようなことが起きるか説明します。
画面外に行くことで「隠す」ブロックによって隠れるため、ブロック定義「障害物に触れているか調べる」の結果が常に「いいえ」になってしまいます。そうするとブロック定義「Y軸に移動する」では、ずっと重力の影響でY座標が-1され続けて、結果的に、隠れている間に画面の一番下まで落ちてしまうのです。そしてプレイヤーが近づくと表示され、画面下端でフルフル震えているスライムが見つかるという流れです。
表示しているときだけ重力を適用する
最適解ではないかもしれません。しかし、今できる最もカンタンで効果的な打ち手が、表示中のみブロック定義「Y軸に移動する」を適用することです。
また、ブロック定義「方向転換する」も表示中のみ適用します。理由は、隠れている間はどのみち障害物に触れたか正しく判断できないため、やっても仕方ないからです。
埋もれてしまうバグを確認する
これでよし!と思いきや、今度は非表示中にシーンに埋もれこんでしまうバグが起こります。
非表示中は方向転換しない(できない)ので、シーンに段差があっても直進して埋もれてしまいます。隠れている間はそれでもいいのですが、シーンに埋もれている間に表示してしまうと、シーンに埋もれてフルフル震え始めます。
これは目立つバグなので対応していきます。
ただ、けっこう難解な処理になるので、いったん飛ばして区切りの良いタイミングでタックルすることにします。
アニメーションする
次回はアニメーションするところを作り込んでいきます!このあとすぐに更新します。
1記事が長いので、ちょっと分けていこうかなと思って。
- ① 横スクロールを制覇せよ
- ② ジャンプせよ
- ③ 壁・坂を攻略せよ
- ④ ゴールして次へ
- ⑤ ブロックを壊せ
- ⑥ スタックを回避せよ (バグ修正の回)
- ⑦ コインをゲットせよ
- ⑧ 敵モブを召喚せよ1 (クローン化、スポーン、横移動など)
- ⑨ 敵モブを召喚せよ2 (いまここ)
- ⑩ 敵モブを召喚せよ3 (アニメーション)
- ⑪ バトル開始1 (ダメージを受ける・与える)
- ⑫ バトル開始2 (ダメージのアニメーション、フィードバック)
- ⑬ 敵モブをリスポーンさせる
- ⑭ iPadに対応する
- ⑮ 迫りくるパタパタ (敵モブに新しい動きを追加する手順が分かる)
- ⑯ パタパタのバグ修正 (ジャンプのバグを直す)
- ⑰ 壁に埋もれるバグ修正 (バグがバグを呼ぶ、でも諦めない)