キャラクターのキー操作・横スクロール6【障害物に接触したら画像変換・場面転換する設定】

Last-modified: 2023-08-31 (木) 09:50:18

衝突範囲と衝突範囲の接触でコマンドを発動させるスクリプト記述の一例です。

  1. キャラクターと障害物に衝突範囲を付与する。
  2. 衝突範囲同士の接触トリガーを設定する。

これにより、マップ上の扉などに到着した際、場面を転換させるなどのギミックを行えます。



スクリプト記述例

スクリプト記述例はLight.vn基本サンプル(公式本体)を使用した場合を想定しています。ダウンロードはこちらから。

  • 新規スクリプト「sample_script.txt」内に
    //背景
    ~背景0 map maps/box.png | イン map 300
    //キャラクター
    ~絵0 vale scg/vale/vale_sampleb.png 0 140 80 | 拡大 vale 100% | .イン vale 300
    //キャラクター衝突範囲
    衝突範囲方形追加 vale 0 0 406 806 侵入禁止
    //障害物
    ~絵0 door1 maps/door_cl.png 950 -250 50 | 拡大 door1 50% | イン door1 300
    //障害物衝突範囲
    衝突範囲方形追加 door1 0 0 668 1107
    //接触判定
    衝突開始時 vale door1 "画像 door1 maps/door_op.png"
    衝突終了時 vale door1 "画像 door1 maps/door_cl.png"
    //キャラクター操作
    キーダウン a 方向移動x vale -400ups
    キーダウン d 方向移動x vale 400ups
    キーアップ a 方向移動x vale 0ups
    キーアップ d 方向移動x vale 0ups
    ~待機 続行禁止
    //-----------------------------------------------------------------------
    接触時にコマンド発動


スクリプト解説

キャラクター(衝突範囲a)とドア(衝突範囲b)が接触すると任意コマンドを発動させる方法を解説していきます。


1. キャラクターと障害物(ドア)に衝突範囲を付与する

衝突範囲方形追加」コマンドでキャラクター(vale)と障害物(door)に対し衝突範囲を付与します。
以下、表示サンプル例。

  • スクリプト「sample_script.txt」内に
    //キャラクター
    ~絵0 vale scg/vale/vale_sampleb.png 0 140 80 | 拡大 vale 100% | .イン vale 300
    //キャラクター衝突範囲
    衝突範囲方形追加 vale 0 0 406 806 侵入禁止
    //障害物
    ~絵0 door1 maps/door_cl.png 950 -250 50 | 拡大 door1 50% | イン door1 300
    //障害物衝突範囲
    衝突範囲方形追加 door1 0 0 668 1107
    衝突範囲
  • 今回の衝突範囲のサイズは、キャラクター(vale)はやや縮小・障害物(ドア)は基画像の大きさで指定しています。
  • 衝突範囲方形追加」オプションである「侵入禁止」は、障害物の方は記述していません。
    横スクロールの場合、障害物(ドアなど)をすり抜けて移動するために、障害物(ドアなど)の方だけ侵入禁止を無くします。
    キャラクター(vale)に記述している「侵入禁止」は、別章での左右の見えない壁との接触のために必要です。


2. 衝突範囲と衝突範囲の接触で開始するコマンド設定

衝突開始時」コマンドで発動したいコマンドを指定します。
以下、表示サンプル例。

  • 上記に追記で
    //接触判定
    衝突開始時 vale door1 "画像 door1 maps/door_op.png"
    衝突終了時 vale door1 "画像 door1 maps/door_cl.png"
    衝突開始時
  • 衝突開始時」コマンドは「衝突範囲a」と「衝突範囲b」が接触した瞬間に任意のコマンドを実行できます。
    例では「a」:衝突範囲キャラクター(vale)と「b」:衝突範囲障害物(door)を指定しています。
  • エディターの「衝突処理タブ」で設定している衝突処理を確認することができます。
  • 例ではドアに触れると、
    衝突範囲同士が重なる瞬間に発動する「衝突開始時」により、「画像」コマンドで、ドア画像を開いた状態の画像と入れ替え、
    衝突範囲同士が離れた瞬間に発動する「衝突終了時」により、「画像」コマンド、で閉まっている元画像へと戻しています。

    ドア開
    ドア閉


スクリプト記述例 ケース2

  • 新規スクリプト「sample_script.txt」内に
    //背景
    ~背景0 map maps/box.png | イン map 300
    //キャラクター
    ~絵0 vale scg/vale/vale_sampleb.png 0 140 80 | 拡大 vale 100% | .イン vale 300
    //キャラクター衝突範囲
    衝突範囲方形追加 vale 0 0 406 806 侵入禁止
    //障害物
    ~絵0 door1 maps/door_cl.png 950 -250 50 | 拡大 door1 50% | イン door1 300
    //障害物衝突範囲
    衝突範囲方形追加 door1 0 0 668 1107
    //接触判定
    衝突開始時 vale door1 "スクリプト sample_script.txt エリア移動"
    衝突終了時 vale door1 "スクリプト sample_script.txt 移動中止"
    //キャラクター操作
    キーダウン a 方向移動x vale -400ups
    キーダウン d 方向移動x vale 400ups
    キーアップ a 方向移動x vale 0ups
    キーアップ d 方向移動x vale 0ups
    ~待機 続行禁止
    //-----------------------------------------------------------------------
    //接触結果
    栞 エリア移動
    画像 door1 maps/door_op.png
    効果音 maou_door se_maou_door1.ogg
    文字0 word_p 360 630 100 rounded-mplus-1c-regular.ttf 60 "pキーでエリア移動" | イン word_p 300
    キーダウン p ジャンプ start0.txt
    スクリプト終了
    栞 移動中止
    画像 door1 maps/door_cl.png
    アウト word_p
    キーダウン p
    スクリプト終了
    接触時に複数コマンド発動


スクリプト解説

キャラクター(衝突範囲a)とドア(衝突範囲b)の接触時に「スクリプト」を指定し、複数のコマンドを発動させる方法を解説していきます。


1. 発動する複数コマンドの設定

衝突開始時」コマンドで発動したい複数コマンドを記述しておきます。
スクリプト」コマンドで指定するため「」コマンドでまとめておきます。
以下、表示サンプル例。

  • スクリプト「sample_script.txt」内に
    //接触結果
    栞 エリア移動
    画像 door1 maps/door_op.png
    効果音 maou_door se_maou_door1.ogg
    文字0 word_p 360 630 100 rounded-mplus-1c-regular.ttf 60 "pキーでエリア移動" | イン word_p 300
    キーダウン p ジャンプ start0.txt
    スクリプト終了
    栞 移動中止
    画像 door1 maps/door_cl.png
    アウト word_p
    キーダウン p
    スクリプト終了
    複数コマンド
  • 」「スクリプト終了」を使い、発動したいコマンドをまとめます。
  • 衝突開始時」で指定する「栞 エリア移動」を記述します。
    例では、「画像」でドア画像を開いているドア画像に変更、「効果音」でドアがきしむ音を再生、「文字」で説明文【pキーでエリア移動】を表示、「キーダウン」で「p」キーを押したら「start0.txt」へジャンプするように設定しています。
  • 衝突終了時」で指定する「栞 移動中止」を記述します。
    例では、「画像」で開いているドア画像を元のドア画像に変更、「アウト」で「文字」説明文を消去、「キーダウン」の「p」キーを機能停止する設定にしています。


2. 接触時の「スクリプト」コマンド設定

衝突開始時」コマンドで「スクリプト」コマンドを指定します。
衝突終了時」コマンドにも「スクリプト」コマンドを指定します。
以下、表示サンプル例。

  • スクリプト「sample_script.txt」内に
    //接触判定
    衝突開始時 vale door1 "スクリプト sample_script.txt エリア移動"
    衝突終了時 vale door1 "スクリプト sample_script.txt 移動中止"
    衝突時発動コマンド
  • 衝突開始時」による発動コマンドを「スクリプト sample_script.txt エリア移動」にします。