スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。
ここからは
敵モブを
追加していきます!
今までと違う動きをする
敵モブを
追加します。そう、
ジャンプする敵モブです!ギャー😫!!ジャンプは
今までと
違う
動きですね。
今までと
違う
動き、ということはスライムとゴーストで
使ってた
「移動する」ブロックでは要件を満たせません😥どうすれば
新しい
動きを
追加することができるか、それも
今回のチュートリアルで
見ていきましょう。
違う動きを追加する手順を押さえておけば、みんなのゲームでもユニークな
敵モブを
追加する
役に
立つと
思います😁ここではパタパタを
実装していきます。といってもスーパーマリオのパタパタをガッツリ
真似するのではなく、
今回もスクラッチが
用意してくれたコスチュームを
利用して、パタパタっぽい
動きの
敵モブを
作ります。よぉし!スクラッチオン!(←スクラッチオンって
使いたいだけ😋)
仕様を決める
今回のパタパタ
風の
敵モブは、カエルで
代用しようと
思います。
完成品を見る
ジャンプの
完成サンプルはこんな
感じ↓
上のカエルを
見ると、ピョンと
一定の
高さでジャンプして、しばらくしてまたピョンとしてます。
空中ではジャンプしません。
地面に
足が
着いてるときだけジャンプします。また、ジャンプ
中は
上がっているときも
下がっているときもX
方向に
進んでいます。
下のカエルを
見ると、
頭がブロックに
当たるとジャンプが
中断されている
様が
見て
取れます。
ok-scratch
\u003cp\u003e自分のオリジナル作品を作るときは完成動画なんてないので、頭の中にある動きをなんとなく文字で書き出しておくと便利。\u003c/p\u003e
仕様一覧
仕様(
要件とも
言う)をまとめると
次のようになります。
- 一定の高さでY方向に上がり、そのあとは接地するまでY方向に下がる。
- ジャンプ中は、X方向にも進む
- ジャンプは連続して行われず、一定間隔を置いて繰り返される
- ジャンプ中にブロックなど障害物に当たると、ジャンプは中断される。
- 壁にあたったら反対方向にジャンプをする
コスチュームを作る
まずは
外見から
作っていきます。
外見が決まるとイメージが湧くので、コーディングの
効率も
上がります。ではコス(コスチューム)を
選んでいきましょう!
キャラを選ぶ
スプライト「敵モブ」を選択する
デフォルトのキャラを探す
コードからコスチュームのタブに
切り
替えて、
左下にあるネコマークにマウスを
持っていきます。
絞り込みする
Frog 2-aを選ぶ
コスチューム名をカエル1にカエル
草チョウチョウを消す
カエルのコスに
含まれるチョウチョウは
今回使わないので、
削除しちゃってOKです。
カエルの全身をグループ化する
真ん中の+に合わせる(センタリング)
グループ
化してから
選択ツールでドラッグすると、
真ん
中にある+マークにピタッとくっつきます。この
センタリング作業を行わないと、上下の動きや回転などがおかしくなります。(
今回、
回転する
予定はありません)
弱点コスを用意する
カエル1を複製する
コス名を「カエル_弱点」にする
グループを解除する
胴体以外を消す
ここを
踏まれたらカエルはダメージを
受ける。それ
以外ならプレイヤーがダメージを
受ける。
カエルをスポーンさせよう
引き
続きスプライト「
敵モブ」を
使います。コスチュームからコードのタブに
切り
替えてください。
スポーン位置を指定する
イベント「レベルの
初期化が
終わりました」を
受け
取ったときにブロックを
追加します。
スタンバイさせる
「クローンされたとき」にブロックを
追加します。
ブロック定義「敵モブ_カエル」を作る
定義位置を分かりやすい場所に移動する
サンプルのプロジェクトではブロックの
役割によって
配置場所を
変えてあります。こうすることで
散乱しやすいスクラッチのコードをまとめています。
スライムの処理をコピペする
とりあえずここまでをテストしたいので、サクッとスライムのブロック
定義をコピペしてしまいましょう😁
ブロック定義を使う
「クローンされたとき」で「
敵モブ_カエル」を
使おう。
テストする
これで
動きをチェック!
問題なければ、とりまOK😁
ジャンプ処理を作ろう
いよいよジャンプです!
今回の
目玉。
ブロック定義「ジャンプする」を作る
定義を分かりやすい位置に移動する
今回は「
移動する
関連」のあたりで
定義していきます。
ok-scratch
\u003cp\u003e下にブロック定義「移動する」があって、ブロックの追加がしづらいですよね。そういうときはいったん「ジャンプする」は横に置いて、できあがったらエディタの「きれいにする」機能で整列させればOKです。\u003c/p\u003e
使う
先にカエルのブロック
定義内で
使っておきましょう。これから
度々テストすることになるので。
ブロック
定義「
移動する」の
代わりに「ジャンプする」を
設置しました。
テストする
この
段階で
緑の
旗を
押してみてください。あれれ?カエルがいなくなってしまいましたね……。
位置を更新する処理をコピペする
ブロック
定義「
移動する」から
位置更新の2ブロックをコピペします。ちと
見づらいね……
画像をクリックしてからダブルクリックすると
拡大できるかも。
(あ、スクショがちょっと
違うかも……
突発的な
間違い
探しゲーム!どこが
違うでしょうw
緑の
枠は
正しいのでご
心配なくm(_ _)m)
テストする
ツーっと
移動してますねwスポーンはしてくれましたのでOK😁
重力を効かせる
空中でツーっと
動くだけなので、しっかり
地面に
落ちてもらいましょう。カンタンです。ブロック
定義「Y
軸に
移動する」
置くだけ。
テストすると……。
重力で
落下してますね😁
高さを変える
ジャンプするからには
高さをコントロールする
必要があります。
地面にいるかどうか調べる
地面にいるときだけジャンプしたいので、ブロック
定義「
障害物に
触れているか
調べる」を
再利用します。
変数「■はい(YES)」は
定数として
使っている
変数で、
中身は1です。
定数については
別チュートリアルを参照してください。
変数「スピードY」を変える
テストする
なかなかいい
感じ😍レンガにハマっても
動き
続けたり
連続でジャンプしまくったり、
直すところは多いけど基本的な動きはかなり近づきましたね!まだ
全然コード
追加してないのに、
今まで
作ったブロック
定義を
駆使したおかげで
楽にここまで
来れました。
一定間隔を空けてジャンプさせる
ピョンピョン
連続でジャンプしているので、
間隔を
空けたいと
思います。そのためにはまず、
移動距離Xを
変えるブロックを
消します。
変数「移動距離X」を変えるブロックを消す
しかし、こうするとカエルがジャンプしなくなってしまいました。なぜでしょうか。
Y座標を少し下げる
テストする
どうでしょう、いい
感じにジャンプとジャンプの
間隔が
空きました😝
X方向に移動する
垂直にピョンピョンするだけではなく、
横にも移動したいですよね。
ブロック定義「移動する」からコードを拝借する
テストする
怖い
怖い
怖いw
黙々と
迫るカエル
怖いwところで、ジャンプしなくなってしまいましたね……。
解決策としてY
方向にプラスの
補正値を
追加します。
Y座標に補正値を追加する
以前、
坂の
判定用にプラス3をY
座標に
追加してあったので、ここでもプラス3を
補正値として
追加します……。いや、バリバリのマジックナンバーですね……😅
後で
直そう、うん。
テストする
埋もれを修正する
ついでに!ブロック
定義「
埋もれを
修正する」という
処理を
作ったの
覚えていますか?これはブロック
定義「リスポーンする」
内で
呼ばれています。ジャンプでも
埋もれは
発生しやすいので、ここでも
再利用していきます。
ブロック定義「リスポーンする」を再利用する
ジャンプ中にX方向に移動する
垂直にピョンピョンする
動きはバグも
直って
落ち
着きました。しかし、
今回の
仕様では、X
方向に
進まなければなりません。じつは
今でもちょこっとずつX方向に動いてます。でもパタパタのようにジャンプしながらプレイヤーに
襲いかかる
敵モブを
目指しているので、
もっと大胆に横移動するように改変していきます😁
自スプライト内でしか使わないイベントを作る
ジャンプしている
間はずっとX
方向にも
移動する
処理を
作る
必要があります。Y
方向の
動きとX
方向の
動きは
同時並行で
行われて、
楕円を
描くようにジャンプさせたいと
考えています。
2つの動きを同時にループ処理をしたいので、1つのループでは実現できません。そこで、イベントを
使いたいと
思います。(
同時に◯◯したい、はイベントを
使うときによくあるニーズ)ということで、イベント「_
敵モブ)ジャンプした」を
作ります。
マイルールなのですが、
自スプライト内でしか使わないイベントの接頭語はアンダーバー「_」と「スプライト名)」にしてます。「_
敵モブ)◯◯した」みたいなイベントは、
敵モブ
内でしか
使わないイベントであることを
暗に
示しています。(
自スプライト
内だけだから「◯◯しました」ではなく「◯◯した」という
表現にもなってる、
細かいけど……😅)いわゆるコーディング
規約の1つです。ただしマイルールなので、
世間一般で「こうすべき」というルールではありません。
イベントを受け取る
このままでは
特に
動きに
変わりはありません。
滞空時間を管理する
「ジャンプ
中はずっと」という
条件を
作りたいので、プレイヤーでも
使った「
滞空時間」という
変数を
作ります。
初期化する
マイナス1なので、ちょっと
気持ち
悪いですけど、とりあえず。あとでリファクタリングします。
ok-scratch
\u003cp\u003eふと思った。進行方向のマイナス1は左向きに進む進行方向を意味しているので、マジックナンバーですね……。定数にしておけばよかった。これもあとで直すかもしれません。\u003c/p\u003e
滞空時間をセットする
ジャンプしたら
変数「
滞空時間」にプラスの
値をセットします。
滞空時間を徐々に減らす
ジャンプ
中に
滞空時間がだんだん
減るようにします。
地面にいるときだけジャンプする
ジャンプするのは、
地面に
接触しているときのみに
限定します。
テストする
よぉく
見ると、
楕円ではなく分度器みたいな形でジャンプしてます。Y
軸の
頂点まで
行ったら、ストンと
落ちていますね。なぜでしょうか。
滞空時間をスピードYの2倍にする
このマジックナンバーはあとで
変数に
直すので、20と
直書きするのではなく
演算で2
倍にしておきます。
テストする
なんか2
回続けてジャンプしてるし!w
リファクタリング(改善)
ちょっとマジックナンバーが
増えてきたので、
一度リファクタリングに
時間を
使います。
リファクタリング)ブロック定義「ジャンプする」を改修する
引数を2つ
作ります。
定義箇所を置き換える
呼び出し元を置き換える
これだけでもちょっと
分かりやすくなりました。
リファクタリング)マジックナンバー「高さの調整値」を潰す
初期化する
置き換える
ブロック定義「ジャンプする」
ブロック定義「方向転換する」
リファクタリング)マジックナンバー「進行方向の-1」を潰す
右向きは
今のところ
不要です。
初期化する
置き換える
リファクタリング)滞空時間の判定をブロック定義化しておく
ブロック
定義「
障害物に
触れているか
調べる」と
同じような
使い
方になります。
「
画面を
再描画せずに
実行する」にチェックを
忘れずに。
変数「滞空時間内かどうか」を作る
ブロックを定義する
置き換える
ブロック定義「ジャンプする」
イベント「_敵モブ)ジャンプした」を受け取ったとき
ふぅ、すっきりしました😁
まとめ
これでジャンプのベースは
整いました。しかし、まだ
今回の
仕様のすべてをカバーしていません。
- ブロックに当たったらジャンプを中止する
- 壁に当たったら方向転換する
これらのヘビーな
仕様が
残ってます。さらには……
このようなバグも
残ってます。これらは
次回チュートリアルにてタックルしていきます。まずはここまで
完成させてください。
数日以内に
更新できると
思います。