DOOM2.PRJの解説5

ここではDOOM95.exeで動かせる透明な床、立体交差の作り方などを紹介します。
注意:画像を多く使用しています。少し重たいかもしれません。


このページで紹介する項目

透明な壁
高速リフト 床の上昇
床の下降
まとめ
透明な床 作成1
作成2
原理
まとめ
透明な床の応用 透明な橋(簡易版)
水たまり
透明な橋(シングルプレイ用)+まとめ
余談

透明な壁

※注意:ZDOOMHEXEN.PRJではこのページで紹介する方法より簡単な作成方法があります。

FinalDoomのplutonia.wadの6面に出てくるような銃弾を防ぐ透明な壁を実際に作ってみましょう。

上の画像の様に5個のSectorを作ったとします。
真ん中の横に長いSectorが透明な壁になります。
LowerTextureがむき出しになっているLineにはLowerTextureを何も指定しないで下さい。
透明な壁となるSectorの高さを「床が127、天井が128」または「床が0、天井が1」にしてください。
今回は「床が127、天井が128」とします。

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

←プラズマガンを連射しても貫通しません。

画像のように透明な壁ができれば成功です。
しかし、壁の反対側のモンスターが銃声に気付いてしまっています。防音の透明な壁を作ってみましょう。

さきほどのMAP構造を表した画像の暗い赤色のLineをすべて選択します。
Lineの編集画面を開いてBlockSoundにチェックを入れて下さい。
(音を消すLineは2本以上ないと銃声が通ってしまうことに注意して下さい)

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

←モンスターが銃声に気付いていません。

モンスターが銃声に気付いていません。成功です。


知っているととても便利な透明な壁ですが、問題点が少しあります。

今回は、透明な壁となるSectorは「まわりの天井よりちょっとだけ床が低いSector」としましたが、プレイヤーの視点が透明な壁のSectorの床の高さより高くなると、例の画像のように、壁の描写がおかしくなります。
逆に、「まわりの床よりちょっとだけ天井が高いSector」では、視点がその天井より低くなると、壁の描写がおかしくなります。
視点がこのような位置に来ないようにMAPを作りましょう。

↓例


ちなみに、最初の画像でMAP構造を紹介しましたが、透明な壁となるSectorの左右に2個の小さなSectorがあります。
これらを消去して透明な壁となるSectorと部屋の壁を直結すると、描写がおかしくなります。

←画像描写がおかしくなります。


長所:銃弾を防げる透明な壁を作ることができる。
短所:高低差が激しいMAPでは不向き


高速リフト

※注意:ZDOOMHEXEN.PRJではこのページで紹介する方法より簡単な作成方法があります。

DOOM2.RPJでは、一瞬である高さからある高さへ床を上下させることができます。

床の上昇

まず、一瞬で目的地まで上昇する床を作ってみましょう。

画像のように、3個のSectorを作ります。
CのLineには何もTextureを指定しないでください。

CのLineの編集画面を開いて、Typeを9 Floor Lower→1 WR FloorLower to Highest adjacent floor [83]にします。
床が上昇するのに下降するLineTypeを選びましたが、気にせず先に進めて下さい。

CのLineのSectorTagとAのSectorのLineDefTagを同じにします。

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

右の画像の地点にさしかかったあたりで床が急上昇すれば成功です。

このような現象が起こる理由は恐らく以下のためだと思われます。
先ほど指定したLineTypeの意味は「隣接するSectorで最も高い床まで指定した床を下降させる」です。
今回、下降させる床がAのSectorで、隣接する最も床が高いSectorはBのSectorです。
しかし、Aの床の高さは既にBの床の高さより低く、床を上昇させなければならないので、処理がおかしくなってこのような現象が起こると思われます。

床の下降

次に、一瞬で目的地まで下降する床を作ってみましょう。先ほど使用した例に仕掛けを付け足します。


↑@のSectorの床の高さとEのSectorの天井の高さは同じにしましょう。

@〜Cは先ほどと同じで、Cは今回は使いません。

原理的には床の上昇と同じですが、「隣接するSectorで最も低い床まで指定した床を上昇させる」というLineTypeが存在しないため、少し工夫が必要です。今回、代わりに用いるLineTypeは「隣接するSectorで最も低い天井まで指定した床を上昇させる」です。
つまり、天井の高さが0であるSectorがAのSectorに隣接していれば良いのですが、今回は解説4でも使用したSectorの共有を使ってみましょう。

AのSectorのSector番号を調べます。(Sector編集画面でAのSectorを選択すると調べることができます。)
次に、FのSectorを構成している4本のLineを選択し、編集画面を開きます。
Side1側の編集画面でSector番号を先ほどのAの番号に変えましょう。
これで、AとFのSectorは同じSectorになりました。(床の高さ等のSectorの情報はAのSectorの情報になります。)

先ほどの動作によって、AのSectorに隣接する天井が最も低いSectorはEのSectorになりました。
あとは床の上昇の時と同様に作業を行います。

DのSectorのLineTypeを7 Floor RaiseCeiling→1 WR RaiseFloor to Lowest adjacent Ceiling [91]にして、SectorTagをAのSectorのLineDefTagと同じにします。

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

右の画像の地点にさしかかったあたりで床が急降下すれば成功です。

まとめ

まとめです。

高速リフトの作り方
・AとFのSectorを同じSectorにする。(FのSectorをAのSectorにします。)
・DのLineのLineTypeを7 Floor RaiseCeiling→1 WR RaiseFloor to Lowest adjacent Ceiling [91]にする。(床の下降)
・CのLineのLineTypeを9 Floor Lower→1 WR FloorLower to Highest adjacent floor [83]にする。(床の上昇)
・必要に応じてLowerTextureを付け足す。


透明な床

※注意:ZDOOMHEXEN.PRJではこのページで紹介する方法より簡単な作成方法があります。

解説3で閉じていないSectorの直し方を紹介したのを覚えていますか?
Sectorが完全に閉じていないと、そのSectorの境界線がわからないため、そのSectorの床や天井の描写が正しく行われません。
解説3では、閉じていないSectorの直し方を紹介しましたが、今回は逆に閉じていないSectorを故意に作ることで透明な床を作ります。


↑Sectorを閉じていないとこんなことになってしまいます・・・

作成1

まず、原理は考えずに実際に作成してみましょう。


※注意:Sector番号はLineDefTagではありません。
※天井の高さはすべて128です。

広い部屋の中に上の画像のような2個のSectorがあるとします。
@のSector(外側)を作った後にAのSector(内側)を作って下さい。
上の画像のAのSectorを閉じていないSectorにします。
(閉じていないSectorを作成すると、閉じていないSectorに隣接するSectorにも影響が及ぼされるので、@のSectorでAのSectorを区切っています。)

AのSectorを構成している4本のLine(黄色いLine)を選択して、編集画面を開きます。

編集画面

上の画像の様に、AのSectorを構成しているLineが@のSectorと接しているSide側の編集画面に切り替えます。
ここで、そのLineのSector番号を29(AのSector番号)から30(@のSector番号)に変更します。

Sector編集画面で各Sectorを選択したときに上の画像の様になれば成功です。


上の図のようにアイテムを配置しました。ではテストプレイをしてみましょう。

左の画像:レッドキーも何故か浮いています。
右の画像:プレイヤーも乗ることができます。

配置したアイテムが高さ32の空中で浮遊していることがわかります。
このサイトではこれを透明の橋(床、台など)と呼びます。
実際は床の高さが32で、@とAのSectorの両方の領域を占める透明な台になります。
その他の特徴として、プレイヤーが台の境界線ぎりぎりまで体を押しつけることができます。
それら以外は通常のSectorと変わりません。(プレイヤーが台の上に乗ることもできます。)

作成2

さきほど、@とAのSectorの作る順番を指定しましたが、次にAのSector(内側)を作った後に@のSector(外側)を作って下さい。

先ほどと同様に、AのSectorを閉じていないSectorにします。
同じ方法で閉じていないSectorを作って下さい。テストプレイをしてみると・・・

左の画像:レッドキーは浮いていません。
右の画像:ブルーキーのあるSectorのみ台になります。

今度はAのSectorのみ透明な台になりました。このことから、Sectorを作る順番によって透明な台の範囲が変わることがわかります。


原理

一般的に、次の様な事が成り立つと思われます。

2個のSectorがドーナツ型に配置されていて、真ん中のSectorを閉じていないSectorにするとします。
内側のSectorを構成しているLineのLine番号が外側のSectorのLineのLine番号より大きいとき、内側のSectorの高さで、2個のSectorの領域を占める透明な台ができます。

逆に、外側のSectorを構成しているLineのLine番号が内側のSectorのLineのLine番号より大きいとき、内側のSectorの高さで、内側のSectorの領域を占める透明な台ができます。

外側のSectorを作ってから内側のSectorを作ると、内側のSectorを構成しているLineのLine番号が外側より大きくなるため、前者のような透明な台ができます。内側のSectorを作ってから外側のSectorを作ると、逆に後者のような透明な台ができます。

今後、特に断りが無い限り、透明な橋を作るとき、外側のSectorを作ってから内側のSectorを作る方法を使用します。


まとめ

まとめです。

@のSectorを作ってからAのSectorを作る。
・AのSector番号を調べる。
・AのSectorを構成しているLineを選択し、@のSectorと面しているSide側の編集画面を開き、Sector番号をAのSector番号に書き換える。
・AのSectorの床の高さ(透明な台の高さ)を入力する。

これらの閉じていないSectorの性質を応用して、実際に仕掛けを作ってみましょう。


透明な床の応用

透明な橋(簡易版)

FinalDoomのplutonia.wadの2面に出てくるような透明な橋を作ってみましょう。
今回は下図のようなMAPを作りました。

左の図:MAP構造
右の図:閉じていないSectorを作成する前のMAPの状態

上図の真ん中のSectorを閉じていないSectorにしてください。閉じていないSectorの床の高さはプレイヤーが立っている足場と同じ高さにしてください。
(注意:外側のSector(上図の2番目に小さなSector)を作った後に閉じていないSectorとなるSectorを作って下さい。)

作り終わったらテストプレイをしてみましょう。

画像の様に透明な橋ができれば成功です。

短所:透明な台があるだけなので透明な橋の下をくぐることができない。


水たまり

FinalDoomのplutonia.wadの28面に出てくるような水たまりを作ってみましょう。

左の図:MAP構造
右の図:閉じていないSectorを作成する前のMAPの状態

上図の真ん中のSectorを閉じていないSectorにしてください。閉じていないSectorの床の高さは水たまりのSector(8角形のSector)の床の高さより16低い高さにしてください。
(注意:外側のSector(8角形のSector)を作った後に閉じていないSectorとなる真ん中のSectorを作って下さい。)

作り終わったらテストプレイをしてみましょう。

↑両方の画像とも判別しにくいですが沈んでいます。

画像の様にプレイヤーが少し下に沈めば成功です。

※注意
プレイヤーの視点が水面より低くなると描写が正しく行われません。深さはできるだけ小さくしましょう。


↑閉じていないSectorの高さ(プレイヤーが沈む深さ)が低すぎると・・・

短所:水面より視点が低くなると画面描写が正しく行われなくなる。
短所:水たまりにThingが沈んでいてもそのThingの全体の姿が描写されるため、かなり不自然な描写になる。


透明な橋(シングルプレイ用)

透明な橋(簡易版)では橋の下をくぐることができませんでしたが、高速リフトと組み合わせることによって橋の下を(擬似的に)くぐることができる透明な橋を作ることができます。実際に作ってみましょう。(少し複雑です。)

左の図:MAP構造(@のSectorが2個あることに注意して下さい。)
右の図:閉じていないSectorを作成する前のMAPの状態

左の画像の様にMAPを作ったとします。

プレイヤーがBのLineをまたいだ瞬間に真ん中の透明な台が上昇し、プレイヤーがCのLineをまたいだ瞬間に真ん中の透明な台が下降する仕掛けです。つまり、マルチプレイ時には不都合が生じるため、シングルプレイ専用です。


Dの柵はプレイヤーが橋から落ちないための物であり、プレイヤーが橋から落ちない限りどのようなデザインでも影響ありません。

今回は@のSectorを閉じていないSectorにします。今回もAのSectorを作った後に@のSectorを作るので、透明な橋は@とAのSectorの両方の領域を占めます。また、@のSectorを上下させることで、透明な台(橋)も同様に上下します。

まず、橋の下降について考えてみましょう。
CのLineのLineTypeを7 Floor RaiseCeiling→1 WR RaiseFloor to Lowest adjacent Ceiling [91]にします。
SectorTagを@のSectorのLineDefTagと同じにします。
高速リフトと同様にEのSectorを作ります。

次に、橋の上昇にについて考えてみましょう。
BのLineのLinTypeを9 Floor Lower→1 WR FloorLower to Highest adjacent floor [83]にします。
しかし、@のSectorはAのSectorに接していないため(※)、FのSectorを橋の下降と同様に、@のSectorと連結させます。
※:@のSectorを構成する4本のLineのSide2側のSector番号は@のSector番号であるため

また、橋の中にはプレイヤー以外のThing(モンスター等)が入れないような仕掛けにしてください。
(橋を作るLineにMonsterBlockのチェックを入れるなど)

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

左の画像:橋を渡っています。
右の画像:その後橋をくぐっています。

画像の様になれば成功です。

橋となるSectorの中に何かThingを置いてみましょう。
すると、下の画像のようになります。


橋を渡ろうとすると

その後橋をくぐろうとすると

これらの画像のように、透明な台が上下しているだけということがわかります。また、マルチプレイにも不向きであることもわかります。
また、プレイヤー以外のThingを橋の中に入れてはいけないこともわかります。


まとめ

透明な橋(シングルプレイ用)のまとめです。

・@〜F+αを作成する。(透明な台の作る順序と、EとFのSectorと@のSectorの連結に注意)
・BのLineのLinTypeを1 WR FloorLower to Highest adjacent floor [83]にする。
・CのLineのLineTypeを1 WR RaiseFloor to Lowest adjacent Ceiling [91]にする。
・BとCのSectorTagと@のLineDefTagを同じにする。
・橋の中にプレイヤー以外のThingが入れないようにする。

長所:透明な橋(簡易版)と違って、橋の下をくぐることができる。
短所:橋の中にモンスター等のThingを入れると不自然になる。


余談(勝手な解釈なので本当かはわかりません。)
Line番号の違いによる透明な床の範囲の変化が起こる原因は、恐らく閉じていないSectorを構成するLineとその周りのSectorを構成するLineのLine番号の違いだと思われます。
ここで、DOOM95.exeやZDOOM.exeなどがMAPを読み込むときにLine番号の低いLineから読み込んでいく物と思われます。
先ほどの2通りの作り方だと、各作り方において、後に作られたSectorを構成するLineの方がLine番号が大きくなります。
また、LineはSectorの情報を取り扱うので、ゲームがLineを読み込んだ時点でSectorも同時に読み込まれていると思われます。


次に、解説6に進んで下さい。


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


Home Back