Project1

标题: 环状菜单 [打印本页]

作者: 1196395297    时间: 2012-4-24 19:17
标题: 环状菜单
如图这样的,顺便要每个选项都可以设置图片的
再顺便把图片给我吧~~~~~~~~~ dsu_plus_rewardpost_czw
作者: lsu666666    时间: 2012-4-24 19:44
本帖最后由 lsu666666 于 2012-4-24 20:09 编辑

將將!~
腳本來源:
http://rpg.blue/forum.php?mod=viewthread&tid=106115

大略做了对应的图片更换的话自行调换就可以
Icons.rar (9.23 KB, 下载次数: 82)
图片的放置路径
Project1\Graphics\Icons

脚本中找到如下这里是设置图片的对应名称
ICON_SKILL = RPG::Cache.icon("MI_1")
{:2_273:}
AA 代码复制
  1. #==============================================================================
  2. # 本脚本来自[url=http://www.66RPG.com]www.66RPG.com[/url],使用和转载请保留此信息
  3. #==============================================================================
  4.  
  5.  
  6. # ————————————————————————————————————
  7.  
  8. # ▼▲▼ XRXS_MP 6. 环形菜单 ▼▲▼
  9. # by 和希
  10.  
  11. ###############################################################################
  12. # 环形菜单脚本(中文注释版)
  13. # writen by 和希
  14. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  15. # ▽导入
  16. # 1.在脚本编辑器的Main的前一个位置进行插入操作,然后将本脚本复制到新的页里
  17. # 2.Window_RingMenu最开始的7个RPG::Cache.icon("") 的 "" 的中的图标作用在右边
  18. #     的说明里标注了分别是什么项目的,可以根据需要进行修改
  19. #     (最下方禁止使用项目的图标建议使用类似“φ”的图标)
  20. #     (译者按:就是原图标上多一个横杠或是斜杠的图片)
  21. # 3.类常量定义最下方的 SE_STARTUP = "" 的 "" 的中是打开菜单时的音效的名字
  22. #
  23. ###############################################################################
  24.  
  25.  
  26. #==============================================================================
  27. # ■ Window_RingMenu
  28. #------------------------------------------------------------------------------
  29. #  显示环形菜单画面
  30. #==============================================================================
  31. class Window_RingMenu < Window_Base
  32.  
  33.   #--------------------------------------------------------------------------
  34.   # ○ 类常量定义
  35.   # 这里定义的变量是整个Window_RingMenu类都可以用的常量
  36.   # 所有变量名都是用大写,以区别其他变量
  37.   #--------------------------------------------------------------------------
  38.  
  39.   # 打开菜单使用的帧数,数字越小打开菜单时速度越快
  40.   STARTUP_FRAMES =  20
  41.   # 切换选项时使用的帧数,数字越小切换选项速度越快
  42.   MOVING_FRAMES = 5
  43.   # 环的半径(单位:象素),数字越大环越大←本句为废话
  44.   RING_R = 64
  45.  
  46.   # 定义各种图标,以便之后使用
  47.   ICON_ITEM = RPG::Cache.icon("MI_1")       # 「道具」项目的图标
  48.   ICON_SKILL = RPG::Cache.icon("MI_2")     # 「特技」项目的图标
  49.   ICON_EQUIP = RPG::Cache.icon("MI_3")    # 「装备」项目的图标
  50.   ICON_STATUS = RPG::Cache.icon("MI_4")    # 「状态」项目的图标
  51.   ICON_SAVE = RPG::Cache.icon("MI_5")       # 「存储」项目的图标
  52.   ICON_EXIT = RPG::Cache.icon("MI_6")      # 「结束」项目的图标
  53.   ICON_DISABLE= RPG::Cache.icon("")               # 禁止使用项目的图标
  54.   ICON_Lvup= RPG::Cache.icon("MI_7")
  55.   # 打开菜单时的音效
  56.   SE_STARTUP = "056-Right02"
  57.  
  58.   # 定义各种状态时的赋值。
  59.   # 译注:对于程序而言,个人感觉多此一举…不过的确方便了阅读
  60.   MODE_START = 1  # 动画开始时
  61.   MODE_WAIT  = 2  # 待机中
  62.   MODE_MOVER = 3  # 顺时针旋转(往右)
  63.   MODE_MOVEL = 4  # 逆时针旋转(往左)
  64.  
  65.   #--------------------------------------------------------------------------
  66.   # ○ 定义实例变量
  67.   #--------------------------------------------------------------------------
  68.   attr_accessor :index # ?
  69.  
  70.   #--------------------------------------------------------------------------
  71.   # ● 初始化对象
  72.   #--------------------------------------------------------------------------
  73.   def initialize( center_x, center_y )
  74.     super(0, 0, 640, 480)
  75.     self.contents = Bitmap.new(width-32, height-32)
  76.     self.opacity = 0
  77.     self.back_opacity = 0
  78.  
  79.     s1 = $data_system.words.item
  80.     s2 = $data_system.words.skill
  81.     s3 = $data_system.words.equip
  82.     s4 = "状态"
  83.     s5 = "储存"
  84.     s6 = "结束"
  85.     s7 = "加点"
  86.     @commands = [ s1, s2, s3, s4, s5, s6, s7 ]
  87.     @item_max = 7
  88.     @index = 0
  89.     @items = [ ICON_ITEM, ICON_SKILL, ICON_EQUIP, ICON_STATUS, ICON_SAVE, ICON_EXIT, ICON_Lvup ]
  90.     @disabled = [ false, false, false, false, false, false, false ]
  91.     @cx = center_x - 16
  92.     @cy = center_y - 16
  93.  
  94.     # 初始化动画
  95.     setup_move_start
  96.  
  97.     # 刷新
  98.     refresh
  99.  
  100.   end
  101.  
  102.   #--------------------------------------------------------------------------
  103.   # ● 刷新画面
  104.   #--------------------------------------------------------------------------
  105.   def update
  106.     super
  107.     refresh
  108.   end
  109.  
  110.   #--------------------------------------------------------------------------
  111.   # ● 画面描绘(刷新)
  112.   #--------------------------------------------------------------------------
  113.   def refresh
  114.     self.contents.clear
  115.  
  116.     # 选择描绘方式
  117.     case @mode
  118.     when MODE_START
  119.       refresh_start
  120.     when MODE_WAIT
  121.       refresh_wait
  122.     when MODE_MOVER
  123.       refresh_move(1)
  124.     when MODE_MOVEL
  125.       refresh_move(0)
  126.     end
  127.  
  128.     # 指令名描绘
  129.     rect = Rect.new(@cx - 272, @cy + 24, self.contents.width-32, 32)
  130.     self.contents.draw_text(rect, @commands[@index],1)
  131.   end
  132.  
  133.   #--------------------------------------------------------------------------
  134.   # ○ 画面生成
  135.   #--------------------------------------------------------------------------
  136.   def refresh_start
  137.     d1 = 2.0 * Math::PI / @item_max
  138.     d2 = 1.0 * Math::PI / STARTUP_FRAMES
  139.     r = RING_R - 1.0 * RING_R * @steps / STARTUP_FRAMES
  140.     for i in 0...@item_max
  141.       j = i - @index
  142.       d = d1 * j + d2 * @steps
  143.       x = @cx + ( r * Math.sin( d ) ).to_i
  144.       y = @cy - ( r * Math.cos( d ) ).to_i
  145.       draw_item(x, y, i)
  146.     end
  147.     @steps -= 1
  148.     if @steps < 1
  149.       @mode = MODE_WAIT
  150.     end
  151.   end
  152.  
  153.   #--------------------------------------------------------------------------
  154.   # ○ 画面再描绘(待机时)
  155.   #--------------------------------------------------------------------------
  156.   def refresh_wait
  157.     d = 2.0 * Math::PI / @item_max
  158.     for i in 0...@item_max
  159.       j = i - @index
  160.       x = @cx + ( RING_R * Math.sin( d * j ) ).to_i
  161.       y = @cy - ( RING_R * Math.cos( d * j ) ).to_i
  162.       draw_item(x, y, i)
  163.     end
  164.   end
  165.  
  166.   #--------------------------------------------------------------------------
  167.   # ○ 画面再描绘(旋转时)
  168.   #   mode : 旋转方向(0 : 逆时针旋转时,1 : 顺时针旋转时)
  169.   #--------------------------------------------------------------------------
  170.   def refresh_move( mode )
  171.     d1 = 2.0 * Math::PI / @item_max
  172.     d2 = d1 / MOVING_FRAMES
  173.     d2 *= -1 if mode != 0
  174.     for i in 0...@item_max
  175.       # 以下便是那华丽的曲线公式
  176.       j = i - @index
  177.       d = d1 * j + d2 * @steps
  178.       x = @cx + ( RING_R * Math.sin( d ) ).to_i
  179.       y = @cy - ( RING_R * Math.cos( d ) ).to_i
  180.       draw_item(x, y, i)
  181.     end
  182.     @steps -= 1
  183.     if @steps < 1
  184.       @mode = MODE_WAIT
  185.     end
  186.   end
  187.  
  188.   #--------------------------------------------------------------------------
  189.   # ● 描绘图片
  190.   # i : 项目编号
  191.   #--------------------------------------------------------------------------
  192.   def draw_item(x, y, i)
  193.     rect = Rect.new(0, 0, @items[i].width, @items[i].height)
  194.     if @index == i
  195.       self.contents.blt( x, y, @items[i], rect )
  196.       if @disabled[@index]
  197.         self.contents.blt( x, y, ICON_DISABLE, rect )
  198.       end
  199.     else
  200.       self.contents.blt( x, y, @items[i], rect, 128 )
  201.       if @disabled[@index]
  202.         self.contents.blt( x, y, ICON_DISABLE, rect, 128 )
  203.       end
  204.     end
  205.   end
  206.  
  207.   #--------------------------------------------------------------------------
  208.   # ● 项目无效化
  209.   # index : 项目编号
  210.   #--------------------------------------------------------------------------
  211.   def disable_item(index)
  212.     @disabled[index] = true
  213.   end
  214.  
  215.   #--------------------------------------------------------------------------
  216.   # ○ 初始化动画准备
  217.   #--------------------------------------------------------------------------
  218.   def setup_move_start
  219.     @mode = MODE_START
  220.     @steps = STARTUP_FRAMES
  221.     if SE_STARTUP != nil and SE_STARTUP != ""
  222.       Audio.se_play("Audio/SE/" + SE_STARTUP, 80, 100)
  223.     end
  224.   end
  225.  
  226.   #--------------------------------------------------------------------------
  227.   # ○ 回转动画准备
  228.   #--------------------------------------------------------------------------
  229.   def setup_move_move(mode)
  230.     if mode == MODE_MOVER
  231.       @index -= 1
  232.       @index = @items.size - 1 if @index < 0
  233.     elsif mode == MODE_MOVEL
  234.       @index += 1
  235.       @index = 0 if @index >= @items.size
  236.     else
  237.       return
  238.     end
  239.     @mode = mode
  240.     @steps = MOVING_FRAMES
  241.   end
  242.  
  243.   #--------------------------------------------------------------------------
  244.   # ○ 判断是否在动画中
  245.   #--------------------------------------------------------------------------
  246.   def animation?
  247.     return @mode != MODE_WAIT
  248.   end
  249. end
  250.  
  251.  
  252. #==============================================================================
  253. # ■ Window_RingMenuStatus
  254. #------------------------------------------------------------------------------
  255. #  显示环形菜单画面下同伴状态的窗口。
  256. #   本窗口定义与Window_MenuStatus雷同
  257. #==============================================================================
  258.  
  259. class Window_RingMenuStatus < Window_Selectable
  260.   #--------------------------------------------------------------------------
  261.   # ● 初始化对象
  262.   #--------------------------------------------------------------------------
  263.   def initialize
  264.     super(60, 64, 232, 352)
  265.     self.contents = Bitmap.new(width - 32, height - 32)
  266.     refresh
  267.     self.active = false
  268.     self.index = -1
  269.   end
  270.  
  271.   #--------------------------------------------------------------------------
  272.   # ● 刷新
  273.   #--------------------------------------------------------------------------
  274.   def refresh
  275.     self.contents.clear
  276.     @item_max = $game_party.actors.size
  277.     for i in 0...$game_party.actors.size
  278.       x = 80
  279.       y = 80 * i
  280.       actor = $game_party.actors[i]
  281.       draw_actor_graphic(actor, x - 30, y + 65)
  282.       draw_actor_name(actor, x, y + 24)
  283.     end
  284.   end
  285.  
  286.   #--------------------------------------------------------------------------
  287.   # ● 刷新光标矩形
  288.   #--------------------------------------------------------------------------
  289.   def update_cursor_rect
  290.     if @index < 0
  291.       self.cursor_rect.empty
  292.     else
  293.       self.cursor_rect.set(0, @index * 80, self.width - 32, 80)
  294.     end
  295.   end
  296. end
  297.  
  298. #==============================================================================
  299. # ■ Scene_Menu
  300. #------------------------------------------------------------------------------
  301. #   处理环形菜单的类。(再定义)
  302. #==============================================================================
  303.  
  304. class Scene_Menu
  305.   #--------------------------------------------------------------------------
  306.   # ● 初始化对象
  307.   # menu_index : 命令光标初始位置
  308.   #--------------------------------------------------------------------------
  309.   def initialize(menu_index = 0)
  310.     @menu_index = menu_index
  311.   end
  312.  
  313.   #--------------------------------------------------------------------------
  314.   # ● 主处理
  315.   #--------------------------------------------------------------------------
  316.   def main
  317.  
  318.     # 获取地图信息
  319.     # 这个是用来生成游戏画面作为背景,如果没有此行,那么打开菜单后背景就是全黑的
  320.     @spriteset = Spriteset_Map.new
  321.     # 获取角色坐标,并生成命令窗口
  322.     px = $game_player.screen_x - 15
  323.     py = $game_player.screen_y - 24
  324.     @command_window = Window_RingMenu.new(px,py)
  325.     @command_window.index = @menu_index
  326.     # 同伴人数为 0 的情况下
  327.     if $game_party.actors.size == 0
  328.       # 物品、特技、装备、状态无效化
  329.       @command_window.disable_item(0)
  330.       @command_window.disable_item(1)
  331.       @command_window.disable_item(2)
  332.       @command_window.disable_item(3)
  333.     end
  334.  
  335.     # 这个属性z的含意就是z坐标轴,这个坐标轴的0点在背景上
  336.     # 往上(就是背景以上的层)是正方向,换言之,z越大的窗口在显示时越排在前面
  337.     # 两个z相同的窗口,后生成的排在前面。数字差要在2以上才能产生效果
  338.     # 也就是说两个窗口的z坐标是“100和100”与“100和101”效果是一样的
  339.     # 总的来讲,这个属性z就是图块设置里的优先级…数字大的优先级高
  340.     @command_window.z = 100
  341.  
  342.     # 禁止存档的情况下
  343.     if $game_system.save_disabled
  344.       # 存档无效
  345.       @command_window.disable_item(4)
  346.     end
  347.  
  348.     # 生成环形菜单的状态窗口
  349.     # visible : 可视性
  350.     @status_window = Window_RingMenuStatus.new
  351.     @status_window.x = 20
  352.     @status_window.y = 50
  353.     @status_window.z = 100
  354.     @status_window.visible = false
  355.  
  356.     # 执行过渡
  357.     Graphics.transition
  358.     # 主循环
  359.     loop do
  360.       # 刷新游戏画面
  361.       Graphics.update
  362.       # 刷新输入信息
  363.       Input.update
  364.       # 刷新画面
  365.       update
  366.       # 如果切换画面就中断循环
  367.       if $scene != self
  368.         break
  369.       end
  370.     end
  371.     # 准备过渡
  372.     Graphics.freeze
  373.     # 释放窗口及地图画面
  374.     @spriteset.dispose
  375.     @command_window.dispose
  376.     @status_window.dispose
  377.   end
  378.  
  379.   #--------------------------------------------------------------------------
  380.   # ● 刷新画面
  381.   #--------------------------------------------------------------------------
  382.   def update
  383.     # 刷新窗口
  384.     @command_window.update
  385.     @status_window.update
  386.     # 命令窗口被激活的情况下: 调用 update_command
  387.     if @command_window.active
  388.       update_command
  389.       return
  390.     end
  391.     # 状态窗口被激活的情况下: 调用 update_status
  392.     if @status_window.active
  393.       update_status
  394.     return
  395.     end
  396.   end
  397.  
  398.   #--------------------------------------------------------------------------
  399.   # ● 刷新画面 (命令窗口被激活的情况下)
  400.   #--------------------------------------------------------------------------
  401.   def update_command
  402.     # 按下 B 键的情况下
  403.     if Input.trigger?(Input::B)
  404.       # 演奏取消 SE
  405.       $game_system.se_play($data_system.cancel_se)
  406.       # 切换的地图画面
  407.       $scene = Scene_Map.new
  408.       return
  409.     end
  410.  
  411.     # 按下 C 键的情况下
  412.     if Input.trigger?(Input::C)
  413.       # 同伴人数为 0、存档、游戏结束以外的场合
  414.       if $game_party.actors.size == 0 and @command_window.index < 4
  415.         # 演奏冻结 SE
  416.         $game_system.se_play($data_system.buzzer_se)
  417.         return
  418.       end
  419.  
  420.       # 命令窗口的光标位置分支
  421.       case @command_window.index
  422.       when 0 # 物品
  423.         # 演奏确定 SE
  424.         $game_system.se_play($data_system.decision_se)
  425.         # 切换到物品画面
  426.         $scene = Scene_Item.new
  427.       when 1 # 特技
  428.         # 演奏确定 SE
  429.         $game_system.se_play($data_system.decision_se)
  430.         # 激活状态窗口
  431.         @command_window.active = false
  432.         @status_window.active = true
  433.         @status_window.visible = true
  434.         @status_window.index = 0
  435.       when 2 # 装备
  436.         # 演奏确定 SE
  437.         $game_system.se_play($data_system.decision_se)
  438.         # 激活状态窗口
  439.         @command_window.active = false
  440.         @status_window.active = true
  441.         @status_window.visible = true
  442.         @status_window.index = 0
  443.       when 3 # 状态
  444.         # 演奏确定 SE
  445.         $game_system.se_play($data_system.decision_se)
  446.         # 激活状态窗口
  447.         @command_window.active = false
  448.         @status_window.active = true
  449.         @status_window.visible = true
  450.         @status_window.index = 0
  451.       when 4 # 存档
  452.         # 禁止存档的情况下
  453.         if $game_system.save_disabled
  454.           # 演奏冻结 SE
  455.           $game_system.se_play($data_system.buzzer_se)
  456.           return
  457.         end
  458.         # 演奏确定 SE
  459.         $game_system.se_play($data_system.decision_se)
  460.         # 切换到存档画面
  461.         $scene = Scene_Save.new
  462.       when 5 # 游戏结束
  463.         # 演奏确定 SE
  464.         $game_system.se_play($data_system.decision_se)
  465.         # 切换到游戏结束画面
  466.         $scene = Scene_End.new
  467.       when 6
  468.         $game_system.se_play($data_system.decision_se)  
  469.         $scene = Scene_End.new
  470.       when 7 # 加点
  471.         # 演奏确定 SE
  472.         $game_system.se_play($data_system.decision_se)
  473.         # 切换到加点窗口
  474.         $scene = Scene_Lvup.new
  475.       end
  476.       return
  477.     end
  478.  
  479.     # 动画中不能执行光标处理
  480.     # 这句的意思就是如果正处于动画中就return,这样下面的语句就不会执行了
  481.     # 换言之,如果正处于动画处理中,那么就无法移动菜单
  482.     return if @command_window.animation?
  483.  
  484.     # 按下 ↑ 或 ← 键的情况下
  485.     if Input.press?(Input::UP) or Input.press?(Input::LEFT)
  486.       # 演奏光标 SE
  487.       $game_system.se_play($data_system.cursor_se)
  488.       # 向左旋转
  489.       @command_window.setup_move_move(Window_RingMenu::MODE_MOVEL)
  490.       return
  491.     end
  492.  
  493.     # 按下 ↓ 或 → 键的情况下
  494.     if Input.press?(Input::DOWN) or Input.press?(Input::RIGHT)
  495.       # 演奏光标 SE
  496.       $game_system.se_play($data_system.cursor_se)
  497.       # 向右旋转
  498.       @command_window.setup_move_move(Window_RingMenu::MODE_MOVER)
  499.       return
  500.     end
  501.   end
  502.  
  503.   #--------------------------------------------------------------------------
  504.   # ● 刷新画面 (状态窗口被激活的情况下)
  505.   #--------------------------------------------------------------------------
  506.   def update_status
  507.     # 按下 B 键的情况下
  508.     if Input.trigger?(Input::B)
  509.       # 演奏取消 SE
  510.       $game_system.se_play($data_system.cancel_se)
  511.       # 激活命令窗口
  512.       @command_window.active = true
  513.       @status_window.active = false
  514.       @status_window.visible = false
  515.       @status_window.index = -1
  516.       return
  517.     end
  518.  
  519.     # 按下 C 键的情况下
  520.     if Input.trigger?(Input::C)
  521.       # 命令窗口的光标位置分支
  522.       case @command_window.index
  523.       when 1 # 特技
  524.         # 本角色的行动限制在 2 以上的情况下
  525.         if $game_party.actors[@status_window.index].restriction >= 2
  526.           # 演奏冻结 SE
  527.           $game_system.se_play($data_system.buzzer_se)
  528.           return
  529.         end
  530.         # 演奏确定 SE
  531.         $game_system.se_play($data_system.decision_se)
  532.         # 切换到状态画面
  533.         $scene = Scene_Skill.new(@status_window.index)
  534.       when 2 # 装備
  535.         # 演奏确定 SE
  536.         $game_system.se_play($data_system.decision_se)
  537.         # 切换到特技画面
  538.         $scene = Scene_Equip.new(@status_window.index)
  539.       when 3 # 装备
  540.         # 演奏确定 SE
  541.         $game_system.se_play($data_system.decision_se)
  542.         # 切换的装备画面
  543.         $scene = Scene_Status.new(@status_window.index)
  544.       when 7 # 加点
  545.         # 演奏确定 SE
  546.         $game_system.se_play($data_system.decision_se)
  547.         # 切换的装备画面
  548.         $scene = Scene_Lvup.new(@status_window.index)
  549.  
  550.       end
  551.       return
  552.     end
  553.   end
  554. end
  555.  
  556. #==============================================================================
  557. # 本脚本来自[url=http://www.66RPG.com]www.66RPG.com[/url],使用和转载请保留此信息
  558. #==============================================================================

作者: 1196395297    时间: 2012-4-25 20:15
lsu666666 发表于 2012-4-24 19:44
將將!~
腳本來源:
http://rpg.blue/forum.php?mod=viewthread&tid=106115

把加点那一个选项去掉,麻烦了




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