前編をまだ見ていない人は、先にそちらもどうぞ!
<<前回の続きから>>
ここからはハシゴに関するお話になります。
前編で登場した内容を含んでいる場合は、少し簡潔に書いていきます。
【c】ハシゴの中心位置まで移動する
この仕掛けは、前編にも登場した"エリア変数"が使用されています。
更にアクションプログラムの実行アクションを利用して、忍者君の位置(X軸)をハシゴの中心に来るよう演算しています。
ではさっそく「タイル」タブの設定からいきましょう。
サンプルマップの左下にあるハシゴの画像をクリックします。
"▼タイルの簡易効果を設定"を見てみると、"効果発動の条件:"に「オブジェクトがタイルに重なったら」と、エリア判定変数に「845」が指定されているのが分かります。
ハシゴは845…うん、すっごく分かりやすい!
前回の文言に当てはめるのであれば、このハシゴに対し「重なっている間はハシゴに掴まることを許された特殊なエリア」とするために、識別番号としてエリア変数に「845」を指定した…といった感じです。
ここで気になるのが、忍者君のいったいどこに触れたらハシゴが「重なった」と判断するかですよね。壁判定?当たり判定??
いえいえ、答えはなんと「中心点」です。
中心点について公式ヘルプを見てみると「オブジェクト画像を回転させる際の中心点」といった内容で紹介されていますが、用途はそれ以外にもあったようです。
他にも中心点に役割を担わせているのであれば、是非ともヘルプに紹介が欲しいなっ。(チラチラ
続いて「アニメーション」タブの設定なのですが、実は「ハシゴの中心位置に移動させる」部分に関して、アニメーションは存在していません。
それを実現しているのは「オブジェクト」タブのアクションプログラムだからです。
プログラムを実行後にハシゴに掴まるアクションへすぐ遷移しますので、特に「アニメーション」タブの説明はありません。
では「オブジェクト」タブで具体的に何をしているかと言いますと、忍者君の位置(X軸)を取得し、様々な演算を駆使してハシゴの中心に来るようにしています。
その演算をしているのがこの紫色の部分です。
この紫の部分、名前が違うだけで中身は一緒です。
試しにアクション[step_X]の中を覗いてみると「X_keep」という変数を使用して、そこに6回に渡り式を入れているようです。
演算は"▼その他の実行アクション"の「スイッチ・変数を変更」で実施しています。
モーションは遷移前のを引き継いでいるのです。
変数「X_keep」はこの演算のために用意されたもので、下記の「変数管理」タブで確認することができます。初期値は[0]が指定されています。
では6つの式を上からざっくりと説明します。
[1] 変数「X_keep」に現在のX座標位置を代入これは変数「X_keep」に、忍者君の現在のX座標を代入しています。
X_keep = X座標
[2] X_keepに対し、定数「16」の除算代入(割り算)「/=」を行う。これは[1]で取得したX座標からハシゴタイルの中心を演算し、変数「X_keep」に代入する…というのを[2]~[5]で実施しています。
X_keep = X_keep / 16
[3] X_keepに対し、定数「10000」の剰余代入(余り算)「%=」を行う。
X_keep = X_keep % 10000
[4] X_keepに対し、定数「16」の乗算代入(掛け算)「*=」を行う。
X_keep = X_keep * 16
[5] X_keepに対し、定数「8」の加算代入(足し算)「+=」を行う。
X_keep = X_keep + 8
自身のプロジェクトに実装する場合は「プロジェクト設定」内の"▼タイルサイズ"を確認しましょう。
ここの設定内容によって、数値を変える必要があります。
タイルサイズが「24*24」の場合は、上記式の数値を[16 → 24]、[8 → 12]にそれぞれ変更してください。
一応わたしの方で動作確認しましたが、それで上手く動きました。
[6] 自身のオブジェクトのX座標を「X_keep」の値にする。最後の仕上げに、忍者君のX座標に[2]~[5]の演算により導き出したハシゴタイルの中心位置となる「X_keep」を代入しています。
自身のX座標 = X_keep
…と、本当にざっくりとですが、6つの式が実施していたのは以上となります。
続いてアクションプログラム間を繋いでいるリンクですが、下記の赤線から呼び出され、ハシゴの中心位置を演算後、緑線に遷移するようになっています。
赤線には主に、”▼入力に関する条件設定”で「以下の入力操作がされた(上キーまたは下キー)」と、"▼その他の条件設定"で「スイッチ・変数が変化」に先ほど登場した「エリア判定が[845]になっていたら」が指定されています。
緑線は共通して"▼アクションを切り替える条件"に「無条件で切り替え」が設定されていますので、演算が終了したらすぐに別のアクションへ遷移しているのが分かります。
「アクションプログラム」タブは以上です。
ここまでくれば、あとは忍者君がハシゴに掴まって上り下りするだけですね!
【d】上り下りできるハシゴ
この仕掛けはそれほど難しいことはしていません。
ハシゴの中央に移動した忍者君を重力から解き放ち、移動方向が上下だけになるよう制限をかけています。
今回「タイル」タブの仕掛けは利用していません。
なので、「オブジェクト」タブから使用している「モーション」を確認します。
「ladder_down(start」は最後の【e】にて説明します。
使用しているのは「ladder_loop」と「ladder_wait」の二種類です。
「アニメーション」タブで当該のモーションを確認しましたが、特別な仕掛けはありませんでした。
自身のプロジェクトに実装する場合は、ハシゴ昇降時のモーション、停止時のモーションを用意するだけで大丈夫そうです。
続いて「オブジェクト」タブの内容についてですが、まずはアクションの中身を見てみましょう。
アクションはこの赤線の部分が重要でして、ハシゴに掴まっている間は「重力の影響を受けない(100%)」、「上下(前後)の移動速度を変更(100%)」を設定してあげます。
実はハシゴのアクション以外では「上下(前後)の移動速度を変更」は[0%]が設定されているのです。(床すり抜け時は除く)
理由はハシゴ以外のところで忍者君に上下移動させたくないからです。
前編の床すり抜け時にも登場した「上下(前後)の移動速度を変更」についてですが、下記の「移動とジャンプ」タブ内にある"操作キー設定"に影響を受けています。
サンプルの設定では「上方向(および下方向)への移動:」に上下キーが設定されていますが、これを"キー設定なし"にすると先ほどの「上下(前後)の移動速度を変更」の設定値が無視されます。
自身が作成するゲームの仕様上、上下移動が一切登場しない場合は"キー設定なし"などで余計な数値を参照させないようにするのも手です。
もちろん、"キー設定なし"にしても実行アクションの「指定方向を指定して移動」で上下キーに反応させることは可能ですので、任意のタイミングで上下移動できます。
…できるのですが、ハシゴにはちょっと適さない気がします…。
試してもらえれば分かるのですが、ハシゴ昇降中に斜め移動させる感じでキー入力をすると、左右移動に反応してちょっと思うような挙動にならないのです。(1敗)
なのでハシゴ昇降を実装させるのであれば、ここはサンプルの通り「上方向(および下方向)への移動:」に上下キーを設定し、必要な場面で「上下(前後)の移動速度を変更(100%)」、それ以外では「上下(前後)の移動速度を変更(0%)」が無難かなと思います。
話が脱線しました…。
他にもアクションに設定されている「動作中の表示方向の変更を受けない」がありますが、ゲーム仕様と相談してお好みで良いと思います。
また、「ladder_down」と「ladder_UP」の"▼実行アクション"に「ジャンプ動作を行う」が[有効]になっていますが、これを[無効]にしても動作してくれます。
色々と設定をいじったりしたのですが、何故これを[有効]にしたのかはちょっと分かりません…。わたしに何か見落としがあるかもです。
続いてアクション間を繋ぐリンクについてです。
ハシゴ昇降で関連している部分は下記の赤線と緑線の部分です。
赤線は何れも”▼入力に関する条件設定”で「以下の入力操作がされた(上キーまたは下キー)」関連だけですので、特別な条件はありませんでした。
緑線はそれぞれ異なっており、以下のようになっています。
「ladder_down」→「wait」
▼アクションを切り替える条件
→すべての条件が満たされていたら切り替え
▼入力に関する条件設定
→以下の入力操作が行われた(↓押されている)
▼その他の条件設定
→タイルの壁判定に接触
(意訳:床まで下りたら待機して)
「ladder_wait」→「air」
▼アクションを切り替える条件
→いずれかの条件が満たされていたら切り替え
▼入力に関する条件設定
→以下の入力操作が行われた(A押された瞬間)
▼その他の条件設定
→なし
(意訳:ジャンプボタン押されたら降下させて)
「ladder_UP」→「wait」
▼アクションを切り替える条件
→いずれかの条件が満たされていたら切り替え
▼入力に関する条件設定
→なし
▼その他の条件設定
→スイッチ・変数が変化(エリア変数≠845)
(意訳:ハシゴを上りきったら待機して)
最後の「ハシゴを上りきる=エリア変数が845でなくなった」ということですね。
…と、こんなところでしょうか。
アクション自体は難しいことをしていないのですが、説明がちょっと難しかったです…。
【e】足元にハシゴがあれば降りる
この仕掛けは今までのアクションを色々と応用しています。
足元にハシゴが存在していないか(エリア変数[845]のタイルがないか)をサーチし、在ればハシゴ中心移動の演算後、床すり抜けをしてハシゴに掴まっています。
では例の如くタブを一つずつ見てみましょう。
「タイル」タブでは特に目を引く仕掛けはないのですが、ハシゴを掛けられるタイルは限定されますので注意が必要です。
前編にも登場した赤色の床タイルに対し、「壁判定」を色々指定してハシゴを降りられる条件を調べてみました。
結果、下記のように1方向でも壁判定がなければ降りることができ、4方向を壁判定にするとハシゴがあっても降りられないことが分かりました。
これは意図しないところをハシゴで降りられてしまうバグに繋がったりしますし、逆にこの仕様を利用して一度ハシゴを降りると戻れない床にすることも可能です。
知っておくと色々面白そうですね。
続いて「アニメーション」タブ…の前に、「オブジェクト」タブで使用されているモーションを確認します。
使用しているモーションは「wait(check」「move(check」「ladder_loop(xx」の3つになります。
「アニメーション」タブを開き、「wait(check」と「move(check」を見ていきましょう。
他のモーションと異なり、黄色い忍者君になっています。
モーション名に「check」という文言から分かる通り、このモーションを使って足元のハシゴチェックをしているのです。
モーション「wait(check」を選択し、適当なフレームを見てみると「中心点」が忍者君の接地面より下になっていることが分かります。
「move(check」にも同じ設定がされており、この「中心点」がハシゴタイル…正確にはエリア変数[845]が設定されたタイルに触れると「ハシゴを見つけた!」と判断できるようになるわけですね。
この方法は色んなギミックに応用できそうです。
例えば、NPCに使用することで壁に接触する手前でジャンプするようになったり、頭上からの障害物を避けるようになったり、ちょっと賢そうな挙動にできるかもしれません。
次に「ladder_loop(xx」ですが、このモーションには壁判定が設定されていません。
理由は床すり抜けの時と同じと思ってよいです。
では「オブジェクト」タブに戻ります。
アクション「ladder_down(start」の内容は前述したハシゴ昇降の内容と同じです。
モーションに「ladder_loop(xx」を使用しているため、このアクションが実行されている間は床との接触ができませんので、床をすり抜けます。
他のアクション「wait(check」「move(check」については特に目を引く設定はありませんが、「上下(前後)の移動速度を変更」の値がどうなっているのか、注目してみてください。
次はリンクについてですが、今回の仕掛けで関連しているのは下記の赤線、緑線、青線です。
赤線部分は足元にハシゴタイルが無いかをチェックしています。
チェックした結果、ハシゴタイルが無い場合の遷移も含まれます。
設定されている条件は何れも十字キーが"押された"または"離された"です。
「wait(check」「move(check」から伸びている緑線は主にチェックした結果、ハシゴタイルが在った場合の遷移です。
エリア変数が[845]になったら遷移するようになっています。
「ladder_down(start」から伸びている緑線は、モーションの再生がすべて終了したら「ladder_down」へ遷移するという内容です。
最後に「ladder_down(start」から伸びている青線ですが、これはハシゴを降りようとしている瞬間に上キーが押された場合の遷移だと思います。
自身のプロジェクトに実装する場合、ハシゴを降りる専用モーションがあるのでしたら「ladder_down(start」のモーションキャンセルをどうするか、考える必要が出てくるかもしれませんね。
…と、【Ladder sample】の説明は以上となります。
お疲れさまでした。_(:3 」∠)_
最後に
最後は若干手抜き感がありますが…。(´・ω・`)ユルヒテ
後半は前編の応用が殆どですので、たぶん大丈夫!
今回なぜこのサンプルを取り上げて説明したかですが、個人的にこのサンプルを触ったことでアクツクMVの理解が深まったからだと思います。
後で自分で見返す用でもありますし、アクツクMVを始めた方の手助けになれれば良いなぁという気持ちもあったりします。
…おこがましいのは承知しておりますが故、そこは何卒…何卒…。_(:3 」∠)_
予感はしていましたが、記事が過去最高のボリュームに(笑
なんとか書き上げることができて良かったです。
画像の加工など大変でしたが…程よい疲労感とちょっとした達成感に包まれておりまする。
また面白いサンプルが登場したときは、今回のような記事を認めたいです。
とまぁ、今回はこの辺で。
ではでは、また次回のブログでお会いしませう!しーゆー_(:3 」∠)_