マップ講座1

Last-modified: 2014-12-29 (月) 10:39:18
  • マップ制作についてEditorの使い方+レベルデザイン方法論を記載します
  • スクリプト初心者でも製作できるように手順やファイル名を省略せず記載しています

練習マップを作る

まずは簡単な練習マップを作ってひと通りの機能に習熟しましょう
それぞれの手順や見本の画像に従ってマップを制作してください
この講座を終える頃には短いダンジョンを完成させられるようになるでしょう

  • スタート地点を置こう
    まずScriptのLevelStartを置いてIDを0にするとスタート地点になるので
    さっそく画面の中央に置いて行きましょう
  • 次に壁を置いていきます
    右のDoodadsタグを選び doodads/theme_a/a_h16.xml を選択して右クリックしましょう
    幅2キャラ分程度の壁が置けたと思います、続けて2~3個置いてみましょう
    ※doodas/theme_a はステージ1の壁パーツ、a_h16はHorizontalの16ドットと言う意味です
  • テストプレイしましょう
    上欄の File の Save を選択してデータを保存した後で
    ToolsからRunGameを選択するとゲームが始まります
    自由に歩き回れる一方で壁に体が当たると思います
    そう、HammerWatchのマップは「どこを通れるか」を決めるのではなく
    マップにパーツを置いて「どこが通れないか」を決める作りなのです
    そのため穴の縁にはちゃんと止め石を置かないと普通に穴を渡れてしまいます

28904530b64220c01b1ab0a67af2c3ac.png

  • 床を塗りましょう
    Tilemap を選択して左クリックで床を塗れます。そして右クリックで消せます
    床は全て別々の層になっています。Tilemap/a_default.xml を選択しているときは
    Tilemap/a_default.xml の層だけを消したり塗ったりできます
    その上に Tilemap/a_scattered.xml が塗ってあっても一切影響を与えられません
    各タイルの左にあるチェックボックスをクリックすることで表示のON/OFFができます
    とりあえず壁の周りを塗りましょう
  • 壁をコピーして拡大しましょう
    もう気付いているかもしれませんが壁は左ドラックでまとめて選択して動かしたり
    Ctrl+C や Ctrl+V でコピー&ペーストできます
    ※このとき右のDoodadsタグを選択している必要があります
    選択しているタグと同系統のものだけ選択できるようになっています
  • 敵を置きましょう
    右の Characers タグの actors/bat_1 を選択して画面を右クリックしましょう
    コウモリが置けたと思いますので続けて5匹ほど、スタート地点から少し離した所に置きましょう
    ちなみに bat_2 の方が bat_1 より強く、同種の敵はファイル名の数字が大きいほど強くなるようです
  • お金とリンゴと箱を置きましょう
    右の Items タグの一番下にある items/valuable_3.xmlを選択して右クリックしましょう
    お金が置けたはずなので、何個か置いてみましょう
    続けて同タグ内にある items/health.xml と items/breakable_crate.xml を置きましょう
    このように敵以外の触れるものは殆どItemsに入っています
  • 2回目のテストプレイ
    敵と戦って、箱を壊し、お金を取り、リンゴを食べましょう。
    だいぶゲームらしくなってきたのではないでしょうか

4b7a46055349d4b1034224e206a20da3.png

  • 扉を作り鍵を置きましょう
    items/door_a_bronze_v2.xml を置いたあとで
    その右をitems/door_a_bronze_h_cap_r.xml を
    左には items/door_a_bronze_h_cap_l.xml を置きましょう
    おそらく上手く置けないと思うので Tools の Grid Size を2/1にしましょう
    そうすることで今までより細かく物を動かすことができるようになります
    扉が置けたら Items/key_bronze.xml を選択して右クリックで置きましょう
    (GridSizeは1に戻しておきましょう)
  • 3回目のテストプレイ
    鍵を拾って扉を開けましょう

d00b03ab08c72ec9e96d93706eb49121.png

  • ゲームエンドを作りましょう
  • まず当たり判定となるShapeを設置します
    Scripting タグの RectangleShape を選択し右クリックで設置します
    次に AreaTrigger と GameEnd を設置します
    GameEndが爆薬だとすると、AreaTriggerは点火機構で
    Shapeは点火機構の表面に取り付けられたボタンのようなものです
    ※実は Shape は Script ではなく単なるエリア指定です
    Shape が Script タブ内にあるのはまとめて動かす時の利便性のためだと思われます。
  • AreaTrigger に RectangleShape を取り付けます
    AreaTrigger を選択すると画面右下にスクリプト詳細が出てきます
    その中の Shape をクリックすると Shape 選択モードになるので
    RectangleShape を左クリックして Shape 連結しましょう
    これで AreaTrigger は Shape を利用できるようになりました
    ESCキーを押して Shape 選択モードから出ましょう
    (Shape解除はCtrlキーを押したままクリックです)

図1:シェイプ選択モード中は青枠が出る
e1f52d381d053c626c290d307d2bfcc6.png

  • AreaTrigger と GameEnd を連結します
    スクリプト同士の連結は影響を与える側を選択したあと
    影響を受ける側を Ctrl+Alt を押したまま左クリックすることです
    まず AreaTrigger を選択し Ctrl+Alt を押したまま GameEnd を左クリックしましょう
    (解除するときも同じ方法で解除できます)

図2:AreaTrigger から伸びる矢印の向きと色に注意
f384cfa532032674efe44d6010ca32ed.png

  • 4回目のテストプレイ
    RectangleShape を踏んでみましょう、ゲームクリア画面が出れば成功です
    おめでとうございます、貴方は HammerWatch マップ製作に
    必要な技術をひと通り習得しました
    ここまでの技術だけでも十分面白いゲームを完成させることが出来ますが
    スクリプト講座では更にゲームを盛り上げるための要素を解説します
  • 装飾をしよう
    Tilemap タグの tilemaps/a_default.xml や a_scatterd.xml を塗りましょう
    doodads/generic/lamp_torch.xml のトーチを置いて下さい
    Doodads タグの検索欄に torch と入れると探しやすいでしょう
    Lighting タグを選択し、torchのある場所を右クリックして明かりを置きましょう
    そして doodads/generic/vgt_ivy_1.xml のツタを壁に這わせたり
    doodads/generic/deco_chains_1.xml の鎖を壁に設置したり
    doodads/theame_a/a_crn_l_dn.xml の壁のコーナーや
    doodads/theame_a/a_h_cap_r.xml の壁の行き止まりを使って部屋を自然にしましょう

bfa5c30ac6aa6d197d3eba7081b061c5.png

  • 装飾の順序はとても大切です。まず壁と床、次に光、最後に飾りです
    床や壁の無い状態で光を置いたり、光の無い状態で部屋を飾ると
    イメージが大きく変わってしまうので注意しましょう

レベルフォルダの作成

  • レベルを本格的に作る場合は複数のレベルを保管するフォルダと
    設定ファイルが必要になります
  • Program Files (x86)\Steam\steamapps\common\Hammerwatch\editor に
    好きな名前のフォルダを作成したあと、その中に levels フォルダを作りましょう
    そして levels フォルダの中に test.xml という名前のマップを保存して下さい
    ※この場所以外に保存した場合 Editor からの直接機動ができず Failed to と表示されます
  • テキストファイルで以下の文章を入力して info.xml として保存します
    これは情報ファイルで name はキャンペーン名 lives は残基数です

    <info>

    <name>Script test level</name>

    <description></description>

    <lives>10</lives>

    </info>

  • テキストファイルで以下の文章を入力して levels.xml として保存します
    levels start が開始レベル act name は章の名前で
    level id が各レベルの固有ID res はそのファイルがあるフォルダとファイル名で
    さきほど製作した test.xml を示しています name は表示名ですので適当につけて下さい

    <levels start="1">

    <act name="lvl.act1">

    <level id="1" res="levels/test.xml" name="TestMap" />

    </act>

    </levels>

  • これは各レベルの繋がりを表すもので、ここの level id を
    LevelExitArea などのスクリプトで使用しますので
    このファイルが無いとレベル内外を問わず階段などが一切作れません
    1つのキャンペーンは複数の act の中に複数の level が存在するという形になります
    下図は拡張例です

    <levels start="1">

    <act name="lvl.act1">

    <level id="1" res="levels/test1.xml" name="TestMap1" />

    <level id="2" res="levels/test2.xml" name="TestMap2" />

    </act>

    <act name="lvl.act2">

    <level id="3" res="levels/test3.xml" name="TestMap3" />

    <level id="4" res="levels/test4.xml" name="TestMap4" />

    <level id="5" res="levels/test5.xml" name="TestMap5" />

    </act>

    </levels>

更に詳しい情報はマップのファイル構造
C:\Program Files (x86)\Steam\steamapps\common\Hammerwatch\editor\example を
参考にして下さい

仕様の解説

マップを作る時のTips

  • Editor の Show > Zoom > 64 が実寸です
    遠くから見ているとつい大きな部屋を作ってしまいがちですが
    ゲームプレイにそこまで広い部屋は必要ありません
  • 数字キーでグリッドサイズを変更できます
    4キーの1ブロックと3キーの半ブロックはよく使うので覚えましょう
  • Tools > Play as からテスト用キャラを変更できます
    他のキャラクターも試してみましょう
  • F1キーを押すと Show Physics が有効になり
    壁やアイテム等の衝突判定が見えるようになります

お金アイテムの実値・宝箱の中身

      
銅貨1510青ダイヤ50250
銀貨31325赤ダイヤ100500
金貨52742

宝箱の中身

d3ebfb7b5bfc30f156da05be99b9f07d.pnge474a8bc8a9e53c36611ed140a271920.png

検索Tips

  • Doodads タグで検索するとき
    • a_と入力するとACT1のパーツが出てくる、b_だとACT2
    • 金網は fence で出てきます
    • Torch で松明が、ivy でツタが、glass で隠れ足場が、collisionで透明な壁が出てくる
      頻繁に使うものなのに普通に探すのが難しいパーツなので覚えてしまおう
    • vendor で商人達や装飾が、combo など店名を入力すると商人と看板が出てくる
    • bridge で橋が出てくる、木以外に石の橋もあるので見てみよう
    • deco 壁や床の装飾が出てくる
    • maker で血やマーク等のプレイヤーへのヒント用パーツが出てくる
    • trigger でボタンやルーンが出てくる

Lighting の詳細

  • Shadows:建物の影の色です。環境の反射光の色に合わせましょう
    床タイルに乗算する仕組みなので必ず床を張ってから調整しましょう
  • Ambient:全体環境光です。マップのLightがない場所はこの色になります
    コントラストが変わらないので一般的な明るさ調整はこちらで行います
  • Add:加算光です。Ambientと違いマップ全体に加算されます
    まんべんなく加算されるので影や暗い場所が潰れますが霧の表現に使用できます
  • Shadow length:影の長さです。値を増やせば影が長くなります
    これは明かりや太陽の角度を表現するために使います
  • Multiplicative colors:Light 外側の乗算光です、コントラストはそのまま明るくなります
    乗算光なので床タイルを張ってから調整しましょう
  • Additive colors:Light 中心の加算光です、影を潰して全体的に明るくなります
    光で輪郭がぼやける効果を擬似的に表現することができます
    b824c8779fd04eb5068cba7d7cb399ac.png

タイマー詳細

  • HammerWatchのタイマーは絶対値ではなく周期です
    タイマーに2000と入力した場合 2000ms毎にトリガーを送るのではなく
    ゲーム内タイマーを2000で割った時間にトリガーを送ります
  • 例えば、ゲーム内タイマーが35000だった時に10000のタイマーを有効にすると
    45000ではなく40000で発動します
    なので10000ms(10秒)後に発動するはずの物が予定の半分の5000msで発動します
  • この仕様のためHammerWatchでは仕掛けの同期が非常に楽である一方で
    「10秒後に発動する」という設定をタイマー単体で制作することが出来ません
    正確に動くタイマーについては後に表記します

Doodad の レイヤー

  • Doodad は Ctrl+数字キーで表示優先度を変更することができます
    この機能を使うことによってプレイヤーに天井を歩かせる事もできます
    ※数字キー単体はGridSize変更なので操作ミスに注意しましょう

Doodads を使った仕掛け

簡単な隠し部屋と隠し通路

F1キーを押して Physics 表示状態にした隠し部屋
左は Ledge で囲い低 Layer の天井を床に敷いて網をかけた隠し通路
右は普通の通路を天井で隠しただけの隠し部屋、これで十分隠れている
796ccf0cd64e7ff7fe1fb78e11c7c804.png

スクリプトを使った仕掛け

スクリプトを使った小さな仕掛けの作り方を記載していきます

スクリプト基本操作

  • Object との連結
    Script 内にある Object ボタンを押して Object 連結モードに入り
    Object を左クリックで連結、Object を Ctrl+左クリックで連結解除できます
  • Shape との連結
    Trigger 内にある Shape ボタンを押して Shape 連結モードに入り
    Shape を左クリックで連結、Shape を Ctrl+左クリックで連結解除できます
    Shape は Script タグ内にありますが連結方法は Object と同じです
  • Script 同士の連結
    影響を与える側を選択したあと
    Ctrl+Alt を押しながら影響を受ける側をクリックすると連結できます
    なお同じ方法で連結を解除できます

サンプルファイルを読もう

Editor を開いて File > Open から test.xml を開くと
ひと通りのスクリプトが乗っているので参考にすると良いと思います
また breakble_wall.xml には破壊できる壁のサンプルがあります

マップに入った時にBGMを鳴らす

Scripting タグから GlobalEventTrigger と PlayMusic を設置します
GlobalEventTrigger の Event 欄を LevelLoaded に設定します
※これで Level(マップ) が読み込まれた瞬間にトリガーが機動します
PlayMusic の Music で曲を選ぶます(Playで視聴可能、Stopで止める)
GlobalEventTrigger を左クリックし、Ctrl+Altを押したまま PlayMusic をクリック
完成です、セーブしたあとテストプレイを開始して音がなるか確かめましょう

f74d3a365293b738b65bc7f3c2531f99.png

踏むと音を出して凹むスイッチ

  • 適当な壁や床や光源を設置した後で
    doodads/special/trigger_button_floor.xml の床用ボタンを設置してください
  • Script タグから RectangleShape を選び床用ボタンに重ねてください
  • ChangeDoodadState を設置して State に activate と入力したあと
    Object ボタンをクリックして床用ボタンに連結してください
  • PlaySound を設置して Sound を sound/misc.xml:button_hatch にしてください
  • AreaTrigger を設置して Trigger times を1に設定して
    RectangleShape と ChangeDoodadState と PlaySound に接続してください
  • テストプレイして床用ボタンが凹み音が鳴る事を確認しましょう

3edf6aba4d0194c7d5ab13c542f476b9.png

  • ChangeDooodadState を使用することで様々な Doodads の状態を変更できます
    詳しくはこちらに記載されていますfileChangeDoodadState

ダメージを受けるトゲの床

doodads/generic/trap_spikes.xml を縦2x横4、合計8個並べて設置します
RectangleShape を設置し Width を8 Height を4に設定してトゲの床に重ねます
Scripting タグから DangerArea を設置して Damage を10に設定したあと
RectangleShape に連結してください
テストプレイしてトゲの床を踏みダメージがあることを確認して下さい
※DengerArea のダメージはキャラの Armor で減算されます

4f9e25c6c4f7783b82b787b8fbd5d9e2.png

矢を射出する装置

  • 適当な壁と床と光源を設置します
  • doodads/generic/trap_shooter_arrow_up.xml を2つ設置します
  • Scripting タグから ProjectileShooter を壁際に設置して
    Direction を Down に Projectile を projectiles/shooter_arrow.xml に設定し
    Spread を0.00に Spawn rate を1000に設定します
    GridSize を4/1まで縮小して壁から1グリッド離すと丁度よくなるでしょう
  • テストプレイを開始して矢が射出されることを確認してください

74154e9d4063e5243f6709b03ca328cf.png

  • PlaySound を射出装置の近くに設置しましょう
    そして Sound を sound/misc.xml:trap_arrows_shoot に設定したあと
    Play as 3D のチェックボックスをチェックして下さい
  • TimerTrigger を設置して Frequency が1000であることを確認したら
    PlaySound に連結してください
  • テストプレイを開始して矢の射出に効果音が追加されていることを確認してください

317f27ee07a0af315d59a4120a3c71c4.png

階段を設置する(マップ内移動やマップ間移動)

  • Scripting タグから RectangleShape を選び階段の入り口に設置します
    LevelStart を階段の出口に設置し、Start id を2にします
    LevelExitArea を適当な場所に設置し、New level を1に、Level start を2に設定します
    LevelExitArea を RectangleShape に接続すると完成です
    テストを開始し RectangleShape を踏んで下さい

ab480fdf9524e0a588a723e36f17e807.png

  • 注意:レベルフォルダが製作されておらず levels.xml が書かれていない場合
    HammerWatch は各マップのIDが何番なのか理解できないため
    LevelExitArea の New level が使用できず階段は製作できません

ショップを制作する

まずはショップを設置します
Doodads タグの doodads/generic/deco_vendor_carpet_1.xml を敷いたり
doodads/generic/deco_vendor_cart.xml を横に置いたり
doodads/special/vendor_combo.xml のコンボ売りさんを置いたり
doodads/special/vendor_speech_combo.xml の吹き出しを置いたり
doodads/theame_a/a_floorsign_combo_l.xml の看板を置いたりしましょう
検索欄に vendor や combo と入れると探しやすいです
※ Vender(商人)達は Characters ではなく Doodads 分類なのですが
これは恐らく店と商人を一緒に動かせた方がマップ製作に便利だからだと思われます

Scripting タグから CircleShape を選び店員と重ねてください
ShopArea を設置して Categories に combo1 と入力したあと CircleShape と連結しましょう
※Categories は店の種類で複数設定することができます。詳しくはこちらfileShopArea
テストプレイをして店を開いてみましょう
3042809338b33a9d4b73635536f17a9d.png

高度な仕掛け

複数のスクリプトを使用した大掛かりな仕掛けについて記載します
ここまでの講座を理解しているという前提で記載します

アイテムを消滅させた後、別の場所に出現させる

  • まず踏むと音を出して凹むスイッチを作ります
  • Doodads タグを選択して doodads/generic/marker_spawn.xml を
    横に並べて2つ設置してください。以降はこれをマーカーと呼びます
  • Items タグを選択して items/powerup_1up.xml を右側のマーカーに設置してください

9be097478b7e99fc5a4396e6c0de4737.png

  • DestroyObject を設置して先ほど設置した1upアイテムに接続してください
  • SpawnObjectを左側のマーカーに設置して
    Object を items/powerup_1up.xml に設定してください
  • PlayEffect を先ほど設置した2つの marker_spawn.xml の上に設置して
    Sprite を effects/particles.xml:flash に設定してください
  • PlaySound を2つの marker_spawn.xml の間に設置して
    Sound を sound/misc.xml:spawn_tele に設定して下さい
  • AreaTrigger を DestroyObject と SpawnObject と
    PlayEffect 2つと PlaySound に連結して下さい
  • テストプレイをして、スイッチを踏み、右の1upが消滅し
    あたかも左に移動したかのように見えることを確認してください

95ebdaff9731f14200326fa43afc9835.png

4つのスイッチを全部押すとアイテムが出現する

  • 適当な壁と床と光源を設置したあと踏むと凹むスイッチを4つ作りましょう
    そしてアイテムが出現する場所に doodads/generic/marker_spawn.xml を設置してください
    以降はこれをマーカーと呼びます

37990fa67a87d5780046ba4707773c48.png

  • Scripting タグから Variable を設置します
  • ChangeVariableを設置します
    • Variables ボタンを押して先ほど設置した Variable に連結してください
    • Change を Add にして加算モードにして Value を1にします
  • ChackVariable を設置してください
    • Variables ボタンを押して先ほど設置した Variable に連結してください
    • Compare 選択を Equal にして Compare 入力欄に4と入力して下さい
      これで Variable が4の時に On True へトリガーを送るようになりました
  • 4つの AreaTrigger をそれぞれ ChangeVariable と ChackVariable に接続してください
  • SpawnObject を設置して Object を items/powerup_diamond.xml に設定してください
  • PlaySound を設置して Sound を sound/misc.xml:spawn_tele に設定し
    Play as 3D チェックボックスを有効にしてください
  • PlayEffect を設置して Sprite を effects/particles.xml:flash に設定してください
  • ChackVariable の On True ボタンを押して
    SpawnObject と PlaySound と PlayEffect を連結してください
  • SpawnObject と PlaySound と PlayEffect をマーカーの上に重ねて下さい
  • テストプレイをしてスイッチを4つ踏むとダイヤモンドが出現することを確認しましょう

4b093912b1771dcac21d13d7b204d999.png

色分けされたスイッチとトゲの床

  • 適当な壁と床と光源を設置したあと
    doodads/special/trigger_button_floor.xml の床用ボタンを2つ設置してください
    それを doodads/generic/maker_button_blue.xml と maker_button_red.xml で囲みましょう
    doodads/generic/trap_spikes.xml を設置して
    doodads/generic/maker_stripe_v_blue と maker_stripe_v_blue で挟みましょう
    そして Items タグから適当な宝石やお金を配置しましょう
    図5:構造サンプル画像
    5894a2492e2f85d73039063e83b4fcba.png
  • ここまでの講座を参考にして
    床スイッチを踏めば音が鳴って凹むようにします
    トゲをダメージ100のトゲ床にします
    7f046e0b743b24d4e13c6705faf70ac7.png
  • ChangeDoodadState を設置して State を Closed にしたあと
    青い枠で挟まれたのトゲ4つに連結してください
  • ToggleElement を設置して State を Disable にしたあと
    青い枠で挟まれたトゲの DangerArea に連結してください
  • PlaySound を設置して Sound を sound/misc.xml:trap_spikes_off に設定してください
  • AnnounceText を設置して Time を10000、Type を Title に設定したあと
    Text に Blue spike closed と入力して下さい
  • 青い枠で囲まれた床のボタンと接続している AreaTrigger から
    ChangeDoodadState と ToggleElement と PlaySound そして AnnounceText に接続してください
    これで青いボタンを踏むとトゲが閉じてダメージも受けなくなります
  • 赤い方でも同じ手順を繰り返して下さい
  • テストプレイをして、青と赤のスイッチを踏み宝石を手に入れましょう

図6:最終的なスクリプト構造
7173b95b062342feb3129c5cb705702f.png

  • AnnounceText で遠くにいるプレイヤーにトゲが解除されたことを伝えるのは
    マルチプレイ向けマップにおいて非常に重要なことなのでしっかり伝えましょう
  • 戦闘中はメッセージに気付かないので Time は長めにしておくとよいでしょう

滑らかに出現する隠し橋

  • 様々なパーツを使って下図のようなフロアを作り
    items タグから items/chast_blue.xml を選択して3つ並べます
  • 押すと凹むスイッチを作ります

図7:F1 を押して Physics (衝突判定)が見えるようにした図
Doodads の Lidge は重ねても問題なく表示されるので端の部分は重ねてしまいましょう
be598e319224cd946ada9f095a2730cf.png

  • Scripting から HideObject を設置し State を Hide にしたあと橋を連結します
  • GlobalEventTrigger を設置し Trigger times を1にしたあと
    Event を LevelLoaded にして HideObject に連結します
  • これでゲーム開始時に橋が隠れるようになりました

連結図
460af12f6b076e6d01769a23f7ed60a7.png

  • かなり複雑な形になるので先に下の図8を見て下さい

図8:完成図
13b65a536ac9f15b6c775223d7070ad5.png

  • PlaySound を橋の中央に設置し Sound を sound/misc.xml:spawn_tele に設定したあと
    Play as 3D のチェックボックスを有効にし、3D Range を10.00にしてください
  • HideObject を設置し State をShow にしたあとコピーして5つに増やして下さい
    HideObject 群を自身に対応した橋タイル2枚に接続してください
  • PlayAttachedEffect を設置し Sprite を efects/particles.xml:flash にしたあと
    コピーして5つに増やして下さい
    PlayAttachedEffect 群を自身に対応した橋タイル2枚に接続してください
  • Counter を設置したあとコピーして5つに増やしてください
    そして左から順に Trigger times と Count を1づつ増やして下さい
    一番左の Trigger times と Count が共に1 一番右が共に5になっていればOKです
  • Counterをそれぞれ真上の HideObject と PlayAttachedEffect に接続してください
    そして更に橋の中央にある PlaySound に接続してください
  • ここまでの確認事項(違ったら接続に失敗している)
    • 全ての HideObject の Object に2+0と表示されている
    • 全ての PlayAtttachedEffect の Attach to に2+0と表示されている
    • 全ての Counter の To execute に3+0と表示されている
  • TimerTrigger を設置し、Enabled チェックボックスを無効にしたあと
    Frequency を150に設定し、5つの Counter 全てに接続して下さい
  • ToggleElement を設置し State を Enable にしたあと
    Element ボタンをクリックして TimmerTrigger に接続して下さい
  • DestroyObject を設置して Object ボタンを押し橋の左入り口の ledge に接続してください
  • スイッチの AreaTrigger を ToggleElement と DestroyObject に接続してください
  • テストプレイをして、スイッチを踏むと滑らかに橋がかかり渡れる事を確認しましょう

完全に隠蔽された隠し部屋

  • まずは適当なDoodadsで部屋を作成しアイテムや光源を設置します
    床には Doodads の trigger_button_floor を設置してくさい
  • 完成したら部屋を隠蔽する事になるのですが
    普通に隠すと下図のように光漏れしますし入り口周りのブロックが不自然になります
    d86004059a4fbfaf2d61f96d66b27826.png
  • そこでまず Scripting の HideObject と GlobalEventTrigger を設置してください
    設置したらGlobalEventTrigger を HideObject に連結してください
    次に GlobalEventTrigger の TriggerTimes を1に設定して Event を LevelLoaded にします
    これでゲーム開始時に1度だけ呼ばれるようになりました
  • HideObject の State を Hide に設定して、隠したい光源と入り口の柱に連結します
    テストプレイして下さい、ゲーム開始時に連結したオブジェクトが綺麗に隠れると思います
    ※Light は Object ではないらしく Hideobject で消せません諦めましょう
    図3:左はは Hideobject の連結図、右は上から被せる Doodads です。
    d43a59fe720f97c2ce434ec5e11e158d.png
  • Scripting タグから RectangleShapes を選びスイッチの上に設置し
    さらに AreaTrigger を近くに置きましょう
    AreaTrigger の Trigger times を1に設定して RectangleShapes に連結して下さい
  • 二個目の HideObject を設置して State を Show に設定したあと光源に連結しましょう
  • 先ほど設置した AreaTrigger から HideObject に連結して下さい
    これでスイッチを踏むと消えていた光源が表示されるようになります
  • 隠蔽用の壁と天井を設置したあとで
    DestroyObject を設置して隠蔽用の壁と天井の Doodads に連結しましょう
    それから AreaTrigger から DestroyObject に連結しましょう
    これでスイッチを踏むと壁と天井が消えるようになります
    図4:左は HideObject 配置図 右は完成図
    ca64c39bcd78e2c2ca38a6ff25c537ba.pngca8c0305637b568439299cd733d750b6.png
  • ちなみに公式はこの完全な隠し部屋をほとんど使用していません
    公式ダンジョンでは隠し部屋に宝箱や食べ物など光らないアイテムだけを配置したり
    明かり漏れする部屋は長い廊下と組み合わせて隣の画面に隠したり
    そもそも漏れてる明かりをプレイヤーへのヒントに使うといった方法で
    HideObject を殆ど使わずに隠し部屋を制作しています
  • ちなみに HideObject を使う理由は SpawnObject より
    オブジェクトの配置が格段に楽だからです

交互に出たり引っ込んだりするトゲの床

  • 適当な壁と床と光源を設置した後で
    doodads/generic/trap_spikes.xml のトゲの床を横に4枚並べて下さい

b46d5526e3be971fc52f3ed5c9b49cdf.png

  • Height と Width が2.00の RectangleShape をそれぞれ4枚トゲ床に重ねて下さい
  • トゲの上側に DangerArea を設置して Enabled のチェックボックスを外して下さい
    ChangeDoodadState を DangerArea の左に設置して State を activate に設定してください
    ChangeDoodadState を DangerArea の右に設置して State を deactivate に設定してください
    これらを左から1番目と3番目の RectanglShape に接続してください
  • ToggleElement を DangerArea の上に設置したあとState をToggle して
    DangerArea に接続してください

2381cc0bd27baf8875cd4368e8381994.png

  • 新たにトゲの下側に DangerArea を設置して下さい
    ChangeDoodadState を DangerArea の左に設置して State を activate に設定してください
    ChangeDoodadState を DangerArea の右に設置して State を deactivate に設定してください
    これらを左から2番目と4番目の RectanglShape に接続してください
  • ToggleElement を DangerArea の下に設置したあとState をToggle して
    DangerArea に接続してください

6c0f66d3a32400e275f15d5baf91e140.png

  • Variable を設置して Initial を2にしてください(0除算を避けるため)
  • ChangeVariable を設置してください
    • Variables ボタンを押して先ほど設置した Variable と連結して下さい
    • Change を Add に設定してください、トリガーを受け取る度に Value を加算する設定です
    • Value を1に設定して下さい。これで毎回1を加算します
  • ChackVariable を設置してください、これはトリガーを受け取る度に Variable を判定して
    答えが真なら On True に、偽なら On False にトリガーを送るスクリプトです
    • Variable ボタンを押して先ほど設置した Variable と連結して下さい
    • Compare を Divisible に設定しましょう
      これは Variable が Compare の値で割り切れる時は On True にトリガーを送る設定です
    • Compare の値を2に設定してください、これで偶数時は True 奇数時は False になります
    • On True と上側左と下側右の ChangeDoodadState と両方の ToggleElement と
      ChangeVariable に連結してください
    • On False と上側右と下側左の ChangeDoodadState と両方の ToggleElement と
      ChangeVariable に連結してください
  • PlaySound をトゲの中央あたりに設置してください
    Sound を sound/misc.xml:trap_spikes に設定して下さい
  • TimerTrigger Frequency を2000に設定して下さい
    そして ChackVariable と ChangeVariable そして PlaySound に接続して下さい
  • テストプレイをして交互にトゲが出入りしていることを確認しましょう

完成図(見辛くなったので PlaySound は省いています)
fac188dc98df812e17a6b4d636089106.png

  • タイマーと倫理機構を使用した極めて複雑な仕掛けです。頑張って成功させましょう。

マルチプレイ対応、前に立つと火が出るタレット

  • 下図を参考に Doodad を配置してください
    タレットのパーツは Turret で検索すると出てきます
  • ProjectileSpewer をタレットの射出口から1/4ブロック下にずらした場所に設置してください
    Enabled チェックボックスを無効にして
    Direction を Down に、Projectile を projectiles/shooter_fireball.xml に
    Spled を 0.00 に Spawn rate を200に設定してください
  • PlaySound をタレットの真上に設置して
    Sound を sound/misc.xml:trap_fireball_shoot に設定したあと
    Play as 3D チェックボックスを有効にしてください
  • TimerTrigger を設置して Enabled チェックボックスを無効にしたあと
    Frequency を200に設定してください、これで射撃音が同期します
  • ToggleElement を縦に並べて2つ設置してください
    上側の State を Enable にして PlaySound と TimerTrigger に接続してください
    上側の State を Disable にして PlaySound と TimerTrigger に接続してください
  • RectangleShape を設置し Height を 10にしてください
  • AreaTrigger を縦に2つ配置し 上側を OnEnter 下側を OnLeave にしてください
    そして2つとも RectangleShape に連結してください
  • Variable を設置してください
  • ChangeVariable を設置して両方の Value を1に設定して
    上側の Change を Add にして、上側の AreaTrigger から連結してください
    下側の Change を Subtract にして、下側の ARえあTrigger から連結してください
    2つとも Varable に連結してください
  • ChackVariable を設置してください
    Variable に先ほど設置した Variable を連結してください
    Compare 選択欄を GreaterOrEqual にして入力欄に1を入力してください
    On True ボタンを押して上側の Enable の ToggleElement と連結してください
    On False ボタンを押して下側の Disable の ToggleElement と連結してください
    ※ESCを押して On True の選択モードから抜けてから On False ボタンを押しましょう
  • テストプレイをして RectangleShape に乗ったり下りたりしましょう

左は設置例、右は完成図

cc7d8e72bce40e66b180a407af8743e6.png598bd4fd24b9e74110212c98d4dff7b9.png
  • 単純なToggle式だと2人同時に入った時に止まってしまいます
  • Variableを使わず On Enter で発射、On Leave で止める仕掛けだと
    プレイヤー二人が乗って1人だけ下りた時に止まります
  • これらの問題を解決するためにキャラが入ると OnEnter で Variable 加算
    キャラが出ると On Leave で減算、Variable が1以上の時に火を出す設計にしました
  • なお On Enter で発射、On Leave で止める仕掛けでも9割方まともに動くので
    マップの肝になるような仕掛けでなければ Variable まで使う必要性は無いでしょう

マップデータ配布

  • ここまでの講座の全てが入ったマップを配布しています
    test2.zip
  • Program Files (x86)\Steam\steamapps\common\Hammerwatch\editor に入れて下さい

以下は収録されているが講座は無くなったボツ部屋の解説

  • スイッチを踏むと扉が閉まり、敵が次々現れる部屋
    複雑な機構の割にプレイヤーは部屋の中で耐えるだけで
    プレイヤーが試行錯誤する余地が無いのでボツになりました
    本編にこの手の仕掛けが無いのは恐らく同じ理由によるものでしょう

左は部屋の構成、右は完成図

93857c0dc4274ba039d1aa4a927755af.png9a24f38bd465cdbadec5c3b8303d1f81.png