スクラッチに挑戦している皆さん、どうも!スクラッチコーチです。
準備
チェックする項目
これはマリオシリーズのレッスンです
前回のレッスンがまだの方はこちらをチェックするか、ここから始めたい方は当レッスンのスタータープロジェクトを使ってください。
「スクラッチでマリオ」シリーズの最終ゴールをチェック
最後までレッスンを進めるとこのようなマリオゲームの土台となるプロジェクトが完成する予定です。
このレッスンのゴールはこちら
実装を始める前に作業する項目
プロジェクトのコピー
「マリオプロジェクト008 敵モブ2」など、分かりやすい名前でコピーしておきます。
敵モブが襲いかかってきた!
いよいよ敵モブがプレイヤーにダメージを与えたり、逆にダメージを受けたりするバトルの動きを作ります。といってもマリオなのでシンプルに踏まれたかどうかの判定によってダメージ処理をするだけです。
ここはマリオと大きく異なる仕様があります。マリオでは敵モブからダメージを受けると残機が減ったり、チビマリオに戻ったりします。
しかしここでは、ダメージを受けたらコインが減るという仕様にしたいと思います。
理由としては、いちいちゲームオーバーになってやり直すというのがプレイヤーとして苦手だからです。
ゲームオーバーになる作品を否定するのではなく、好みの問題です。ゲームオーバーを実装したい方は、全クリアやゴール時の処理を参考に作ってみてください。
戦うプログラミングを作る
戦うとは、ダメージを受けたのか与えたのか判定する一連の処理です。
ダメージを受けたならダメージを加算したり倒されたかどうか判断します。
ダメージを与えたならプレイヤーのコインを減らします。
見ていきましょう!
ブロック定義「戦う」を作る
利用する
非表示中は無効化する
非表示中には戦いようがないので、無効化して省エネします。
バトルの始まりを検知する
プレイヤーに触れたら、それはバトルの合図です。大切なのは、どう触れたか。そこをこの条件ブロックの中に作っていきます。
当たり判定のプログラミングを作る
ブロック定義「当たり判定する」を作る
利用する
変数「弱点を攻撃されたかどうか」を作る
弱点に着替える
前提として、弱点のコスチュームは「モブ名_弱点」という命名規則になっています。これでクローン時にも各敵モブ固有の弱点を設定できます。
弱点のコスを確認する
弱点はコスチュームで指定します。ブロックでも弱点を作りましたね。ブロックは下側でしたが、敵モブは踏まれるとダメージを受けるので頭のあたりに弱点を用意します。
弱点に触れたのかどうかを調べる
コスチュームを弱点に着替えたあとでもプレイヤーに触れた状態かどうかを調べます。
変数「弱点を攻撃されたかどうか」を設定する
フラグ変数である「弱点を攻撃されたかどうか」の値を変えます。
コスチュームを戻す
弱点から元の移動用コスに戻します。
ダメージを受けるプログラミングを作る
ブロック定義「ダメージを受ける」を作る
利用する
スクショが切れてますm(_ _)m
変数「ダメージ」を作る
初期化する
利用する
ダメージを受けたコスに着替える
前提として「モブ名_ダメージ」という命名規則になっている必要があります。
ダメージのコスを確認する
倒されたかどうか判定する
ダメージの蓄積が体力以上になったかどうかを調べます。
後ほど「体力」という部分は変更します。
倒されたらコインを出す
敵モブは倒されたときにコインを落とします。そしてクローンを削除して役割を終えます。
コインを1枚以上落とす
コインを何枚落とすか、それは敵モブごとに変えられるようにしておきます。全員1枚でもいいですし、落とさない敵がいてもいいですし、100枚くらい落とす敵がいてもOKです。
引数を追加する
「体力」と「コイン数」は、引数として受け取るようにします。
ブロック定義「ダメージを受ける」を編集していきます。
ステップ1
- 変更前……ダメージを受ける
- 変更後……ダメージを受ける)体力:
ステップ2
引数を追加して「体力」と改名します。
ステップ3
ラベルのテキストを追加して「コイン数:」と入力します。
ステップ4
引数を追加して「コイン数」と改名します。
ステップ5
引数に置き換えます。
後ほどブロック定義「ダメージを受ける」に引数の値を入力していきますが、いったんプレイヤーにダメージを与える処理に移ります。
やられたコスにして隠す
あとはコスチュームを変えて、やられた感を出します。
このスクショには「ダメージ音」のブロックが追加されていますが、これはもう少し記事の下で追加しています。前後してしまいましたm(_ _)m
メッセージ「敵モブを踏みました」を作る
プレイヤーが敵を踏んだことをメッセージで通達します。
利用する
ブロック定義「戦う」内で使います。
デバッグ用のログも書いてあります。こういう条件分岐の際にログを打っておくと何かと便利です。ログなのでみなさんはお好みで作っても作らなくても大丈夫です。
ダメージを与えるプログラミングを作る
メッセージ「プレイヤーがダメージを受けました」を作る
プレイヤーにダメージを与えたことは、メッセージを通じて伝えます。
利用する
攻撃力を設ける
マリオとは異なる仕様として、敵モブからダメージを受けるとコインが減るようにしたいので、敵モブに攻撃力というパラメータを持たせたいと思います。スライムからダメージを受けたらコインが1枚減るだけでも、クッパみたいなボス級モブからダメージを受けたら一気にコインが10枚減る、みたいなことも可能です。
自分だけのオリジナル敵モブをカスタマイズして作れます。
カスタマイズできると聞くと、ちょっとワクワクしてきませんか?
「攻撃力」は後で変えます。
戦うプログラミングを編集する
ブロック定義「戦う」に引数を追加する
攻撃力、体力、コイン数を追加します。
ステップ1
ステップ2
引数「攻撃力」を追加します。
ステップ3
ラベル「体力:」を追加します。
ステップ4
引数「体力」を追加します。
ステップ5
ラベル「コイン数:」を追加します。
ステップ6
引数「コイン数」を追加します。
ステップ7
引数を適用します。
ステップ8
パラメータを割り振ります。
これがスライムの能力になります。今後敵モブを増やしたら、このようにパラメータを割り振ることで特徴づけができます。
もっと先ですが、レッスンが進めば、より多角的に特徴づけができるようになる予定です。パタパタならジャンプするけど、ノコノコならジャンプはしない、みたいな視点でも柔軟に設定できるようにしていきます。
ダメージを受けるプログラミングを編集する
たとえば次のように引数を追加するだけでも、新しい視点で敵モブの特徴を変えることができます。
音がないと味気ない!と後から気づいて引数を追加することにした、という流れだとしましょう。
ダメージ音を鳴らす
このスクショには「コスチュームをやられたにする」周りのブロックがありませんが、お気になさらず。前後してしまいましたm(_ _)m
ブロック定義「ダメージを受ける」を編集する
ブロック定義「ダメージを受ける」を編集して、ダメージ音も敵モブによって分けられるようにします。
ステップ1
ラベル「ダメージ音:」を追加します。
ステップ2
引数「ダメージ音」を追加します。
ステップ3
引数を適用します。
ブロック定義「戦う」を編集する
こちらにも同じ引数を追加します。
ステップ1
ラベル「ダメージ音:」を追加します。
ステップ2
引数「ダメージ音」を追加します。
ステップ3
引数を適用します。
ステップ4
敵モブごとにダメージ音を変えます。
動作確認する
ここまでの動きが出来ていると次のような動画の動きになります。
動画は無音です。
敵モブと当たるとダメージ音とともに敵モブが消えてコインが現れます。
しかし、プレイヤーが敵を踏んでも何も反動がないのは不自然ですね。マリオだとピコっと音がなって軽く跳ねますよね。
そして、今はプレイヤーが敵をすり抜けてしまうので、じつは立ってるだけでも敵モブの弱点に触れるため倒せてしまいます。
ここからは「敵を踏んだら跳ねる」とか「敵に当たったら弾かれる」というフィードバック周りも修正していきましょう。
メッセージ関係図
メッセージの利用状況の関係図を更新しました!
一番右に「敵モブ」という線が増えました。
次は明日投稿予定です!
- ① 横スクロールを制覇せよ
- ② ジャンプせよ
- ③ 壁・坂を攻略せよ
- ④ ゴールして次へ
- ⑤ ブロックを壊せ
- ⑥ スタックを回避せよ (バグ修正の回)
- ⑦ コインをゲットせよ
- ⑧ 敵モブを召喚せよ1 (クローン化、スポーン、横移動など)
- ⑨ 敵モブを召喚せよ2 (方向転換や重力)
- ⑩ 敵モブを召喚せよ3 (アニメーション)
- ⑪ バトル開始1 (いまここ)
- ⑫ バトル開始2 (ダメージのアニメーション、フィードバック)
- ⑬ 敵モブをリスポーンさせる
- ⑭ iPadに対応する
- ⑮ 迫りくるパタパタ (敵モブに新しい動きを追加する手順が分かる)
- ⑯ パタパタのバグ修正 (ジャンプのバグを直す)
- ⑰ 壁に埋もれるバグ修正 (バグがバグを呼ぶ、でも諦めない)