搜索附件  

弹出菜单范例.rar

 

【脚本研究】新人向·弹出菜单脚本 西瓜版V0.1:
这是一个可以让新手交流研究用的脚本,因为脚本比较简单。。。

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

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

效果图:





弹出时有个移动的效果



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在线咨询功能删除,谢谢。

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

GMT+8, 2024-9-21 14:44 , Processed in 0.057629 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部