设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2805|回复: 4
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
53
在线时间
158 小时
注册时间
2011-2-1
帖子
130
跳转到指定楼层
1
发表于 2012-10-22 14:19:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 伊吹西瓜 于 2012-10-22 15:47 编辑

这是一个可以让新手交流研究用的脚本,因为脚本比较简单。。。

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

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

效果图:





弹出时有个移动的效果



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



范例工程:


弹出菜单范例.rar (355.81 KB, 下载次数: 408)

Lv2.观梦者

梦石
0
星屑
560
在线时间
1286 小时
注册时间
2011-6-14
帖子
4086
2
发表于 2012-10-22 14:53:18 | 只看该作者
Target有道具的意思吗?(这不是槽点啊喂!
那么这个才是槽点:
RUBY 代码复制
  1. class Window_MapSb < Window_Base
M·a·p·S·b

点评

我勒个去。。。。  发表于 2012-10-24 10:53
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
53
在线时间
158 小时
注册时间
2011-2-1
帖子
130
3
 楼主| 发表于 2012-10-22 15:34:16 | 只看该作者
satgo1546 发表于 2012-10-22 14:53
Target有道具的意思吗?(这不是槽点啊喂!
那么这个才是槽点:
class Window_MapSb < Window_Base[/pre]M ...

没办法,谁叫鼠标拼音是ShuBiao

点评

英文 Mouse  发表于 2012-10-25 12:52
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
24 小时
注册时间
2010-12-26
帖子
17
4
发表于 2012-10-25 11:40:39 | 只看该作者
貌似。。要沉底了呢
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
687 小时
注册时间
2012-10-29
帖子
1543
5
发表于 2012-10-30 20:54:07 | 只看该作者
可以做成火炬之光那样吗?菜单完全隐藏在画面外,只显示一个钮,按下那个钮才弹出菜单,再按一次或者按空白键收回:





甚至,如果能用开关条件决定要不要出现那个钮,就更好了,这样可以尽可能不占用画面空间。
修改劇本中,仔細審查原來的劇情大綱,覺得有點不太滿意,嘗試編寫不同主角不同主線的劇情,希望能寫得出來。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-11 08:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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