Project1

标题: 菜单中使用带公共事件的选项 [打印本页]

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

以下是新的sence(有很多没用的东西,不会删,但是貌似不影响)
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Scene_Chat
  3. #------------------------------------------------------------------------------
  4. #  处理聊天界面的类。
  5. #==============================================================================
  6.  
  7. class Scene_Chat
  8.   #--------------------------------------------------------------------------
  9.   # ● 主处理
  10.   #--------------------------------------------------------------------------
  11.   def main
  12.     # 生成活动块
  13.     @sprite = Sprite.new
  14.     @sprite.bitmap = RPG::Cache.picture("对话.png")
  15.     @spriteset = Spriteset_Chat.new
  16.     # 生成信息窗口
  17.     @message_window = Window_Message.new
  18.     # 执行过渡
  19.     Graphics.transition
  20.     # 主循环
  21.     loop do
  22.       # 刷新游戏画面
  23.       Graphics.update
  24.       # 刷新输入信息
  25.       Input.update
  26.       # 刷新画面
  27.       update
  28.       # 如果画面切换的话就中断循环
  29.       if $scene != self
  30.         break
  31.       end
  32.     end
  33.     # 准备过渡
  34.     Graphics.freeze
  35.     # 释放活动块
  36.     @spriteset.dispose
  37.     # 释放信息窗口
  38.     @message_window.dispose
  39.     @sprite.dispose
  40.     # 标题画面切换中的情况下
  41.     if $scene.is_a?(Scene_Title)
  42.       # 淡入淡出画面
  43.       Graphics.transition
  44.      Graphics.freeze
  45.     end
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 刷新画面
  49.   #--------------------------------------------------------------------------
  50.   def update
  51.     # 循环
  52.     loop do
  53.       # 按照地图、实例、主角的顺序刷新
  54.       # (本更新顺序不会在的满足事件的执行条件下成为给予角色瞬间移动
  55.       #  的机会的重要因素)
  56.       $game_map.update
  57.       $game_system.map_interpreter.update
  58.       $game_player.update
  59.       # 系统 (计时器)、画面刷新
  60.       $game_system.update
  61.       $game_screen.update
  62.       # 如果主角在场所移动中就中断循环
  63.       unless $game_temp.player_transferring
  64.         break
  65.       end
  66.       # 执行场所移动
  67.       transfer_player
  68.       # 处理过渡中的情况下、中断循环
  69.       if $game_temp.transition_processing
  70.         break
  71.       end
  72.     end
  73.     # 刷新活动块
  74.     @spriteset.update
  75.     # 刷新信息窗口
  76.     @message_window.update
  77.     # 游戏结束的情况下
  78.     if $game_temp.gameover
  79.       # 切换的游戏结束画面
  80.       $scene = Scene_Gameover.new
  81.       return
  82.     end
  83.     # 返回标题画面的情况下
  84.     if $game_temp.to_title
  85.       # 切换到标题画面
  86.       $scene = Scene_Title.new
  87.       return
  88.     end
  89.     # 处理过渡中的情况下
  90.     if $game_temp.transition_processing
  91.       # 清除过渡处理中标志
  92.       $game_temp.transition_processing = false
  93.       # 执行过渡
  94.       if $game_temp.transition_name == ""
  95.         Graphics.transition(20)
  96.       else
  97.         Graphics.transition(40, "Graphics/Transitions/" +
  98.           $game_temp.transition_name)
  99.       end
  100.     end
  101.     # 显示信息窗口中的情况下
  102.     if $game_temp.message_window_showing
  103.       return
  104.     end
  105.     # 遇敌计数为 0 且、且遇敌列表不为空的情况下
  106.     if $game_player.encounter_count == 0 and $game_map.encounter_list != []
  107.       # 不是在事件执行中或者禁止遇敌中
  108.       unless $game_system.map_interpreter.running? or
  109.              $game_system.encounter_disabled
  110.         # 确定队伍
  111.         n = rand($game_map.encounter_list.size)
  112.         troop_id = $game_map.encounter_list[n]
  113.         # 队伍有效的话
  114.         if $data_troops[troop_id] != nil
  115.           # 设置调用战斗标志
  116.           $game_temp.battle_calling = true
  117.           $game_temp.battle_troop_id = troop_id
  118.           $game_temp.battle_can_escape = true
  119.           $game_temp.battle_can_lose = false
  120.           $game_temp.battle_proc = nil
  121.         end
  122.       end
  123.     end
  124.     # 按下 B 键的情况下
  125.     if Input.trigger?(Input::B)
  126.       # 不是在事件执行中或菜单禁止中
  127.       unless $game_system.map_interpreter.running? or
  128.              $game_system.menu_disabled
  129.         # 设置菜单调用标志以及 SE 演奏
  130.         $game_temp.menu_calling = true
  131.         $game_temp.menu_beep = true
  132.       end
  133.     end
  134.     # 调试模式为 ON 并且按下 F9 键的情况下
  135.     if $DEBUG and Input.press?(Input::F9)
  136.       # 设置调用调试标志
  137.       $game_temp.debug_calling = true
  138.     end
  139.     # 不在主角移动中的情况下
  140.     unless $game_player.moving?
  141.       # 执行各种画面的调用
  142.       if $game_temp.battle_calling
  143.         call_battle
  144.       elsif $game_temp.shop_calling
  145.         call_shop
  146.       elsif $game_temp.name_calling
  147.         call_name
  148.       elsif $game_temp.menu_calling
  149.         call_menu
  150.       elsif $game_temp.save_calling
  151.         call_save
  152.       elsif $game_temp.debug_calling
  153.         call_debug
  154.       end
  155.     end
  156.   end
  157.   #--------------------------------------------------------------------------
  158.   # ● 调用战斗
  159.   #--------------------------------------------------------------------------
  160.   def call_battle
  161.     # 清除战斗调用标志
  162.     $game_temp.battle_calling = false
  163.     # 清除菜单调用标志
  164.     $game_temp.menu_calling = false
  165.     $game_temp.menu_beep = false
  166.     # 生成遇敌计数
  167.     $game_player.make_encounter_count
  168.     # 记忆地图 BGM 、停止 BGM
  169.     $game_temp.map_bgm = $game_system.playing_bgm
  170.     $game_system.bgm_stop
  171.     # 演奏战斗开始 SE
  172.     $game_system.se_play($data_system.battle_start_se)
  173.     # 演奏战斗 BGM
  174.     $game_system.bgm_play($game_system.battle_bgm)
  175.     # 矫正主角姿势
  176.     $game_player.straighten
  177.     # 切换到战斗画面
  178.     $scene = Scene_Battle.new
  179.   end
  180.   #--------------------------------------------------------------------------
  181.   # ● 调用商店
  182.   #--------------------------------------------------------------------------
  183.   def call_shop
  184.     # 清除商店调用标志
  185.     $game_temp.shop_calling = false
  186.     # 矫正主角姿势
  187.     $game_player.straighten
  188.     # 切换到商店画面
  189.     $scene = Scene_Shop.new
  190.   end
  191.   #--------------------------------------------------------------------------
  192.   # ● 调用名称输入
  193.   #--------------------------------------------------------------------------
  194.   def call_name
  195.     # 清除商店调用名称输入标志
  196.     $game_temp.name_calling = false
  197.     # 矫正主角姿势
  198.     $game_player.straighten
  199.     # 切换到名称输入画面
  200.     $scene = Scene_Name.new
  201.   end
  202.   #--------------------------------------------------------------------------
  203.   # ● 调用菜单
  204.   #--------------------------------------------------------------------------
  205.   def call_menu
  206.     # 清除商店调用菜单标志
  207.     $game_temp.menu_calling = false
  208.     # 已经设置了菜单 SE 演奏标志的情况下
  209.     if $game_temp.menu_beep
  210.       # 演奏确定 SE
  211.       $game_system.se_play($data_system.decision_se)
  212.       # 清除菜单演奏 SE 标志
  213.       $game_temp.menu_beep = false
  214.     end
  215.     # 矫正主角姿势
  216.     $game_player.straighten
  217.     # 切换到菜单画面
  218.     $scene = Scene_Menu.new
  219.   end
  220.   #--------------------------------------------------------------------------
  221.   # ● 调用存档
  222.   #--------------------------------------------------------------------------
  223.   def call_save
  224.     # 矫正主角姿势
  225.     $game_player.straighten
  226.     # 切换到存档画面
  227.     $scene = Scene_Save.new
  228.   end
  229.   #--------------------------------------------------------------------------
  230.   # ● 调用调试
  231.   #--------------------------------------------------------------------------
  232.   def call_debug
  233.     # 清除商店调用调试标志
  234.     $game_temp.debug_calling = false
  235.     # 演奏确定 SE
  236.     $game_system.se_play($data_system.decision_se)
  237.     # 矫正主角姿势
  238.     $game_player.straighten
  239.     # 切换到调试画面
  240.     $scene = Scene_Debug.new
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # ● 主角的场所移动
  244.   #--------------------------------------------------------------------------
  245.   def transfer_player
  246.     # 清除主角场所移动调试标志
  247.     $game_temp.player_transferring = false
  248.     # 移动目标与现在的地图有差异的情况下
  249.     if $game_map.map_id != $game_temp.player_new_map_id
  250.       # 设置新地图
  251.       $game_map.setup($game_temp.player_new_map_id)
  252.     end
  253.     # 设置主角位置
  254.     $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
  255.     # 设置主角朝向
  256.     case $game_temp.player_new_direction
  257.     when 2  # 下
  258.       $game_player.turn_down
  259.     when 4  # 左
  260.       $game_player.turn_left
  261.     when 6  # 右
  262.       $game_player.turn_right
  263.     when 8  # 上
  264.       $game_player.turn_up
  265.     end
  266.     # 矫正主角姿势
  267.     $game_player.straighten
  268.     # 刷新地图 (执行并行事件)
  269.     $game_map.update
  270.     # 在生成活动块
  271.     @spriteset.dispose
  272.     @spriteset = Spriteset_Map.new
  273.     # 处理过渡中的情况下
  274.     if $game_temp.transition_processing
  275.       # 清除过渡处理中标志
  276.       $game_temp.transition_processing = false
  277.       # 执行过渡
  278.       Graphics.transition(20)
  279.     end
  280.     # 执行地图设置的 BGM、BGS 的自动切换
  281.     $game_map.autoplay
  282.     # 设置画面
  283.     Graphics.frame_reset
  284.     # 刷新输入信息
  285.     Input.update
  286.   end
  287. end

以下是配套的活动块脚本(只刷新了图片):
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Spriteset_Chat
  3. #------------------------------------------------------------------------------
  4. #  处理聊天界面的类。本类在 Scene_Chat 类的内部使用。
  5. #==============================================================================
  6.  
  7. class Spriteset_Chat
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     # 生成显示端口
  13.     @viewport1 = Viewport.new(0, 0, 640, 480)
  14.     @viewport2 = Viewport.new(0, 0, 640, 480)
  15.     @viewport3 = Viewport.new(0, 0, 640, 480)
  16.     @viewport2.z = 200
  17.     @viewport3.z = 5000
  18.     # 生成图片
  19.     @picture_sprites = []
  20.     for i in 1..50
  21.       @picture_sprites.push(Sprite_Picture.new(@viewport2,
  22.         $game_screen.pictures[i]))
  23.     end
  24.     update
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 释放
  28.   #--------------------------------------------------------------------------
  29.   def dispose
  30.     # 释放图片
  31.     for sprite in @picture_sprites
  32.       sprite.dispose
  33.     end
  34.     @viewport1.dispose
  35.     @viewport2.dispose
  36.     @viewport3.dispose
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 刷新画面
  40.   #--------------------------------------------------------------------------
  41.   def update
  42.     # 刷新图片
  43.     for sprite in @picture_sprites
  44.       sprite.update
  45.     end
  46.     @viewport1.update
  47.     @viewport3.update
  48.   end
  49. end


我的游戏里的效果:


只是提供一个思路……用搜索功能没找到类似的·东西……
脚本放进去了要用的话自己还得再改改
作者: 哆啦溯    时间: 2014-7-25 11:32
赞一个{:2_275:}
作者: 一撸神    时间: 2014-7-25 13:48
楼主可以搞一个好感度的系统,直接影响结局。goodjob!




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1