扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 163|回复: 0

[转载发布] 菜单中使用带公共事件的选项

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    昨天 18:01
  • 签到天数: 114 天

    连续签到: 4 天

    [LV.6]常住居民II

    2339

    主题

    404

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    10635
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    13406

    灌水之王

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

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

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


    我的游戏里的效果:


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

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-3-15 16:05 , Processed in 0.138841 second(s), 54 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表