地上の洞窟

どこにも行かず、液晶と「にらめっこ」し続ける人の物語。

【RGSS3】オープニングデモマップ

オープニングデモマップ
タイトル画面の背景にマップ!

ゲーム起動直後に演出用のマップを表示できるようになります。
また、タイトル画面の背景にも演出用のマップを指定して表示できます。

「凝った前置きを作りたい!」「タイトル画面が一枚絵だと物寂しい!」
そんな人におすすめです。

オープニングでもマップ!

注意点

  • デフォルト設定では何も機能しません。各自設定してください。
  • 背景として表示されるマップですが、普通に動けます。メニューも開けます。
    トリガー「自動実行」に設定したイベントなどでロックしてください。
  • オープニングデモを終了する場合
    →イベントの「タイトル画面に戻す」を使用してください。


更新履歴 内容
2023/10/18 ・ロード画面などへ遷移する度に
 マップが再読み込みされていた不具合の修正
・ OPDEMO_EVERY_TIMEがtrueの場合
 文字通り毎回オープニングデモが呼び出されて
 タイトル画面へと遷移しない不具合の修正
2023/10/11 解放処理が正しく行われていなかった不具合の修正
2023/09/19 ロード画面などの背景に
マップが表示されない不具合の修正
2023/09/03 シーン遷移時、スプライトが解放されずに
余分な更新処理が行われていた不具合の修正
2023/08/21 初版

→スクリプト一覧へ


スクリプト(ダブルクリックで全選択)↓

=begin =========================================================================
 ■ 「オープニングデモマップ」- OpeningDemoMap by 地上の洞窟
================================================================================
  
  タイトル画面の前やタイトル画面の背景にマップを読み込み、演出として表示します。

================================================================================
 ■ 設定項目
=end #==========================================================================

module OpeningDemoMap
  
#===============================================================================
# ★ 全ての設定項目は文字列で指定することで、指定された値を動的に取得します。
#-------------------------------------------------------------------------------
# 例: OPDEMO_MAP_ID = 'rand(3) + 1' # 1~3番のマップをランダムに表示
#===============================================================================
  
  
# オープニングデモ =============================================================
  
  
  # OPDEMO_ENABLE : オープニングデモを有効にする
  # true → 有効 | false → 無効
  
  OPDEMO_ENABLE = false
  
  
  # OPDEMO_EVERY_TIME : オープニングデモを何度も表示
  # オープニングデモをタイトル画面が呼び出される度に呼び出します。
  # true → 有効 | false → 無効
  
  OPDEMO_EVERY_TIME = false
  
  
#-------------------------------------------------------------------------------
  
  
  # OPDEMO_MAP_ID : オープニングデモのマップのID
  
  OPDEMO_MAP_ID = 7
  
  
  # OPDEMO_PLAYER_POS_X : オープニングデモのプレイヤーの初期X座標
  # OPDEMO_PLAYER_POS_Y : オープニングデモのプレイヤーの初期Y座標
  
  OPDEMO_PLAYER_POS_X = 8
  OPDEMO_PLAYER_POS_Y = 6
  
  
  # OPDEMO_PLAYER_DIR : オープニングデモのマップのプレイヤーの初期の向き
  # 8 = ↑ | 2 = ↓ | 4 = ← | 6 = →|
  
  OPDEMO_PLAYER_DIR = 8
  
#-------------------------------------------------------------------------------
  
  
  # OPDEMO_SETUP_PARTY : オープニングデモ時、初期パーティのセットアップ実行
  # true → 有効 | false → 無効
  
  OPDEMO_SETUP_PARTY = false
  
  
#-------------------------------------------------------------------------------
  
  
  # OPDEMO_FADEIN_ENABLE : オープニングデモ開始時のフェードインを有効にする
  # true → 有効 | false → 無効
  
  OPDEMO_FADEIN_ENABLE = true
  
  
  # OPDEMO_FADEIN_SPEED : フェードインにかけるフレーム数
  
  OPDEMO_FADEIN_SPEED = 60
  
  
  # OPDEMO_COLORED_FADEIN : オープニングデモ開始時のフェードインの色を変更
  # true → 変更する | false → 変更しない
  
  OPDEMO_COLORED_FADEIN = false
  
  
  # OPDEMO_FADEIN_COLOR : フェードインの色の設定
  # OPDEMO_COLORED_FADEINが有効な時に適用されます。
  # [Red, Green, Blue] | 配列で指定 | 例 → [255, 128, 0]
  
  OPDEMO_FADEIN_COLOR = [0, 0, 0]
  
  
#-------------------------------------------------------------------------------
  
  
  # OPDEMO_FADEOUT_ENABLE : オープニングデモ終了時のフェードアウトを有効にする
  # true → 有効 | false → 無効
  
  OPDEMO_FADEOUT_ENABLE = true
  
  
  # OPDEMO_FADEOUT_SPEED : フェードアウトにかけるフレーム数
  
  OPDEMO_FADEOUT_SPEED = 60
  
  
  # OPDEMO_COLORED_FADEOUT : オープニングデモ終了時のフェードアウトの色を変更
  # true → 変更する | false → 変更しない
  
  OPDEMO_COLORED_FADEOUT = true
  
  
  # OPDEMO_FADEOUT_COLOR : フェードアウトの色の設定
  # OPDEMO_COLORED_FADEOUTが有効な時に適用されます。
  # [Red, Green, Blue] | 配列で指定 | 例 → [255, 128, 0]
  
  OPDEMO_FADEOUT_COLOR = [255, 255, 255]
  
  
# タイトル画面 =================================================================
  
  
  # TITLE_ENABLE : タイトル画面の背景にマップを使用する
  # true → 有効 | false → 無効
  
  TITLE_ENABLE = false
  
  
  # TITLE_MAP_ID : タイトル背景マップのID
  
  TITLE_MAP_ID = 8
  
  
  # TITLE_PLAYER_POS_X : タイトル背景マップのプレイヤーの初期X座標
  # TITLE_PLAYER_POS_Y : タイトル背景マップのプレイヤーの初期Y座標
  
  TITLE_PLAYER_POS_X = 8
  TITLE_PLAYER_POS_Y = 6
  
  
  # TITLE_PLAYER_DIR : タイトル背景マップのプレイヤーの初期の向き
  # 8 = ↑ | 2 = ↓ | 4 = ← | 6 = →|
  
  TITLE_PLAYER_DIR = 2
  
  
#-------------------------------------------------------------------------------
  
  
  # TITLE_SETUP_PARTY : タイトル背景マップ時、初期パーティのセットアップ実行
  # true → 有効 | false → 無効
  
  TITLE_SETUP_PARTY = false
  
  
#-------------------------------------------------------------------------------
  
  
  # TITLE_TRANSITION_SPEED : タイトル画面への遷移へかかるフレーム数
  # 未指定の場合はデフォルト(20)が使用されます
  
  TITLE_TRANSITION_SPEED = nil
  
  
#===============================================================================
# ■ ここからソースコード
#===============================================================================

  class << self
    attr_accessor :opdemo_played
    attr_accessor :last_title_scene

    def eval_value(value)
      value.is_a?(String) ? eval(value, TOPLEVEL_BINDING) : value
    end

    def opdemo_enable
      eval_value(OPDEMO_ENABLE)
    end

    def opdemo_every_time
      eval_value(OPDEMO_EVERY_TIME)
    end

    def opdemo_map_id
      eval_value(OPDEMO_MAP_ID)
    end

    def opdemo_x
      eval_value(OPDEMO_PLAYER_POS_X)
    end

    def opdemo_y
      eval_value(OPDEMO_PLAYER_POS_Y)
    end
    
    def opdemo_direction
      eval_value(OPDEMO_PLAYER_DIR)
    end

    def opdemo_setup_party
      eval_value(OPDEMO_SETUP_PARTY)
    end

    def opdemo_fadein_enable
      eval_value(OPDEMO_FADEIN_ENABLE)
    end

    def opdemo_fadein_speed
      eval_value(OPDEMO_FADEIN_SPEED)
    end

    def opdemo_colored_fadein
      eval_value(OPDEMO_COLORED_FADEIN)
    end

    def opdemo_fadein_color
      eval_value(OPDEMO_FADEIN_COLOR)
    end

    def opdemo_fadeout_enable
      eval_value(OPDEMO_FADEOUT_ENABLE)
    end

    def opdemo_fadeout_speed
      eval_value(OPDEMO_FADEOUT_SPEED)
    end

    def opdemo_colored_fadeout
      eval_value(OPDEMO_COLORED_FADEOUT)
    end

    def opdemo_fadeout_color
      eval_value(OPDEMO_FADEOUT_COLOR)
    end

    def title_enable
      eval_value(TITLE_ENABLE)
    end

    def title_map_id
      eval_value(TITLE_MAP_ID)
    end

    def title_x
      eval_value(TITLE_PLAYER_POS_X)
    end

    def title_y
      eval_value(TITLE_PLAYER_POS_Y)
    end

    def title_direction
      eval_value(TITLE_PLAYER_DIR)
    end

    def title_setup_party
      eval_value(TITLE_SETUP_PARTY)
    end
    
    def title_transition_speed
      eval_value(TITLE_TRANSITION_SPEED)
    end

    def setup_opdemo
      DataManager.create_game_objects
      $game_party.setup_starting_members if opdemo_setup_party
      $game_map.setup(opdemo_map_id)
      $game_player.moveto(opdemo_x, opdemo_y)
      $game_player.set_direction(opdemo_direction)
      $game_player.refresh
      Graphics.frame_count = 0
    end

    def setup_title_map
      DataManager.create_game_objects
      $game_party.setup_starting_members if title_setup_party
      $game_map.setup(title_map_id)
      $game_player.moveto(title_x, title_y)
      $game_player.set_direction(title_direction)
      $game_player.refresh
      Graphics.frame_count = 0
    end

    def opdemo_playable?
      return false unless opdemo_enable
      return false if last_title_scene.is_a?(Scene_OpeningDemo)
      (opdemo_every_time || !@opdemo_played)
    end
  end

  class Scene_OpeningDemo < Scene_Map
    def initialize
      OpeningDemoMap.last_title_scene = self
    end

    def start
      Graphics.freeze
      unless @next_scene
        OpeningDemoMap.setup_opdemo
        OpeningDemoMap.opdemo_played = true
      end
      super
    end

    def colored_fadein(duration, r, g, b)
      fade_loop(duration) {|v| @viewport.color.set(r, g, b, 255 - v)}
    end
    
    def colored_fadeout(duration, r, g, b)
      fade_loop(duration) {|v| @viewport.color.set(r, g, b, v) }
    end
    
    def perform_transition
      if @next_scene
        super
      else
        if OpeningDemoMap.opdemo_fadein_enable
          Graphics.transition(0)
          if OpeningDemoMap.opdemo_colored_fadein
            colored_fadein(
              OpeningDemoMap.opdemo_fadein_speed,
              *OpeningDemoMap.opdemo_fadein_color
            )
          else
            fadein(OpeningDemoMap.opdemo_fadein_speed)
          end
        else
          Graphics.transition(0)
        end
      end
    end

    def pre_title_scene
      if OpeningDemoMap.opdemo_fadeout_enable
        if OpeningDemoMap.opdemo_colored_fadeout
          colored_fadeout(
            OpeningDemoMap.opdemo_fadeout_speed,
            *OpeningDemoMap.opdemo_fadeout_color
          )
        else
          fadeout(OpeningDemoMap.opdemo_fadeout_speed)
        end
      end
    end

    def terminate
      Graphics.freeze
      @next_scene = SceneManager.scene
      super
    end
  end

  class Scene_TitleMap < Scene_Map
    def initialize(viewport)
      @viewport = viewport
    end

    def scene_changing?
      !SceneManager.scene.instance_of?(Scene_Title)
    end

    def create_main_viewport
      # do nothing
    end

    def update_basic
      # Graphics.update
      # Input.update
      update_all_windows
    end

    def update_for_fade
      Graphics.update
      Input.update
      update_basic
      $game_map.update(false)
      @spriteset.update
    end

    def update_transfer_player
      perform_transfer if $game_player.transfer?
    end
  end
end

module SceneManager
  class << self
    alias odm_run run
    def run
      @scene = nil
      @stack.clear
      OpeningDemoMap.last_title_scene = nil
      odm_run
    end
  end
end


class Scene_Title < Scene_Base
  alias odm_main main
  def main
    if OpeningDemoMap.opdemo_playable? && !@next_scene
      SceneManager.goto(OpeningDemoMap::Scene_OpeningDemo)
      return
    end
    OpeningDemoMap.last_title_scene = self
    odm_main
  end
  
  alias odm_start start
  def start
    odm_start
    odm_setup_title_map
  end

  alias odm_pre_terminate pre_terminate
  def pre_terminate
    @title_map.pre_terminate if @title_map
    odm_pre_terminate
  end

  # (☆再定義)
  def terminate
    super
    @title_map.terminate if @title_map
    @next_scene = SceneManager.scene
    dispose_background
    dispose_foreground
  end

  alias odm_update update
  def update
    @title_map.update if @title_map
    odm_update
  end

  alias odm_transition_speed transition_speed
  def transition_speed
    if !@next_scene && (speed = OpeningDemoMap.title_transition_speed)
      speed
    else
      odm_transition_speed
    end
  end

  # (☆再定義)
  def command_new_game
    close_command_window
    fadeout_all
    DataManager.setup_new_game
    $game_map.autoplay
    SceneManager.goto(Scene_Map)
  end

  def odm_setup_title_map
    if OpeningDemoMap.title_enable
      OpeningDemoMap.setup_title_map unless @next_scene
      @title_map = OpeningDemoMap::Scene_TitleMap.new(@viewport)
      @title_map.start
    end
  end
end

class Scene_Battle < Scene_Base
  alias am_pre_terminate pre_terminate
  def pre_terminate
    am_pre_terminate
    Graphics.fadeout(30) if SceneManager.scene_is?(OpeningDemoMap::Scene_OpeningDemo)
  end
end