坂衝突判定

坂衝突判定


ZGEではマップチップで坂衝突判定を行う事ができますが、
基本的に横画面で使う事を前提に用意されています。
その為、トップビュー(上から見下ろした画面)での衝突はうまくできません。

また、判定も『斜面〜平地』『平地〜斜面』『斜面〜斜面』での判定を想定しているらしく、
それ以外の判定はうまく再現できない場面もあります。

例えば以下の図のような配置の場合、
カドとなる部分の判定を想定しているような形で行う事ができません。



配置方法等にも決められた法則があるので、
ここでは上記の配置に対する簡易的な対処方法なども含め紹介したいと思います。


ちなみに、下からジャンプして乗れるような斜面は、
斜面や斜面の頂上となるチップの補正の処理(重なった時に上または下に強制的に補正してしまう)の関係上、
チップを使わずに再現するので難しいです。

(斜面でなければ可能です)


坂衝突判定の方法

map_hit_act(maphit_act2) の因数3と4(チップID指定)を0にすると、
マップチップ選択ウィンドウで指定した当たり判定を使う事ができます。

ただし、傾斜の判定は基本的に矩形との衝突ではなく、
キャラクターの中心座標で行われる関係上、
キャラクター編集画面で中心座標を設定しておく必要があるので注意してください。


マップチップの当たり判定は、
マップ編集画面を開いた時に表示されるマップチップ選択画面にて行います。

『あたり判定』のチェックボックスにチェックを入れると、
右側に当たり判定を指定するボタンが表示され、
指定した当たり判定がマップチップ上に表示されます。


当たり判定を指定したいマップチップをクリックし、
当たり判定のボタンを押すとそのチップに当たり判定が設定されます。


右クリックを押したまま範囲を選択した後、
斜めの当たり判定を指定した場合、
その範囲で角度を指定する事が可能です。



ただし、このまま坂のチップを並べただけでは坂衝突判定は行えません。
坂衝突判定をするにはマップチップの配置方法に少し癖があるので、
次のマップチップの配置方法を参考にしてマップチップを配置してください。



坂衝突判定をする為のチップ配置

坂衝突判定は斜面のチップを並べるだけでは斜面として登る事ができません。
例えば下のように設置すると隙間から落ちてしまいます。



また、以下の図のように間を矩形判定のチップで埋めても、
矩形の端に衝突してしまい途中で登れなくなります。



この状態を解消するには、
坂の上の為に作られた専用の衝突判定を持つチップを作る必要があります。


(逆の形になっているのは天井用のものです)

坂の上用の判定を持つチップを設定したら、
以下の図のように坂道の隣に坂の上の判定を持つチップを並べると、
坂道として登る事ができるようになります。

※坂の上の判定が設置されていれば中を矩形判定で敷き詰める必要はありません。

2つのチップで坂を再現する場合には、
下の図のように坂の上用のチップを並べるようにしましょう。


map_hit_act で衝突判定をしている場合、
重力要素の加算値や斜面の傾斜によっては坂を降りる時に重力が足りず、
降りている時に空中に浮いてしまい、
落下と着地を繰り返してしまう事もあると思いますが、
その場合はマップチップに衝突した時に、
重力要素の最大値くらいの値(実際に動かしてみて丁度良い値を見つけてください)を cYadd に代入するようにします。

そのままだとマップチップの上に乗った時以外に処理すると横からぶつかった時に急降下する事もあるので、
ビットフラグと関数 get_and を使ってキャラクターの下方向に衝突した時のみ cYadd に値を代入するようにするようにしましょう。

例)
0 add_lim cYadd  0.5 8
1 yoko_move 3.3  3.3 
3 char_move        
5 maphit_act2 8 b0 0 0
6 get_and b0 b0 4 
7 then b0 8 9  
8 let cYadd  8 0
9 break
※落下速度や傾斜によっては cYadd に代入の必要が無い場合もあります。



hit_evt_act と hitevt_avt2 の違い

スクリプトデータ編集画面などにある関数の説明でも確認はできますが、
map_hit_act と maphit_act2 の2つの大きな違いは、
指定したマップチップと衝突した時の移動速度の補正になります。

例えば下図のようにキャラクターがジャンプして下から壁にぶつかったとします。



この時、map_hit_act は Y座標の移動速度である cYadd を補正し落下しますが、
maphit_act2 は移動速度を補正しないのでジャンプの移動速度が0以上になるまで落下が開始されません。

逆に、上に乗った場合、
map_hit_act だと補正されるので下に降りると重力にひっぱられるように段々と加速する形になりますが、
maphit_act2 では補正されないので重力の最大値の状態が保持されている為そのまま急降下します。

▼hit_evt_act


▼hitevt_act2


この現象は斜面を降りる場合にも言えます。



垂直の壁と斜面の配置

冒頭でも説明した通り、
垂直の壁の上に斜面があるようなチップの配置は、
坂の頂上となるチップを配置しなければならない都合上どうしても難しい所があります。

そこで、その場しのぎのような形になりますが、
角となる部分に通常の矩形判定を配置する形で対処します。

例えば下図のような場合、


角となる部分に矩形判定のチップを配置します。


見栄えが悪くなる事もあるかもしれませんが、
このような形で対処するのが1番簡単な方法です。
上り坂の場合は斜面の先には頂上用のチップを必要とするので、
頂上用のチップを配置した隣に矩形判定のチップを配置する必要があります。
その為、チップを2つ配置するような形になります。


例えば下図のような感じです。




… 坂の頂点判定
… 坂の頂点判定(下)
… 矩形判定



天井(坂)との判定

坂になっている天井に向かって移動しながらジャンプした時、
天井にぶつかった時に方向入力をしたままだと天井にくっついたような状態で移動してしまいます。


これはマップチップとの衝突方向から移動速度を変更する事で回避可能です。

例えばマップチップと衝突した時、
そのビットフラグを get_and の計算で上方向かどうか判断させ、
上方向なら cYadd に1を代入し、
強制的に落下を開始させる形にします。
(※1以下だと症状が回避できません)

0 map_hit_act 0 b1 0 0
1 get_and b1 b1 1 
2 then b1 3 4  
3 let cYadd  1 0




パーティクルでマップチップと衝突判定

パーティクルでマップチップに設定した当たり判定と衝突判定を行いたい場合は、
『移動計算方法』に『(マップ衝突)』と表記されているものを選び、
『原点同期イベント』で判定をしたいマップチップ描画イベントを指定し、
『マップ衝突設定』の『判定対象のマップチップID』指定を0〜0にします。


v2.6.3では移動計算方法でスクリプト実行を選んだ場合、
スクリプト中で maphit_act2 (チップID0〜0)を実行しても斜面の判定はされないようなので、
スクリプトを実行するパーティクルで坂衝突判定をしたい場合は、
map_hit_slp や maphit_act2_slp を使って個別に判定をする必要があります。



▲フレームが表示されない人はクリック