主人公を足止めする敵【ウディタ】

2022/02/14

ウディタ ゲーム制作

  Twitterでも動画で載せたんですが、ここでも言わせてもらいます…メチャクチャ頑張って作ったEvです。初心者にしては中々頑張っているのでは?と自画自賛してます。

  今回はこのEvをどう作ってみたのかを、自分の備忘録のためにも残したいと思います。

敵キャラをマップイベントで作成

 主人公を足止めする敵キャラをマップイベントで作成します。マップイベントのページは全部で4p使いました。

 自分はこのEvを作っていて初めて知ったのですが、マップイベントのページは大きい数字のページが優先的に処理されるみたいです。

 なので、「主人公を発見していない状態」の処理を4p目にして3p目で「発見」、2p目で「足止め状態」、1p目で「主人公を離した状態」で処理を作成します。

 常に処理を実行していたいので並列実行で全てのページを作っています。しかし、並列実行のEvが多いと重たくなるので、どうにか改良できれば…と思います。

実際の処理内容

4p「主人公を発見していない状態」

 起動条件:並列実行 self0:セルフ変数0が0と同じとき

(処理)
■イベントの挿入[名]: このEvのセルフ変数0 = ["直線状視界コモン"] <コモンEv 217>  / 1: 1マス / 15 / 0:すり抜け無し

 おりガミ様の作成された直線状視界コモンをお借りしています。このコモンイベントで主人公を索敵しています。

お借りさせていただいた、おりガミ様の直線状視界コモンはこちらです↓

3p「発見」

 起動条件:並列実行 self0:セルフ変数0が1と同じとき

(処理)
■イベントの挿入[名]: このEvのセルフ変数1 = ["近づくと起動(0=停/1=起)"] <コモンEv 218> 
■回数付きループ [ 1 ]回
 |▼ 主人公と接触したか?
 |■変数操作+: このEvのセルフ変数2 = 主人公 の X座標(精密)
 |■変数操作+: このEvのセルフ変数3 = 主人公 の Y座標(精密)
 |■変数操作+: このEvのセルフ変数4 = このマップイベント の X座標(精密)
 |■変数操作+: このEvのセルフ変数5 = このマップイベント の Y座標(精密)
 |■変数操作: このEvのセルフ変数6 絶対値= このEvのセルフ変数2 - このEvのセルフ変数4 
 |■変数操作: このEvのセルフ変数7 絶対値= このEvのセルフ変数3 - このEvのセルフ変数5 
 |■条件分岐(変数): 【1】このEvのセルフ変数6 が 2以下
 |-◇分岐: 【1】 [ このEvのセルフ変数6 が 2以下 ]の場合↓
 | |■条件分岐(変数): 【1】このEvのセルフ変数7 が 2以下
 | |-◇分岐: 【1】 [ このEvのセルフ変数7 が 2以下 ]の場合↓
 | | |▼ p2のSE・エフェクト
 | | |■サウンド:SE 
 | | |■キャラエフェクト:このイベント[シェイク] Xシェイク 2 / Yシェイク 0 / 10回  (3)フレーム
 | | |■変数操作: このEvのセルフ変数0 = 2 + 0 
 | | |■
 | |◇分岐終了◇
 | |■
 |◇分岐終了◇
 |■
◇ループここまで◇◇
■条件分岐(変数): 【1】このEvのセルフ変数1 が 0と同じ 【2】このEvのセルフ変数1 が 1と同じ
-◇分岐: 【1】 [ このEvのセルフ変数1 が 0と同じ ]の場合↓
 |▼ 停止
 |■変数操作: このEvのセルフ変数0 = 0 + 0 
 |■
-◇分岐: 【2】 [ このEvのセルフ変数1 が 1と同じ ]の場合↓
 |▼ 起動
 |■
◇分岐終了◇

 このページで主人公の位置と自分(このマップイベント)の位置を調べて、絶対値を出して座標Xと座標Yが±2以下のとき主人公を捕まえた判定。「足止め状態」に移動します。回数付きループは何でそうしているのか作った本人にも分からないです…上手くいったのでそのままにしているといった具合です。

 2p目へ移動する前にエフェクトを入れているのは、2p目にエフェクトを入れると起動条件が並列実行にしているのでずっとエフェクトが起き続けてしまうからです。今回は一回だけSEが鳴って、エフェクトも一回だけ実行して欲しかったのでココに挟んでいます。

 セルフ変数1は「近づくと起動するコモンイベント」を設定しています。=0のとき停止、=1のとき起動するように分岐して停止しているときはセルフ変数0を=0にして4p目に戻して索敵させます。

近づくと起動するコモンを使った敵キャラをもう一体紹介しています↓

 近づくと起動するコモンは、なにものにもとらわれないブログ様の記事を参考にさせていただいています。こちらの記事のリンクも上の記事の最後の方に載せさせていただいています。

2p「足止め状態」

 起動条件:並列実行 self0:セルフ変数0が2と同じとき

 オプション設定の移動時アニメと待機時アニメのチェックを外し、方向固定にチェックをつける。

(処理)
▼ セルフ変数9  連打回数
■動作指定:主人公 / グラフィック変更 0:※空データ
▼ 主人公動けない
■キー入力禁止/許可:   ↓キー  ←キー  →キー  ↑キー   [ 移動時×  キー入力○ ]
■イベントの挿入[名]: ["主人公移動制御"] <コモンEv 230>  / 1:オン
■キー入力:このEvのセルフ変数8 /  4方向 決定(10)
▼  
■条件分岐(変数):  【1】 このEvのセルフ変数8  が   10 と同じ 
-◇分岐: 【1】  [ このEvのセルフ変数8  が  10 と同じ  ]の場合↓
 |▼ キーの連続入力を阻止
 |■ループ開始
 | |■ウェイト:1 フレーム
 | |■キー入力:このEvのセルフ変数8 /  決定(10)
 | |■条件分岐(変数):  【1】 このEvのセルフ変数8  が   0 と同じ 
 | |-◇分岐: 【1】  [ このEvのセルフ変数8  が  0 と同じ  ]の場合↓
 | | |■ループ中断
 | | |■
 | |◇分岐終了◇
 | |■
 |◇ループここまで◇◇
 |■条件分岐(変数):  【1】 V2-1[GAMEOVER]  が   1 と同じ 
 |-◇分岐: 【1】  [ V2-1[GAMEOVER]  が  1 と同じ  ]の場合↓
 | |■デバッグ文:GAMEOVER時  連打×
 | |■イベント処理中断
 | |■
 |◇分岐終了◇
 |▼ 連打SE
 |■サウンド:SE ファイル[SE/[Effect]Attack3_panop.ogg] 音 75% 周 70% (0 チャンネル) 再生  /  遅延:0フレーム
 |▼  
 |■変数操作: このEvのセルフ変数9 += 1 + 0 
 |▼ 15回で離す
 |■条件分岐(変数):  【1】 このEvのセルフ変数9  が   15 と同じ 
 |-◇分岐: 【1】  [ このEvのセルフ変数9  が  15 と同じ  ]の場合↓
 | |■変数操作: このEvのセルフ変数0 = 3 + 0 
 | |■変数操作: このEvのセルフ変数9 = 0 + 0 
 | |■
 |◇分岐終了◇
 |■
◇分岐終了◇

 セルフ変数9で何回連打したのかをカウントしていきます。この際に、キー入力処理を普通に行うと、キーを押しっぱなしにしてもカウントしてしまい、連打しなくてもよくなってしまいます…。そこでキーの連続入力を阻止する処理を入れます。

キーの連続入力を阻止する方法はこちらの記事を参考にさせていただきました↓

 本当に有難すぎる。

 動作指定で主人公をグラフィック0で消しているのは、このページのグラフィックを主人公を捕まえているような画像に切り替えて主人公を捕まえたように見せるためです。また、主人公をキー入力禁止のコマンドで動けなくしておきます。

 キー入力禁止をしても決定キーを連打している最中に、移動キーが押されていると主人公が移動してしまいました。なので、【主人公移動制御】というコモンを新しく用意しそこで「アローキーとテンキーの入力を禁止」と「アローキーとテンキーの入力を許可」を制御しています。

 【主人公移動制御】はコモンの入力設定でON/OFFが切り替えられるようにして、コモン挿入のコマンドから操作できるようにしてます。

この【主人公移動制御】について、どのような処理なのかをまとめてみました↓

 自分の場合はGAMEOVERになるとタイトルに戻るかそのままロードするかを選ぶ選択肢を用意しているのですが、その選択肢でキー操作ができなくなることを阻止するためにGAMEOVERの時に条件分岐を行い「GAMEOVERの時イベント処理中断」を行っています。

 また、マップEvが並列実行なため【主人公移動制御】がずっと作動し続けます。これによりキー操作ができなくなってしまうので、ページを新しく作り…V2-1[GAMEOVER]=1のとき(GAMEOVERになった時)起動条件が決定キーで実行の空のページに飛ぶようにしました。

 この作業はロードなどを挟むと操作可になるのでGAMEOVERになってすぐタイトルに戻るのであれば必要ないです。

 今回主人公を捕まえたように見せるのに使ったのは下の画像のキャラチップになります。四方向・アニメ数全部に絵を入れているのは、主人公が接触した角度でキャラチップが点滅することがあったので、点滅防止で全て埋めています。

作成中ゲームで使用している敵キャラグラフィック
主人公を捕縛したように見せるのに使用したキャラチップ

 キーを15回押すとページを移動し、敵キャラが主人公を離すようにします。この時、連打カウンターのセルフ変数9を=0に戻しておきます。

1p「主人公を離した状態」

 起動条件:並列実行 self0:セルフ変数0が3と同じとき

 オプション設定の移動時アニメと待機時アニメのチェックを外し、方向固定にチェックをつける。

(処理)
■キャラエフェクト:このイベント[シェイク] Xシェイク 2 / Yシェイク 0 / 10回  (3)フレーム
■動作指定:主人公 / グラフィック変更 2:主人公
■サウンド:SE ファイル[SE/[Action]Kick1_Komori.ogg] 音 100% 周 70% (0 チャンネル) 再生  /  遅延:0フレーム
■キャラエフェクト:このイベント[点滅A(明滅)] R200/G-90/B-90  (10)フレーム
■キー入力禁止/許可:   ↓キー  ←キー  →キー  ↑キー   [ 移動時○  キー入力○ ]
■イベントの挿入[名]: ["主人公移動制御"] <コモンEv 230>  / 0:オフ
■動作指定:[ウェイト] このイベント / 主人公から離れる / 主人公から離れる / 主人公から離れる / ウェイト 50フレーム
■キャラエフェクト:このイベント[点滅A(明滅)] R30/G0/B0  (0)フレーム
■変数操作: このEvのセルフ変数0 = 0 + 0 

 このページも、2p目と同じように専用に仰け反ったようなキャラチップを作って、マップイベントのグラフィックをその専用キャラチップに設定しています。

 また、このページはマップイベントの敵キャラが主人公を離したので、主人公のグラフィックを戻して動けるようにします。

 自分はこのページの処理を作るときに詰まったところがあり…それが動作指定です。

 最初にこのEvを作った時、コマンド入力するイベント制御画面の動作指定ボタンの隣にある「完了までウェイト」を使っていました。ウェイト処理が3カ所(動作指定の中のチェックボックス・動作指定隣の完了までウェイト・イベント制御画面のウェイト)あるけれど、どれを使っても同じだろうと思っていたからです…。

 しかし、どうにも上手くいかず動作指定の処理だけで2日使ってしましました。

 最終的に行き着いた先が、動作指定の中のウェイトを使う。これだけで上手くいきました。(最初に作った時は、動作指定の中のウェイトで上手く動かなかったのに…急に何故か思ったように動作して謎)

 話は処理内容に戻しまして、動作指定の中で主人公から離れさせてからウェイトを50挟んでいます。このウェイトは無敵時間のような感じで、連続して主人公を捕まえないようにするための時間です。無限に捕まり続けてはストレスしか溜まらんので大事なウェイトです。

 最後にセルフ変数0を=0にして4p目に戻して主人公を発見していない状態にします。

 …これで、主人公を足止めする敵キャラの完成です。

最後に

 主人公を足止めする…という敵は、いろんな場面に使えて、それでいてゲームに程よく難易度を加えられる敵キャラなのでは?と個人的に思います。このイベントが誰かの参考になれば嬉しいです。

 最後まで読んでいただき、ありがとうございます

profile


MNEET
ゲーム制作を亀並みですがやってます
MNEET(@ごみ)の自創作置き場です
ゲーム制作以外にも自創作関係を投稿していこうと思っています
幅広に創作活動をしていきたい気持ち
よろしくお願いします👐

ゲーム制作や創作以外。日常系という名の自我👇
生活LOG+

MNEETのTwitter👇
垢名【ごみ】  Twitter

作ったゲーム

初完走!第一作目 徘徊者の館
第二作目 ぼく

カテゴリー

このブログを検索

QooQ