じ☆ve冰风 发表于 2024-4-19 22:31:39

菜单中使用带公共事件的选项

一直想在菜单里加入伙伴对话什么的,但是会返回地图画面再执行公共事件,如果用显示图片作背景也会先淡出菜单再显示图片背景,很不美观。
脚本苦手……的我想了一个折中的办法……因为经试验得出只有在sence_map中才能执行公共事件,于是我复制了一个sence_map然后加以改动作为执行公共事件用的场景。
复制了一个Spriteset_Map加以改动作为配套的活动块在这个场景里刷新,于是就假装弄好了{:2_276:}

以下是新的sence(有很多没用的东西,不会删,但是貌似不影响)
RUBY 代码
#==============================================================================
# ■ Scene_Chat
#------------------------------------------------------------------------------
#  处理聊天界面的类。
#==============================================================================

class Scene_Chat
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def main
    # 生成活动块
    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.picture("对话.png")
    @spriteset = Spriteset_Chat.new
    # 生成信息窗口
    @message_window = Window_Message.new
    # 执行过渡
    Graphics.transition
    # 主循环
    loopdo
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if$scene != self
      break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放活动块
    @spriteset.dispose
    # 释放信息窗口
    @message_window.dispose
    @sprite.dispose
    # 标题画面切换中的情况下
    if$scene.is_a?(Scene_Title)
      # 淡入淡出画面
      Graphics.transition
   Graphics.freeze
    end
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
    # 循环
    loopdo
      # 按照地图、实例、主角的顺序刷新
      # (本更新顺序不会在的满足事件的执行条件下成为给予角色瞬间移动
      #的机会的重要因素)
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      # 系统 (计时器)、画面刷新
      $game_system.update
      $game_screen.update
      # 如果主角在场所移动中就中断循环
      unless$game_temp.player_transferring
      break
      end
      # 执行场所移动
      transfer_player
      # 处理过渡中的情况下、中断循环
      if$game_temp.transition_processing
      break
      end
    end
    # 刷新活动块
    @spriteset.update
    # 刷新信息窗口
    @message_window.update
    # 游戏结束的情况下
    if$game_temp.gameover
      # 切换的游戏结束画面
      $scene = Scene_Gameover.new
      return
    end
    # 返回标题画面的情况下
    if$game_temp.to_title
      # 切换到标题画面
      $scene = Scene_Title.new
      return
    end
    # 处理过渡中的情况下
    if$game_temp.transition_processing
      # 清除过渡处理中标志
      $game_temp.transition_processing = false
      # 执行过渡
      if$game_temp.transition_name == ""
      Graphics.transition(20)
      else
      Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    # 显示信息窗口中的情况下
    if$game_temp.message_window_showing
      return
    end
    # 遇敌计数为 0 且、且遇敌列表不为空的情况下
    if$game_player.encounter_count == 0and$game_map.encounter_list != []
      # 不是在事件执行中或者禁止遇敌中
      unless$game_system.map_interpreter.running? or
             $game_system.encounter_disabled
      # 确定队伍
      n = rand($game_map.encounter_list.size)
      troop_id = $game_map.encounter_list
      # 队伍有效的话
      if$data_troops != nil
          # 设置调用战斗标志
          $game_temp.battle_calling = true
          $game_temp.battle_troop_id = troop_id
          $game_temp.battle_can_escape = true
          $game_temp.battle_can_lose = false
          $game_temp.battle_proc = nil
      end
      end
    end
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 不是在事件执行中或菜单禁止中
      unless$game_system.map_interpreter.running? or
             $game_system.menu_disabled
      # 设置菜单调用标志以及 SE 演奏
      $game_temp.menu_calling = true
      $game_temp.menu_beep = true
      end
    end
    # 调试模式为 ON 并且按下 F9 键的情况下
    if$DEBUGand Input.press?(Input::F9)
      # 设置调用调试标志
      $game_temp.debug_calling = true
    end
    # 不在主角移动中的情况下
    unless$game_player.moving?
      # 执行各种画面的调用
      if$game_temp.battle_calling
      call_battle
      elsif$game_temp.shop_calling
      call_shop
      elsif$game_temp.name_calling
      call_name
      elsif$game_temp.menu_calling
      call_menu
      elsif$game_temp.save_calling
      call_save
      elsif$game_temp.debug_calling
      call_debug
      end
    end
end
#--------------------------------------------------------------------------
# ● 调用战斗
#--------------------------------------------------------------------------
def call_battle
    # 清除战斗调用标志
    $game_temp.battle_calling = false
    # 清除菜单调用标志
    $game_temp.menu_calling = false
    $game_temp.menu_beep = false
    # 生成遇敌计数
    $game_player.make_encounter_count
    # 记忆地图 BGM 、停止 BGM
    $game_temp.map_bgm = $game_system.playing_bgm
    $game_system.bgm_stop
    # 演奏战斗开始 SE
    $game_system.se_play($data_system.battle_start_se)
    # 演奏战斗 BGM
    $game_system.bgm_play($game_system.battle_bgm)
    # 矫正主角姿势
    $game_player.straighten
    # 切换到战斗画面
    $scene = Scene_Battle.new
end
#--------------------------------------------------------------------------
# ● 调用商店
#--------------------------------------------------------------------------
def call_shop
    # 清除商店调用标志
    $game_temp.shop_calling = false
    # 矫正主角姿势
    $game_player.straighten
    # 切换到商店画面
    $scene = Scene_Shop.new
end
#--------------------------------------------------------------------------
# ● 调用名称输入
#--------------------------------------------------------------------------
def call_name
    # 清除商店调用名称输入标志
    $game_temp.name_calling = false
    # 矫正主角姿势
    $game_player.straighten
    # 切换到名称输入画面
    $scene = Scene_Name.new
end
#--------------------------------------------------------------------------
# ● 调用菜单
#--------------------------------------------------------------------------
def call_menu
    # 清除商店调用菜单标志
    $game_temp.menu_calling = false
    # 已经设置了菜单 SE 演奏标志的情况下
    if$game_temp.menu_beep
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 清除菜单演奏 SE 标志
      $game_temp.menu_beep = false
    end
    # 矫正主角姿势
    $game_player.straighten
    # 切换到菜单画面
    $scene = Scene_Menu.new
end
#--------------------------------------------------------------------------
# ● 调用存档
#--------------------------------------------------------------------------
def call_save
    # 矫正主角姿势
    $game_player.straighten
    # 切换到存档画面
    $scene = Scene_Save.new
end
#--------------------------------------------------------------------------
# ● 调用调试
#--------------------------------------------------------------------------
def call_debug
    # 清除商店调用调试标志
    $game_temp.debug_calling = false
    # 演奏确定 SE
    $game_system.se_play($data_system.decision_se)
    # 矫正主角姿势
    $game_player.straighten
    # 切换到调试画面
    $scene = Scene_Debug.new
end
#--------------------------------------------------------------------------
# ● 主角的场所移动
#--------------------------------------------------------------------------
def transfer_player
    # 清除主角场所移动调试标志
    $game_temp.player_transferring = false
    # 移动目标与现在的地图有差异的情况下
    if$game_map.map_id != $game_temp.player_new_map_id
      # 设置新地图
      $game_map.setup($game_temp.player_new_map_id)
    end
    # 设置主角位置
    $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
    # 设置主角朝向
    case$game_temp.player_new_direction
    when2# 下
      $game_player.turn_down
    when4# 左
      $game_player.turn_left
    when6# 右
      $game_player.turn_right
    when8# 上
      $game_player.turn_up
    end
    # 矫正主角姿势
    $game_player.straighten
    # 刷新地图 (执行并行事件)
    $game_map.update
    # 在生成活动块
    @spriteset.dispose
    @spriteset = Spriteset_Map.new
    # 处理过渡中的情况下
    if$game_temp.transition_processing
      # 清除过渡处理中标志
      $game_temp.transition_processing = false
      # 执行过渡
      Graphics.transition(20)
    end
    # 执行地图设置的 BGM、BGS 的自动切换
    $game_map.autoplay
    # 设置画面
    Graphics.frame_reset
    # 刷新输入信息
    Input.update
end
end

以下是配套的活动块脚本(只刷新了图片):
RUBY 代码
#==============================================================================
# ■ Spriteset_Chat
#------------------------------------------------------------------------------
#  处理聊天界面的类。本类在 Scene_Chat 类的内部使用。
#==============================================================================

class Spriteset_Chat
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
    # 生成显示端口
    @viewport1 = Viewport.new(0, 0, 640, 480)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport3 = Viewport.new(0, 0, 640, 480)
    @viewport2.z = 200
    @viewport3.z = 5000
    # 生成图片
    @picture_sprites = []
    for i in1..50
      @picture_sprites.push(Sprite_Picture.new(@viewport2,
      $game_screen.pictures))
    end
    update
end
#--------------------------------------------------------------------------
# ● 释放
#--------------------------------------------------------------------------
def dispose
    # 释放图片
    for sprite in@picture_sprites
      sprite.dispose
    end
    @viewport1.dispose
    @viewport2.dispose
    @viewport3.dispose
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
    # 刷新图片
    for sprite in@picture_sprites
      sprite.update
    end
    @viewport1.update
    @viewport3.update
end
end


我的游戏里的效果:


只是提供一个思路……用搜索功能没找到类似的·东西……
脚本放进去了要用的话自己还得再改改
             本帖来自P1论坛作者哆啦溯,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=368747若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 菜单中使用带公共事件的选项