マップと奥行き

マップと奥行き


ZGEでは描画機能のページで説明した通り、
マップ描画も ID 番号に関係して表示順が変わる為、
別のマップを用意して屋根のような高い位置にあるものを表現する事ができます。



▼ID5番のマップ


▼ID9番のマップ


また、RPG制作ツールのように特定のチップを配置すると、
周囲に自動で関連したチップを配置してくれる機能もあります。
詳細はマニュアルの『4-19マップ編集画面』にて確認してください。
(説明にあるような形で画像を用意した上で範囲指定をすると良いようです)

作成したマップに関しては、
1度シーン選択画面に戻ってから素材として指定しないと、
そのシーンで使用する事ができませんが
すでにマップを制作する予定があるなら、
シーンファイル選択画面のMAPファイル指定で
手入力により保存予定の名前のファイル名をあらかじめ指定しておき、
シーンを開いたらマップ編集画面にて適当なマップを指定したファイル名で保存しておくと、
シーン選択画面に戻らなくて済むので便利です。
(※ファイルを作らず実行するとエラーで強制終了するので注意してください)

ちなみに指定できるマップ数ですが、
マニュアル内にとくに記載されていないのでとくに制限は無いようです。


マップチップに関して

1つのマップで扱えるチップのサイズは
・16×16
・32×32
・64×64
以上の3つの中の1つとなります。

注意してほしいのは、
マップチップのサイズに指定した大きさのチップを255個までしか指定できないと言う事です。
(※ID0の左上は常に透過チップになるので使用できません)
IDは左上から順に右に向かって割り振られる為、
どれだけ大きな画像を用意しても、
ID255以上より先にある画像は選択する事もできません。

階乗サイズで例えるなら、
・16×16=256×256ドット
・32×32=512×512ドット
・64×64=1024×1024ドット
以上のような画像サイズが丁度良い大きさとなります。

つまり512×512の大きさで用意した場合、
チップサイズを16×16にすると、
上部256×256の大きさまでしかチップが選択できない事になります。
(設定で指定範囲の横幅などは変更できますがチップID255以降は選択できません)


例えば上記の画像は32×32ドットのチップならすべて選択可能ですが、
16×16ドットだと水色の範囲外はチップとして指定できません。



衝突判定

マップチップとの衝突判定はチップ単位か斜めの衝突だけとなるので、
場合によってはもう少し小さい判定にしたいと思う事もあるかもしれません。

例えば32×32で指定した場合、
下図のようにこれ以上は左に行けない状態となり、
いま一つ見栄えが悪い感じになってしまいます。


ですが、ZGEでは衝突判定はキャラクター側で実行する為、
別途16×16サイズのチップのマップを作成し、
そのマップと衝突判定をさせる事である程度ですが解消できます。


この判定用のマップは
キャラクターチップ描画イベントで『描画しない』を選択すれば描画されません。


さらに複雑に判定をしたいなら、
キャラクターイベントを使うという手もあります。



高い所に登るマップ

マップ描画とキャラクター描画の描画順をうまく分ける事で、
屋根のような上に重なるチップを表現する事は最初に説明しましたが、
屋根の上に乗ると言った、
上に重なるマップチップの上に描画するようにして、
上に乗っているように見せる事もできます。



再現する方法はとても簡単で、
上に重なるマップチップ描画イベントより大きいID番号にキャラクター描画イベントを作成し、
関数 let を使って必要なタイミングで変数 dLayer に、
描画イベントのレイヤー番号(※ID番号ではありません)を代入するだけです。



▼スクリプト記述例
let dLayer  0 0

下に降りる場合には元のレイヤー番号に戻しましょう。



奥行き

上に重なるマップチップの上に表示する方法を説明しましたが、
建物の影のようなものに関しては、
キャラクターの位置により影のかからない場所、
つまりは奥行が必要になってきます。



こういった処理に関してはマップチップ描画イベントは不向きな為、
キャラクター描画イベント(Z座標オーダー)を使って表現するのがお勧めです。

まずはキャラクター描画イベントを通常のものから『Z座標オーダー』と表記されているものに変更します。
イベントを作り直すのでレイヤー番号が同じになるようにし、
スクリプトを実行しているようでしたらスクリプトも再指定するのを忘れないでください。

そして、家の影となるキャラクターイベントを同じレイヤーに描画し、
下記のようなスクリプトを実行しましょう。

0 let cZnpos cYnpos 0 0
1 add(+) cZnpos i0 0 

※i0 はキャラクターの画像の縦幅を代入するようにしてください。
※初期変数を使って縦幅をあらかじめ入力しておくと障害物となるキャラクター共通で同じスクリプトを実行できます。

実行すると以下のような感じで、
影の手前にいる時には影の下にならないようになります。



Z座標オーダーと言うのは、
同じ描画イベントで描画しているキャラクターイベントの
cZnpos の値が大きいイベントを上に描画すると言うもので、
キャラクターの画像の一番下を基準に座標をZ座標に代入する事で、
同じ描画イベント内の描画順をコントロールできるようになります。

Y座標オーダーと言うものもありますが、
こちらはキャラクターの衝突判定(Y2)から計算される為、
場合によっては融通が利かなくなる事が考えられるので、
汎用性のあるZ座標をお勧めします。



ちなみにですが、Z座標は描画イベントにある『3D奥行き処理』でとくに効果を発揮するので、
興味のある人は入力補助などで関連した関数を探してみたり、
公式のBBS等にあるサンプルを確認してみてください。
(具体的なサンプルはありませんが一部Z座標と奥行き処理を使ったものがあったと思います)
この機能を使う事で、
以下のような場面でも、


下図のようにきちんと対処できるようになるはずです。



このような上から見下ろしタイプの画面(トップビュー)で、
ジャンプをするものを作りたい場合、
とくに効果を発揮すると思います。

この方法でマップチップを再現する場合、
衝突判定は関数 hit_evt_act で指定する形でも良いかと思います。



隠れたら透ける処理



描画イベントやマップチップ描画イベントを重ねる事で、
表示順を変えて見せ方を変更する説明をしましたが、
応用すると上の図のように建物に隠れてしまうキャラクターを半透明で見せる事もできます。
これはキャラクターより上に重なるマップチップイベントの透明度を操作し、
さらにキャラクターイベントよりも下に同じマップチップイベントを描画するだけで再現可能です。

ZGEの描画イベントやマップチップ描画イベントは、
他のイベントから透明度を指定する事ができるので、
キャラクターイベントのすぐ下に重なるマップチップ描画イベントと同じものを作り、
上に重なる方の透明度を下げます。



上図のような場合だと、
キャラクターの上に重なって描画される ID 11番のマップチップ描画イベントを、
キャラクターイベントよりも小さい ID 7番にコピーし、
ID 11番のマップチップ描画イベントの透過率を指定したいタイミングで、
下記のようなスクリプトを実行します。

let dBlend  50 11

(※描画イベントが実行するスクリプトなら因数4の11は0となります)

こうして、マップチップ描画イベントの dBlend の値を、
透過させたい値にするだけで完成です。
元に戻したい場合は dBlend の値を100にすれば戻るので、
もちろんゲーム中の設定で任意に変更すると言う事もできます。

上手で言うと7番のコピーしたマップチップ描画イベントに関しては、
マップチップ描画が複数あると重くなる可能性があるので、
気になる人は必要でない時に7番の描画イベントを sleep 状態にし、
必要な時にだけ active にと良いです。

複数のマップチップ描画イベントが重なっている場合に、
dBlend の値を操作して透過させると、
重なっている部分も透過して描画されてしまうので注意してください。
この方法を使いたい場合は、
基本的にマップは描画イベントが違っていても、
あまりチップ同士が重ならないようにするのがコツです。




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