「ウディタで直線的に往復・巡回移動するキャラを作る」では、イベントの実行条件を並列実行にする必要があるのでプレイヤーキャラのとの接触判定が行えないという問題がありました。また、イベント同士の接触判定を行いたいとき、ウディタにはそのような接触判定を行う機能がデフォルトでは用意されていません。そこでそれらを解決するためにイベント同士の接触判定を行うコモンを自前で作ったので、今回はそれについて書きます。
コモンイベントの仕様
- イベント1とイベント2の座標を取得し、イベント2がイベント1から見てどの位置にいるかを計算する。
- もし、イベント2がイベント1から見て上下左右のどれかに該当する位置にいるなら、隣接したと判定する。
隣接したと判定する位置は次の表の赤文字の通りです。
X→ | |||
↓Y | (-1,-1) | 上(0,-1) | (1,-1) |
左(-1,0) | Ev1の位置(0,0) | 右(1,0) | |
(-1,1) | 下(0,1) | (1,1) |
つまり、イベント1から見たイベント2の座標の、X座標とY座標を足したときの絶対値が1になれば隣接したと判定できることになります。
コモンイベントの内容
この処理はシンプルなコードで実現することができます。
■変数操作: CSelf10[接触=1] = 0 + 0 ▼ ■変数操作+: CSelf20[Ev1のX座標] = キャラ[CSelf0[EvID1]] の X座標(標準) ■変数操作+: CSelf21[Ev1のY座標] = キャラ[CSelf0[EvID1]] の Y座標(標準) ■変数操作+: CSelf22[Ev2のX座標] = キャラ[CSelf1[EvID2]] の X座標(標準) ■変数操作+: CSelf23[Ev2のY座標] = キャラ[CSelf1[EvID2]] の Y座標(標準) ▼ ■変数操作: CSelf24[座標差分X(絶対値)] 絶対値= CSelf20[Ev1のX座標] - CSelf22[Ev2のX座標] ■変数操作: CSelf25[座標差分Y(絶対値)] 絶対値= CSelf21[Ev1のY座標] - CSelf23[Ev2のY座標] ■変数操作: CSelf26[差分合計(絶対値)] 絶対値= CSelf24[座標差分X(絶対値)] + CSelf25[座標差分Y(絶対値)] ▼ ■条件分岐(変数): 【1】 CSelf26[差分合計(絶対値)] が 1 と同じ -◇分岐: 【1】 [ CSelf26[差分合計(絶対値)] が 1 と同じ ]の場合↓ |■変数操作: CSelf10[接触=1] = 1 + 0 |■ ◇分岐終了◇
このコモンの問題点
このコモンの処理方法だとイベント同士が移動中の場合、正面衝突したときは正しく判定されるのですが、横や後ろから衝突したときは上手く判定が行われないようです(片方が停止しているときは正常に判定される)。ホラーゲームやドットイートゲームでは敵が動くのが前提で、横から衝突するのはよくありそうなのでなんとかしたいところではあります。