LNS140 マップ > キャラ拡張

マップ画面とキャラクター動作に関する基礎的な拡張スクリプトです。
このスクリプトは単体で機能しますが、一部機能の利用には他の LNS の導入が必要になります。





基本情報

前提スクリプト

なし

拡張タイプ

★ 既成 (導入するだけでゲームの挙動が変化する)
◆ 要注意 (内部の挙動を変えるため競合の可能性あり)


説明

◆ イベント軽量化

  • イベントの位置情報を、マップ($game_map)側で保持するようになります。
    • 通行判定などの際にイベント全体を調査することがなくなるため、大量のイベントが置かれたマップなどで軽量化が見込めます。
  • 画面内(near_the_screen?)のイベントだけがスプライトを保持し、それ以外のイベントは画面に近づいたときだけスプライトを生成するようにします。
  • 画面外のイベントも自律移動を更新するようになります。

◆ イベント複製

  • イベントの名前に <複製:***> と書いておくと、そのイベントが *** 個になるように複製されます。
    • 全く同じ機能を持つイベントを複数コピペしたいときにご利用ください。
    • <複製:1> の場合は複製されません。
    • <複製:2> とした場合は一つ増えることになります。
  • 複製は元イベントと同じ座標に生成されますので、必要に応じて動かしてください。
  • 複製イベントの ID は、もともと存在するマップイベントが使っていない ID が若い順に振られます。
(例) 「EV001<複製10>」と「EV002<複製5>」がある場合
  • ID 1 番と 2 番のイベントは通常通り生成されます。
  • ID 3 番から 11 番までの 9 個が、EV001 の複製になります。
    • EV001 は複製と合わせて全部で 10 個になります。
  • ID 12 番から 15 番までの 4 個が、EV002 の複製になります。
    • EV002 は複製と合わせて全部で 5 個になります。

◆ スクロール制御

● Game_Map#lock_scroll([auto_off])

  • マップ画面のスクロールを無効にします。
  • 無効になるのは、プレイヤーの移動時の自動スクロールイベントコマンド [マップのスクロール] によるスクロール演出です。
  • [場所移動] による移動に伴うスクロール位置の修正は、それが同一マップ内であっても適用されます。
  • auto_off が真の場合、マップの切り替え時に自動的にロックを解除します。
    • 偽の場合、マップを切り替えてもロック状態は継続します。
    • 省略時は真として扱われます。

● Game_Map#unlock_scroll([restore])

  • マップ画面のスクロールロックを解除します。
  • lock_scroll によりロックされていない場合は何も起きません。
  • restore が真の場合、同時に reset_scroll_target が呼ばれます。
    • プレイヤーの位置が画面中央にくるようにスクロール位置が戻されます。
    • 数値が指定されていれば、それを追従速度とみなします。
    • 偽の場合、スクロール位置は固定時から変化しませんので、何らかの方法で元の位置に戻さないとプレイヤーが見えなくなるなどの問題が発生しえます。
    • 省略時は真として扱われます。

● Game_Map#set_scroll_target(x, y[, speed])

● Game_Map#set_scroll_dif(dx, dy[, speed])

● Game_Map#reset_scroll_target([speed])

  • (共通事項) speed はターゲット座標への追従速度です。
    • 数値が小さいほど速く動きます。
    • 1 の場合は「ターゲットを設定した次のフレームで追従完了」になります。
    • 0 以下の場合は「ターゲットを設定した時点で追従完了」になります。
      • すなわち、通常の set_display_pos と同じ動作になります。
    • speed が省略された場合、追従速度は Scroll_Default_Speed になります。

  • set_scroll_target は、マップの座標 (x, y) のタイルが画面中央にくるようにスクロールターゲットを設定します。
  • set_scroll_dif は、現在の表示位置に対しての移動量で指定します。
  • reset_scroll_target は、プレイヤーの位置が画面中央にくるようにターゲットが決定されます。
  • これらのメソッドによる画面のスクロールは lock_scroll の影響を受けません。

◆ 地形効果判定

  • プリセットスクリプトでは [ダメージ床] の上に [梯子] があるとき、その上を移動するとダメージを受ける仕様になっています。
  • Map_AnyFlag が偽の場合 [梯子] の上にいるときは [茂み] や [ダメージ床] の指定が無視されます。

◆ 経路探索

  • A*双方向探索により、現在位置から指定座標までの最短ルートを検索して歩かせることができます。
  • あるキャラクター(char)に座標(10, 5)までの最短ルートを歩かせる場合、イベントコマンド [スクリプト] で char.walk_to(10, 5) と書きます。
    • 通行できない場所(壁など)を目的地に設定した場合ルートは探索されません。
    • 目的地は通行可能なものの、間に壁があるなどで到達不可能な場合、いったん全てのルートを検索したうえで到達不可能な判定を下すため、時間がかかかる場合があります。
    • 到達不可能な場合の探索時間を短縮したい場合、char.walk_to(10, 5, 30) などと3番目の引数に上限歩数(マス数)を指定してください。
  • LNS102 マウス操作を導入している場合、マップ上の点をクリックした際に、その地点まで最短ルートで移動するようになります。

◆ 斜め移動

  • プレイヤーの移動時、方向キーの縦と横を同時に押すと斜めに移動します。
  • 斜め移動の際、水場の上に斜めに陸地が渡されていた場合(下図)は直接移動できるようになります。
  • 「水場」と「陸地」の判定について、RTPのタイルセットに対してはこのスクリプト上で定義してありますが、オリジナルのタイルセットを使う場合、TilesetPriority を設定する必要があります。
    • 設定方法はこのページの末尾を見てください。
  • 斜め移動できない状態(壁に隣接しているなど)で斜め入力を行うと、移動できる方向への「すべり」が発生します。
    • [移動ルートの設定] での斜め移動の場合すべりは起こりません。

◆ イベント起動

  • 段差を隔てて隣接しているイベント(下図)は、2次元的に隣接していても起動できなくなります。
  • はしごを利用して天井に登れるようなダンジョンの場合に有効です。
    • 起動しようとするイベントが壁や水場など通行不可能な場所にある場合は、段差の有無に関係なく通常通り起動できます。
  • カウンター属性を持つタイルを隔ててイベントを起動するとき、標準では1マスの厚みのときだけ起動できましたが、このスクリプトでは2マスの場合も起動できるようになります。
    • 何マス先まで起動可能にするかは Counter_Max で変更できます。

◆ 床一枚絵 (要 LNS100 プリセット拡張 )

  • マップのメモに
<mapfloor:ファイル名>
 と書いておくと、タイルマップのすぐ下(遠景よりも上)に指定された名前の画像を表示します。
  • この画像はマップのスクロールに同期して表示されます。マップの床を一枚絵で表現したい場合に使えます。
  • 画像は Graphics/Parallax に置きますが、FloorPath にて変更可能です。
  • ファイル名の後ろに ",255" などカンマと数字を書いておくと、床の不透明度をその値に指定することができます。

◆ 天井一枚絵 (要 LNS100 プリセット拡張 )

  • マップのメモに
<maproof:ファイル名>
 と書いておくと、マップの最上層に指定された名前の画像を表示します。
  • キャラの上にある物(木々の影など)を一枚絵で表現したい場合に使えます。
  • 画像は Graphics/Parallax に置きますが、RoofPath にて変更可能です。
  • ファイル名の後ろに ",255" などカンマと数字を書いておくと、床の不透明度をその値に指定することができます。

◆ 前景 (要 LNS100 プリセット拡張 )

  • マップのメモに
<foreground:ファイル名>
 と書いておくと、マップ最上層(天井よりも上)に前景画像を表示します。
  • RPGツクールXPにおけるフォグ(雲や霧)を表現したい場合のに使えます。
  • マップのスクロールと完全には同期せず、遠景と似たような形で表示されます。
  • 画像は Graphics/Parallax に置きますが、ForegroundPath にて変更可能です。
  • メモ内に sx:** や sy:** と書いておくと、遠景のスクロールと同様のスクロール表示を行えます。以下の記入例を見てください。
<foreground:aaa,sx:0>        #=> 画像ファイル"aaa"を前景に指定。横方向にループ。
<foreground:aaa,sx:8,sy:-2>  #=> 横方向に速度8で自動スクロール。縦方向に速度-2で自動スクロール。
<foreground:aaa, sy:0, sx:8> #=> 横方向に速度8で自動スクロール。縦方向にループ(自動スクロールなし)。
  • スクロール速度の値は遠景の自動ループと同じ仕様です。

◆ タイルフラッシュ (要 LNS000 組み込み拡張 )

  • スクリプトで $game_map.flash(x, y, color) と書くと、座標(x, y)のマスを color に応じた色でフラッシュします。
  • color はRGBの各色を4ビットで表します。例えば 0xf00 とすると RGB(255, 0, 0) でフラッシュします。
  • フラッシュを終了する場合は、color に 0 を指定してください。

◆ おまけ : マップ画像保存 (要 LNS032 Bitmapメモリ干渉 )

Sprite_Tilemap.save_bitmap(map_id[, div[, fname[, type]]])
  • map_id のマップの全貌を 1 枚のビットマップ画像(PNG形式)にして保存します。
    • Graphics.snap_to_bitmap を使うため、大きなマップでは時間がかかります。
  • div には縮小倍率を指定します。省略時は 8 になります。
    • div = 1 で「原寸大」になります。
    • div = 2 で「1/2 縮小」になります。
    • div は最大 32 で、このとき「マップの 1 マスが 1 ピクセル」になります。
    • div が 32 の約数でない場合、
  • fname には保存するファイル名を指定します。
    • 省略時は "Map001" の形式になります。数字部分にはマップ ID が入ります。
  • type には縮小の方法を指定します。
    • type = 0 のときは Bitmap#stretch_blt を利用します。
      • 高速ですが、div が大きい(出力画像が小さい)と情報がかなり欠落します。
    • type = 1 のときは Bitmap#blt を利用した疑似面積平均法で縮小します。
      • 二番目に高速ですが、計算誤差の都合で type = 2 に比べて暗くなります。
      • 省略時はこれになります。
    • type = 2 のときは面積平均法による高品質な縮小を行います。
      • 極めて遅い代わりに縮小後の画像は最も高品質になります。
      • CPU の性能にもよりますが、数秒から数十秒かかると考えてください。

  • テストプレイ時、マップ画面(Scene_Map)で CTRL + SHIFT + S を押すと、そのマップの画像を保存します。
    • このとき Sprite_Tilemap.save_bitmap に渡される引数は下の定数で指定します。
Save_Div   = 8
Save_Fname = "Map%03d"
Save_Type  = 1
  • Save_Fname の %03d はマップ ID に変換されます。
  • LNS105 キーボード入力 を導入している場合は、保存のたびに設定を変えることができます。


備考

再定義されるメソッド

Game_Map#events_xy
Game_Map#events_xy_nt
Game_Map#tile_events_xy
  • イベントリストを利用した軽量な処理に変更します。

Game_CharacterBase#passable?
  • タイルマップの通行判定より先に他のキャラクターとの衝突を調べるように変更します。
Game_CharacterBase#collide_with_events?
  • イベントリストを参照する処理に変更します。

Game_Character#set_direction
Game_Character#move_straight
Game_Character#passable?
  • 方向に斜め(1,3,7,9)が渡された場合の挙動が追加されます。
Game_Character#diagonal_passable?
  • 斜め移動時の挙動が自然になるように通行判定を変更されます。

Game_Player.move_by_input
  • 斜め入力に対応します。
Game_Player.check_event_trigger_there
  • カウンタータイルが2つ以上隣接している場合にも対応できるように変更されます。
Game_Player.normal_walk?
Game_Player.update_encounter
  • マウスによる移動ルートの強制時も通常歩行と判定されるように変更されます。
Game_Player.check_event_trigger_touch
Game_Event.check_event_trigger_touch
  • 段差を隔てている場合は起動できないように変更されます。
Game_Event.update_self_movement
  • 自分が画面外にいるときも移動の更新を行うように変更されます。

Spriteset_Map#create_characters
Spriteset_Map#update_characters
  • 画面内のイベントだけにスプライトを作るように変更されます。

設定項目

Map_AnyFlag <既定値 false >
梯子とダメージ床/茂みを両立する
RStep_Limit <既定値 30 >
経路探索の上限(省略時)
Counter_Max <既定値 2 >
イベント起動時、カウンター属性のタイルを何枚まで挟めるか
FloorPath <既定値 "Graphics/Parallaxes/" >
床一枚絵の画像を入れる場所
RoofPath <既定値 "Graphics/Parallaxes/" >
天井一枚絵の画像を入れる場所
ForegroundPath <既定値 "Graphics/Parallaxes/" >
前景の画像を入れる場所
Save_Div <既定値 8 >
マップ画像保存時の縮小倍率
Save_Fname <既定値 "Map%03d" >
マップ画像保存時の名前。%03d はマップ ID に置き換わる
Save_Type <既定値 1 >
マップ画像保存時の縮小方式
TilesetPriority
タイルセットのファイル名と「通常タイルの」上下関係
TilesetPriority[ファイル名][タイルID] = プライオリティ
・ファイル名
  - 直接文字列で指定 ("Outside_A5" など)
・タイルID
  - 0-255 の相対値
  - オートタイルは以下の固定値
      A1 :  0-15
      A2 : 16-47
      A3 : 48-79
      A4 : 80-127
・プライオリティ
  - 0 : A1 タイルの水部分 など、斜め移動の可否に関与しないタイル
  - 1 : 下層タイル(通行はできないが乗り出すことはできる)
  - 2 : 上層タイル(乗り出せない) (デフォルト値)
  - 3 : 天井
  - オートタイルは A1 = 0、A3/A4 = 3、それ以外は 2 として扱われる


更新履歴

  • 2022/11/01 LNS102 マウス操作と併用した際、画面外でマウスを動かすとエラーが起きる不具合の修正(スクリプト自体の更新日は2020/01/08となっています)
  • 2020/01/07 軽量化とイベント複製の機能追加
  • 2020/12/29 新版公開
  • 2019/10/19 マップ上に一枚絵を表示する機能を追加

  • こんにちは。不具合を発見したのでご報告いたします。 LNS000 組み込み拡張 LNS010 Input拡張 LNS100 プリセット拡張 LNS102 マウス操作 LNS140 マップ/キャラ拡張 の5つを導入した状態で、マップ画面でマウスカーソルをゲームウインドウの外側で大きく動かすなどすると、「 スクリプト 'LNS 140 マップ/キャラ拡張' の 980 行目で IndexError が発生しました。 index -1 too small for array; minimum: 0 」というエラーメッセージが表示され、ゲームが終了してしまいます。 スクリプトは全て最新で、内容は改変していません。 -- 2022-07-26 01:29:40
  • 確認が遅れましたが、対応修正しました。正確には「既に対応済みであったがアップロードを忘れていた」という状態でした…… -- 2022-11-01 15:39:07
  • 対応ありがとうございます!しかし LNS000, 010, 100, 102, 140 の5つを入れた状態で起動直後に「スクリプト 'LNS140 マップ/キャラ拡張' の 1719 行目で NameError が発生しました。 undefined method 'lns102_dash?' for class 'Game_Player'」と表示され、終了します。 -- 2022-12-24 16:39:35
コメント:

すべてのコメントを見る
最終更新:2022年11月01日 15:40