查看: 91|回复: 0

[转载发布] 【脚本研究】新人向·弹出菜单脚本 西瓜版V0.1

[复制链接]
  • TA的每日心情
    开心
    2024-5-10 09:55
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月三日(秋) | 显示全部楼层 |阅读模式
    这是一个可以让新手交流研究用的脚本,因为脚本比较简单。。。

    此脚本必须用到另外一个脚本——全键盘脚本。范例工程里面已经有全键盘脚本了

    效果就是在地图上点击一个键直接弹出一个菜单,然后通过上下键移动光标选择项目。

    效果图:





    弹出时有个移动的效果



    RUBY 代码
    1. #=============================================================================
    2. #弹出菜单脚本.西瓜版V0.1
    3. #作者:伊吹西瓜(朱鹭子)
    4. #此脚本为学习用原创的脚本,程序如有雷同(不包括效果),纯属巧合。
    5. #转载如果可以的话保留一下该信息吧。
    6. #应援幻想天空:[url]http://www.rpgsky.net/forum.php[/url]
    7. #=============================================================================
    8. #-----------------------------------------------------------------------------
    9. #●弹出菜单窗口
    10. #-----------------------------------------------------------------------------
    11. class Window_Mapcd < Window_Base
    12.   #--------------------------------------------------------------------------
    13.   # ● 初始化窗口
    14.   #--------------------------------------------------------------------------
    15.   def initialize
    16.     super(640, 0, 200, 480)
    17.     self.contents = Bitmap.new(width - 32, height - 32)
    18.     refresh
    19.   end
    20.   #--------------------------------------------------------------------------
    21.   # ● 刷新
    22.   #--------------------------------------------------------------------------
    23.   def refresh
    24.     #self.windowskin = RPG::Cache.windowskin("")
    25.     @dtcd1 = Bitmap.new("Graphics/Pictures/Equip.png")
    26.     rect1 = Rect.new(0,0,80,132)
    27.     self.contents.blt(0, 0, @dtcd1, rect1)
    28.     @dtcd2 = Bitmap.new("Graphics/Pictures/magic.png")
    29.     rect2 = Rect.new(0,0,80,132)
    30.     self.contents.blt(0, 120, @dtcd2, rect2)
    31.     @dtcd3 = Bitmap.new("Graphics/Pictures/target.png")
    32.     rect3 = Rect.new(0,0,80,132)
    33.     self.contents.blt(0, 240, @dtcd3, rect3)
    34.     @dtcd4 = Bitmap.new("Graphics/Pictures/caidan.png")
    35.     rect4 = Rect.new(0,0,80,132)
    36.     self.contents.blt(0, 360, @dtcd4, rect4)
    37.   end
    38. end
    39. #-----------------------------------------------------------------------------
    40. #●弹出菜单的鼠标
    41. #-----------------------------------------------------------------------------
    42. class Window_MapSb < Window_Base
    43.   #--------------------------------------------------------------------------
    44.   # ● 初始化窗口
    45.   #--------------------------------------------------------------------------
    46.   def initialize
    47.     super(540, 20, 100,132)
    48.     self.contents = Bitmap.new(width - 32, height - 32)
    49.     refresh
    50.   end
    51.   #--------------------------------------------------------------------------
    52.   # ● 刷新
    53.   #--------------------------------------------------------------------------
    54.   def refresh
    55.     self.windowskin = RPG::Cache.windowskin("")
    56.     @shubiao = Bitmap.new("Graphics/Pictures/shubiao.png")
    57.     shubiao = Rect.new(0,0,200,132)
    58.     self.contents.blt(0, 0, @shubiao, shubiao)
    59.   end
    60. end
    61. #==============================================================================
    62. # ■ Scene_Map
    63. #------------------------------------------------------------------------------
    64. #  处理地图画面的类。
    65. #==============================================================================
    66. class Scene_Map
    67.   #--------------------------------------------------------------------------
    68.   # ● 主处理
    69.   #--------------------------------------------------------------------------
    70.   def main
    71.     $mune = 0
    72.     $sbwz = 1  #这个是菜单栏目的数量
    73.     # 生成活动块
    74.     @spriteset = Spriteset_Map.new
    75.     # 生成信息窗口
    76.     @message_window = Window_Message.new
    77.     #生成弹出菜单
    78.     @mapcd_window = Window_Mapcd.new
    79.     @mapcd_window.z = 10001
    80.     #生成弹出鼠标
    81.     @mapsb_window = Window_MapSb.new
    82.     @mapsb_window.visible = false
    83.     @mapsb_window.z = 10004
    84.     tempBitmap = Sprite.new
    85.     tempBitmap.bitmap = Bitmap.new(640,480)
    86.     tempBitmap.bitmap.fill_rect(0, 0, 640, 480, Color.new(0,0,0,255))
    87.      # 执行过渡
    88.     Graphics.transition(0)
    89.     for i in0..10
    90.       tempBitmap.opacity-=25
    91.       Graphics.update
    92.     end
    93.     tempBitmap.bitmap.dispose
    94.     tempBitmap.dispose
    95.     # 主循环
    96.     loopdo
    97.       # 刷新游戏画面
    98.       Graphics.update
    99.       # 刷新输入信息
    100.       if$mune == 0#如果菜单弹出来的话,默认键盘无效,否则可能会发生冲突
    101.         Input.update
    102.       end
    103.       Keyboard.update
    104.       if$mune == 1  #判定菜单是否弹出来
    105.         if Keyboard.trigger?(Keyboard::VK_ESCAPE)
    106.           Audio.se_play("Audio/SE/005-System05",80,100)
    107.           if$mune == 1
    108.             $mune = 0
    109.           elsif$mune == 0
    110.             $mune = 1
    111.           end
    112.         end
    113.         if Keyboard.trigger?(Keyboard::VK_UP)
    114.           Audio.se_play("Audio/SE/005-System05",80,100)
    115.           @mapsb_window.y -= 120
    116.           $sbwz -= 1
    117.           if@mapsb_window.y < 20
    118.             @mapsb_window.y = 380
    119.             $sbwz = 4
    120.           end
    121.         end
    122.         if Keyboard.trigger?(Keyboard::VK_DOWN)
    123.           Audio.se_play("Audio/SE/005-System05",80,100)
    124.           @mapsb_window.y += 120
    125.           $sbwz += 1
    126.           if@mapsb_window.y > 380
    127.             @mapsb_window.y = 20
    128.             $sbwz = 1
    129.           end
    130.         end
    131.         if Keyboard.trigger?(Keyboard::VK_RETURN)
    132.           Audio.se_play("Audio/SE/005-System05",80,100)
    133.           case$sbwz
    134.           when1
    135.             $scene = Scene_Equip.new
    136.           when2
    137.             $scene = Scene_Skill.new
    138.           when3
    139.             $scene = Scene_Item.new
    140.           when4
    141.             $scene = Scene_Menu.new
    142.           end
    143.         end
    144.       end
    145.       # 刷新画面
    146.       update
    147.       # 如果画面切换的话就中断循环
    148.       if Keyboard.trigger?(Keyboard::VK_M)
    149.         Audio.se_play("Audio/SE/005-System05",80,100)
    150.           if$mune == 1
    151.             $mune = 0
    152.           elsif$mune == 0
    153.             $mune = 1
    154.           end
    155.       end
    156.       if$scene != self
    157.         break
    158.       end
    159.     end
    160.     # 标题画面切换中的情况下
    161.     if$scene.is_a?(Scene_Title)
    162.       @message_window.dispose
    163.       tempBitmap = Sprite.new
    164.       tempBitmap.bitmap = Bitmap.new(640,480)
    165.       tempBitmap.bitmap.fill_rect(0, 0, 640,480, Color.new(0,0,0,255))
    166.       tempBitmap.opacity = 0
    167.       for i in0..25
    168.         tempBitmap.opacity +=11
    169.         Graphics.update
    170.       end
    171.       tempBitmap.bitmap.dispose
    172.       tempBitmap.dispose
    173.       Graphics.transition(0)
    174.       @spriteset.dispose
    175.     else
    176.       @message_window.dispose
    177.       @mapcd_window.dispose
    178.       @mapsb_window.dispose
    179.       @spriteset.dispose
    180.     end
    181.   end
    182.   #--------------------------------------------------------------------------
    183.   # ● 刷新画面
    184.   #--------------------------------------------------------------------------
    185.   def update
    186.      if$mune == 1
    187.        if@mapcd_window.x != 440
    188.          @mapcd_window.x -= 10
    189.        end
    190.      end
    191.      if$mune == 0
    192.        if@mapcd_window.x != 640
    193.          @mapcd_window.x += 10
    194.        end
    195.      end
    196.      if@mapcd_window.x == 440
    197.        @mapsb_window.visible = true
    198.      else
    199.        @mapsb_window.visible = false
    200.        $sbwz = 1  
    201.        @mapsb_window.y = 20
    202.      end
    203.     @mapcd_window.update
    204.     # 循环
    205.     loopdo
    206.       # 按照地图、实例、主角的顺序刷新
    207.       # (本更新顺序不会在的满足事件的执行条件下成为给予角色瞬间移动
    208.       #  的机会的重要因素)
    209.       $game_map.update
    210.       $game_system.map_interpreter.update
    211.       $game_player.update
    212.       # 系统 (计时器)、画面刷新
    213.       $game_system.update
    214.       $game_screen.update
    215.       # 如果主角在场所移动中就中断循环
    216.       unless$game_temp.player_transferring
    217.         break
    218.       end
    219.       # 执行场所移动
    220.       transfer_player
    221.       # 处理过渡中的情况下、中断循环
    222.       if$game_temp.transition_processing
    223.         break
    224.       end
    225.     end
    226.     # 刷新活动块
    227.     @spriteset.update
    228.     # 刷新信息窗口
    229.     @message_window.update
    230.     # 刷新弹出窗口
    231.     @mapcd_window.update
    232.     # 刷新鼠标
    233.     @mapsb_window.update
    234.     # 游戏结束的情况下
    235.     if$game_temp.gameover
    236.       # 切换的游戏结束画面
    237.       $scene = Scene_Gameover.new
    238.       return
    239.     end
    240.     # 返回标题画面的情况下
    241.     if$game_temp.to_title
    242.       # 切换到标题画面
    243.       $scene = Scene_Title.new
    244.       return
    245.     end
    246.     # 处理过渡中的情况下
    247.     if$game_temp.transition_processing
    248.       # 清除过渡处理中标志
    249.       $game_temp.transition_processing = false
    250.       # 执行过渡
    251.       Graphics.transition(0)
    252.     end
    253.     # 显示信息窗口中的情况下
    254.     if$game_temp.message_window_showing
    255.       return
    256.     end
    257.     # 遇敌计数为 0 且、且遇敌列表不为空的情况下
    258.     if$game_player.encounter_count == 0and$game_map.encounter_list != []
    259.       # 不是在事件执行中或者禁止遇敌中
    260.       unless$game_system.map_interpreter.running? or
    261.              $game_system.encounter_disabled
    262.         # 确定队伍
    263.         n = rand($game_map.encounter_list.size)
    264.         troop_id = $game_map.encounter_list[n]
    265.         # 队伍有效的话
    266.         if$data_troops[troop_id] != nil
    267.           # 设置调用战斗标志
    268.           $game_temp.battle_calling = true
    269.           $game_temp.battle_troop_id = troop_id
    270.           $game_temp.battle_can_escape = true
    271.           $game_temp.battle_can_lose = false
    272.           $game_temp.battle_proc = nil
    273.         end
    274.       end
    275.     end
    276.     # 按下 B 键的情况下
    277.     if Input.trigger?(Input::B)
    278.       # 不是在事件执行中或菜单禁止中
    279.       unless$game_system.map_interpreter.running? or
    280.              $game_system.menu_disabled
    281.         # 设置菜单调用标志以及 SE 演奏
    282.         $game_temp.menu_calling = true
    283.         $game_temp.menu_beep = true
    284.       end
    285.     end
    286.     # 调试模式为 ON 并且按下 F9 键的情况下
    287.     if$DEBUGand Input.press?(Input::F9)
    288.       # 设置调用调试标志
    289.       $game_temp.debug_calling = true
    290.     end
    291.     # 不在主角移动中的情况下
    292.     unless$game_player.moving?
    293.       # 执行各种画面的调用
    294.       if$game_temp.battle_calling
    295.         call_battle
    296.       elsif$game_temp.shop_calling
    297.         call_shop
    298.       elsif$game_temp.name_calling
    299.         call_name
    300.       elsif$game_temp.menu_calling
    301.         call_menu
    302.       elsif$game_temp.save_calling
    303.         call_save
    304.       elsif$game_temp.debug_calling
    305.         call_debug
    306.       end
    307.     end
    308.   end
    309.   #--------------------------------------------------------------------------
    310.   # ● 调用战斗
    311.   #--------------------------------------------------------------------------
    312.   def call_battle
    313.     # 清除战斗调用标志
    314.     $game_temp.battle_calling = false
    315.     # 清除菜单调用标志
    316.     $game_temp.menu_calling = false
    317.     $game_temp.menu_beep = false
    318.     # 生成遇敌计数
    319.     $game_player.make_encounter_count
    320.     # 记忆地图 BGM 、停止 BGM
    321.     $game_temp.map_bgm = $game_system.playing_bgm
    322.     $game_system.bgm_stop
    323.     # 演奏战斗开始 SE
    324.     $game_system.se_play($data_system.battle_start_se)
    325.     # 演奏战斗 BGM
    326.     $game_system.bgm_play($game_system.battle_bgm)
    327.     # 矫正主角姿势
    328.     $game_player.straighten
    329.     # 切换到战斗画面
    330.     $scene = Scene_Battle.new
    331.   end
    332.   #--------------------------------------------------------------------------
    333.   # ● 调用商店
    334.   #--------------------------------------------------------------------------
    335.   def call_shop
    336.     # 清除商店调用标志
    337.     $game_temp.shop_calling = false
    338.     # 矫正主角姿势
    339.     $game_player.straighten
    340.     # 切换到商店画面
    341.     $scene = Scene_Shop.new
    342.   end
    343.   #--------------------------------------------------------------------------
    344.   # ● 调用名称输入
    345.   #--------------------------------------------------------------------------
    346.   def call_name
    347.     # 清除商店调用名称输入标志
    348.     $game_temp.name_calling = false
    349.     # 矫正主角姿势
    350.     $game_player.straighten
    351.     # 切换到名称输入画面
    352.     $scene = Scene_Name.new
    353.   end
    354.   #--------------------------------------------------------------------------
    355.   # ● 调用菜单
    356.   #--------------------------------------------------------------------------
    357.   def call_menu
    358. =begin
    359.     # 清除商店调用菜单标志
    360.     $game_temp.menu_calling = false
    361.     # 已经设置了菜单 SE 演奏标志的情况下
    362.     if $game_temp.menu_beep
    363.       # 演奏确定 SE
    364.       $game_system.se_play($data_system.decision_se)
    365.       # 清除菜单演奏 SE 标志
    366.       $game_temp.menu_beep = false
    367.     end
    368.     # 矫正主角姿势
    369.     $game_player.straighten
    370.     # 切换到菜单画面
    371.     $scene = Scene_Menu.new
    372. =end
    373.   end
    374.   #--------------------------------------------------------------------------
    375.   # ● 调用存档
    376.   #--------------------------------------------------------------------------
    377.   def call_save
    378.     # 矫正主角姿势
    379.     $game_player.straighten
    380.     # 切换到存档画面
    381.     $scene = Scene_Save.new
    382.   end
    383.   #--------------------------------------------------------------------------
    384.   # ● 调用调试
    385.   #--------------------------------------------------------------------------
    386.   def call_debug
    387.     # 清除商店调用调试标志
    388.     $game_temp.debug_calling = false
    389.     # 演奏确定 SE
    390.     $game_system.se_play($data_system.decision_se)
    391.     # 矫正主角姿势
    392.     $game_player.straighten
    393.     # 切换到调试画面
    394.     $scene = Scene_Debug.new
    395.   end
    396.   #--------------------------------------------------------------------------
    397.   # ● 主角的场所移动
    398.   #--------------------------------------------------------------------------
    399.   def transfer_player
    400.     # 清除主角场所移动调试标志
    401.     $game_temp.player_transferring = false
    402.     # 移动目标与现在的地图有差异的情况下
    403.     if$game_map.map_id != $game_temp.player_new_map_id
    404.       # 设置新地图
    405.       $game_map.setup($game_temp.player_new_map_id)
    406.     end
    407.     # 设置主角位置
    408.     $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
    409.     # 设置主角朝向
    410.     case$game_temp.player_new_direction
    411.     when2  # 下
    412.       $game_player.turn_down
    413.     when4  # 左
    414.       $game_player.turn_left
    415.     when6  # 右
    416.       $game_player.turn_right
    417.     when8  # 上
    418.       $game_player.turn_up
    419.     end
    420.     # 矫正主角姿势
    421.     $game_player.straighten
    422.     # 刷新地图 (执行并行事件)
    423.     $game_map.update
    424.     # 在生成活动块
    425.     @spriteset.dispose
    426.     @spriteset = Spriteset_Map.new
    427.     # 处理过渡中的情况下
    428.     if$game_temp.transition_processing
    429.       # 清除过渡处理中标志
    430.       $game_temp.transition_processing = false
    431.       # 执行过渡
    432.       $_t_Bitmap=Sprite.new
    433.       $_t_Bitmap.bitmap = Bitmap.new(640,480)
    434.       $_t_Bitmap.bitmap.fill_rect(0,0,640,480,Color.new(0,0,0,255))
    435.       Graphics.transition(0)
    436.       for i in0..10
    437.         $_t_Bitmap.opacity-=26
    438.         Graphics.update
    439.       end
    440.       $_t_Bitmap.bitmap.dispose
    441.       $_t_Bitmap.dispose
    442.     end
    443.     # 执行地图设置的 BGM、BGS 的自动切换
    444.     $game_map.autoplay
    445.     # 设置画面
    446.     Graphics.frame_reset
    447.     # 刷新输入信息
    448.     Input.update
    449.   end
    450. end
    复制代码



    范例工程:



                 本帖来自P1论坛作者伊吹西瓜,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=252259  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

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

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

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-20 22:50 , Processed in 0.064619 second(s), 44 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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