GZDOOMHEXEN

ここでは、GZDOOMで動かすことのできるWADファイルの特徴を少し紹介します。


はじめに

2008年の終わりぐらいにDeePseaがGZDOOM形式のWADファイルに対応していることに初めて気がつきました。(^_^;)
今回はGZDOOM専用の機能を少しだけ紹介します。

GZDOOMでは、以下のようなことを行うことが可能です。
・より使いやすい立体交差
・光源の特殊効果
・3Dモデルに対応
などなど魅力的な機能が多く追加されています。
ZDOOMHEXEN.PRJと互換性があり、ZDOOMHEXEN.PRJ形式のWADファイルに上記の機能が追加された感じです。

今回は、私にとってGZDOOMの一番の魅力である、立体交差、Sectorに鏡面を付け足すLine Typeについて紹介します。

GZDOOMHEXENの導入方法

導入方法・基本事項を見て下さい。


このページで取り扱う内容

3D Floor   お手軽に立体交差を作ります。
 
Sector Reflection   Sectorの床または天井を鏡のように反射させます。

3D Floor

DOOM2.PRJやZDOOMHEXEN.PRJで立体交差の作り方をそれぞれ紹介しましたが、GZDOOMではそれらよりはるかに簡単に立体交差を作ることができます。しかもかなり自由度が高いです。立体交差と言うより、任意の場所に水平面と平行な角柱を作成することができると言った方が良いかもしれません。

では、実際に作ってみましょう。

図1 図2

図1の様に、BのSectorの高さ24〜32の部分に直方体の板(以後3DFloor)を配置します。
AのSectorの高さの情報がBのSectorに書き加えられます。

@のLineを選択し、編集画面を開きます。LineTypeを
J 3D Floors→1 sector_set3dfloor +Tag-3DType-3DFlags-Alpha-TagHi [160]
にします。

図2は南から北を見たときに見える状態を表した物です。
このように、AのSector(正確には@のLineと接するSector)の床と天井の高さ、床と天井のTextureの情報が3DFloorに影響します。
3DFloorに貼り付けたいTextureを図2を参考にしてAのSectorと@のLineで指定して下さい。
3DFloorより下の部分の明るさは、AのSectorの明るさになります。

ここで、@のLineのLineTypeのSector_Set3dFloorの引数を変更しましょう。


関数Sector_Set3dFloor(tag, type, flags, alpha, hi-tag/line ID)の説明は↓(LineTypeは160番)

説明:このLineTypeを設定したLineのSide 1側のSectorの床、天井の高さ、Textureを利用して引数tagで指定したSectorへその情報を基にした3DFloorを配置します。3DFloorの側面のTextureはこのLineTypeを使用しているLineのNormalTextureを使用します。

引数の説明は↓

引数 働き 入力する形式 補足
tag 3DFloorを出現させるSectorのLineDefTag。 integer -
type 3DFloorの状態。 integer ※1
flags 3DFloorの見た目設定。 integer ※2
alpha 3DFloorの透明度。 integer 0→完全に透明 / 255→不透明
hi-tag/line ID LineDerTagの指定またはLineIDの指定。 integer ※3

※1
typeの種類は↓

働き
0 Vavoom形式の3DFloorを作成します。この3DFloorをすり抜けることができ、
3DFloorの側面は外側のみTextureが表示され、床、天井のTextureは内側のみ表示されます。
1 固体の3DFloorを作成します。モンスターはこの3DFloorを通して物を見ることができません。
3DFloorの外側のみTextureが表示されます。
2 液体の3DFloorを作成します。Playerはこの3DFloorの中で泳ぐことができます。
モンスターはこの3DFloorを通して物を見ることができます。
3DFloorの内側、外側の両方にTextureが表示されます。
3 すり抜けられる3DFloorを作成します。モンスターはこの3DFloorを通して物を見ることができます。
3DFloorの外側のみTextureが表示されます。
4 typeにこの値を足すと、3DFloorの内側もTextureが表示されます。
8 ※3を見て下さい。
16 (未確認)typeにこの値を足すと、3DFloorを通してモンスターが物を見ることができるかという設定を入れ替えます。
32 (未確認)typeにこの値を足すと、銃弾が3DFloorを貫通できるかという設定を入れ替えます。

※2
flagsの種類は↓(設定したい項目の総和を入力して下さい。)

働き
1 3DFloorによる明るさの影響がすべて無視されます。
2 3DFloorによる明るさの影響を3DFloorの側面のみに適応します。
4 3DFloorの外側にFOG効果(霧のような物)を描写します。
8 3DFloorの天井部分のみTextureとtypeを適応します。
16 3DFloorを構成するLineのUpperTextureを3DFloorの側面に描写します。
32 3DFloorを構成するLineのLowerTextureを3DFloorの側面に描写します。
64 3DFloorの各面の画像を加法混色法を用いた半透明にします。(Textureが沢山重なるほど明るくなります。)

※3
引数hi-tag/line IDについて
引数typeに値8を足しておくと、このLineTypeを持っているLineにhi-tag/line IDで入力した値がLineIDとして代入されます。
引数typeに値8を足していなければ、3DFloorを出現させるSectorのLineDefTagの値を
(引数Tagの値) + (引数hi-tag/line IDの値) * 256
にします。


今回、それぞれの引数の値を
tag → 6 (目的地のLineDefTag)
type → 1 (固体の3DFloor)
flags → 0
alpha → 128 (半透明)
hi-tag/line ID → 0
にしました。


では、テストプレイを行ってみましょう。

無事3DFloorを作ることができました。固体なので上に乗ることもできます。

ちなみに、AのSectorの床または天井の高さをリフト等のLineTypeで変更すると、3DFloorの高さもリアルタイムでそれに調節されます。
つまり、3DFloorを使ってリフトを作ることも可能です。


この方法で作る3DFloorは、水平面と平行な物体しか作ることができませんでしたが、ZDOOMHEXEN.PRJの解説2で紹介した坂道を組み合わせることによって、斜めに傾いた3DFloorを作ることができます。

図の様に、東から西へ上昇して傾く3DFloorを作るとします。このSectorの東の端から西の端までの高さの差は8です。
AのSectorと3DFloorを作りたいSectorを図の様に傾斜方向と垂直な位置関係になるように作らないと、3DFloorの描写が少しおかしくなるので、図の様に配置して下さい。
@のLine、AのSector、3DFloorを作りたいSectorを先ほどの編集方法で編集して、3DFloorを出現させるようにします。
ZDOOMHEXEN.PRJの解説2の時のように、CのSectorを作成してから、
BのLineのLineTypeを
H Slopes, Mirror & Reflection→2 SetSlope +Floor-Ceiling [181]
にして、引数Floor、Ceilingをそれぞれ1にします。(必要に応じて2に変更して下さい。)
これでテストプレイをしてみましょう。

無事3DFloorが西から東へ傾斜しました。ちなみに、3DFloorを傾斜させると、半透明の設定が無視されます。


Sector Reflection

ZDOOMHEXEN.PRJでは壁を鏡にすることができましたが、GZDOOMHEXEN.PRJではさらに床や天井を鏡にすることができます。

実際に床と天井を鏡にしてみましょう。

注意:SectorReflectionはゲームのパフォーマンスに大きく影響します。この仕掛けをあまり多く使わないようにしましょう。

まず、鏡にしたい床または天井のSectorのLineDefTagを(仮に)7とします。

ACSを作成して、次の様に記述して下さい。


//Sector Reflection
#include "zcommon.acs"

Script 1 OPEN
{
Sector_SetPlaneReflection(7, 64, 64);
}

このように、関数Sector_SetPlaneReflectionを使用して鏡を設定します。


関数Sector_SetPlaneReflectionの一般的な形は↓

Sector_SetPlaneReflection(tag, floor, ceiling) (LineTypeは159番)

この関数は、引数tagで指定したSectorの床または天井を鏡にします。

引数は↓

引数 意味 入力する形式 補足
tag 鏡を設定したいSectorのLineDefTag。 integer -
floor 床の反射する程度。
(この値が低いと床の画像が強く描写されます。)
integer 0(全く反射しない)〜255(完全に反射)
ceiling 天井の反射する程度。
(この値が低いと天井の画像が強く描写されます。)
integer 0(全く反射しない)〜255(完全に反射)

注意:引数floorとceilingの値を低くしても(恐らく)0にしない限り、ゲームのパフォーマンスは改善されません。


今回は
tag → 7
floor → 64
ceiling → 64
にしたので、天井、床の両方ともが反射します。

テストプレイをしてみましょう。

無事床と天井が反射しています。成功です。

ちなみに、合わせ鏡をしてみると、下図のようになります。

合わせ鏡をすると無限回部屋が描写される、なんてことはないようです。

この部屋のLineをすべて鏡にして、このSectorの天井、床の反射する度合いを最大にすると、下図のようになります。

なんだか別次元にいるみたいですね。ちなみにゲームのパフォーマンスにかなり影響しました(^_^;)
この後、引数floorとceilingの値を両方とも1にしてみましたが、やはり重いです。


GZDOOMHEXEN.PRJの解説はここで終了です。GZDOOMHEXEN.PRJの解説に目を通していただき、ありがとうございました。


必要に応じて内容を追加、変更します。


Home Back