铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 1090|回复: 8

关于ShowMenu2函数,专门做一个说明

[复制链接]
发表于 2013-3-27 09:52 | 显示全部楼层 |阅读模式
本帖最后由 蓝烟清 于 2013-3-27 22:36 编辑

由于代码比较长,就把废话先放前边,希望大家能认真看应 苍天泰坦 的需求,我把这个函数做了一些修改,首先是灰色不能选择,第二个是可以指定某些选项不显示
每个参数的说明写在这

--基本参数和ShowMenu一样,有一些特别的进行着重说明
--menu 每个数据三个值,1名称,2执行函数,3显示方式(0灰色可选择,1正常显示,2不显示, 3灰色不可选择)
--itemNum 菜单的个数,通常在调用的时候 #menu就可以了
--numShow 每行显示的菜单个数
--showRow 一个版面显示的最大行数,如果可显示菜单个数达不到一个版面的数,函数会自动适应这个值
--str 是标题的文字,传nil不显示


在7.0之后的版本呢,还增加了一个特性,让选中项在版面的中间显示,超过中间就会显示下一行,而不像之前那样到达底部才会显示下一行。可能说得比较抽象,大家可以体验一下

代码很长,参数很多,理解很难,多用几次就了解了
  1. --基本参数和ShowMenu一样,有一些特别的进行着重说明
  2. --menu 每个数据三个值,1名称,2执行函数,3显示方式(0灰色可选择,1正常显示,2不显示, 3灰色不可选择)
  3. --itemNum 菜单的个数,通常在调用的时候 #menu就可以了
  4. --numShow 每行显示的菜单个数
  5. --showRow 一个版面显示的最大行数,如果可显示菜单个数达不到一个版面的数,函数会自动适应这个值
  6. --str 是标题的文字,传nil不显示
  7. function ShowMenu2(menu,itemNum,numShow,showRow,x1,y1,x2,y2,isBox,isEsc,size,color,selectColor, str)     --通用菜单函数
  8.     local w=0;
  9.     local h=0;   --边框的宽高
  10.     local i,j=0,0;
  11.     local col=0;     --实际的显示菜单项
  12.     local row=0;
  13.    
  14.     lib.GetKey();
  15.     Cls();
  16.    
  17.     --建一个新的table
  18.     local menuItem = {};
  19.     local numItem = 0;                --显示的总数
  20.    
  21.     --把可显示的部分放到新table
  22.     for i,v in pairs(menu) do
  23.             if v[3] ~= 2 then
  24.                     numItem = numItem + 1;
  25.                     menuItem[numItem] = {v[1],v[2],v[3],i};                --注意第4个位置,保存i的值
  26.             end
  27.     end
  28.    
  29.     --计算实际显示的菜单项数
  30.     if numShow==0 or numShow > numItem then
  31.         col=numItem;
  32.         row = 1;
  33.     else
  34.         col=numShow;
  35.         row = math.modf((numItem-1)/col);
  36.     end
  37.    
  38.     if showRow > row + 1 then
  39.             showRow = row + 1;
  40.     end

  41.     --计算边框实际宽高
  42.     local maxlength=0;
  43.     if x2==0 and y2==0 then
  44.         for i=1,numItem do
  45.             if string.len(menuItem[i][1])>maxlength then
  46.                 maxlength=string.len(menuItem[i][1]);
  47.             end
  48.         end
  49.                 w=(size*maxlength/2+CC.RowPixel)*col+2*CC.MenuBorderPixel;
  50.                 h=showRow*(size+CC.RowPixel) + 2*CC.MenuBorderPixel;
  51.     else
  52.         w=x2-x1;
  53.         h=y2-y1;
  54.     end

  55.     local start=0;             --显示的第一项

  56.     local curx = 1;          --当前选择项
  57.     local cury = 0;
  58.    
  59.     local current = curx + cury*showRow;

  60.     local keyPress =-1;
  61.     local returnValue =0;
  62.     if str ~= nil then
  63.             DrawStrBox(-1, y1 - size - CC.RowPixel, str, color, size)
  64.     end
  65.     local surid = lib.SaveSur(0, 0, CC.ScreenW, CC.ScreenH)
  66.                 if isBox==1 then
  67.                         DrawBox(x1,y1,x1+w,y1+h,C_WHITE);
  68.                 end
  69.     while true do
  70.             if col ~= 0 then
  71.               lib.LoadSur(surid, 0, 0)
  72.                     if isBox == 1 then
  73.                       DrawBox(x1, y1, x1 + (w), y1 + (h), C_WHITE)
  74.                     end
  75.                   end
  76.             for i=start,showRow+start-1 do
  77.                     for j=1, col do
  78.                             local n = i*col+j;
  79.                             if n > numItem then
  80.                                     break;
  81.                             end
  82.                            
  83.                 local drawColor=color;           --设置不同的绘制颜色
  84.                 if menuItem[n][3] == 0 or menuItem[n][3] == 3 then
  85.                         drawColor = M_DimGray
  86.                 end
  87.                 local xx = x1+(j-1)*(size*maxlength/2+CC.RowPixel) + CC.MenuBorderPixel
  88.                 local yy = y1+(i-start)*(size+CC.RowPixel) + CC.MenuBorderPixel
  89.                 if n==current then
  90.                     drawColor=selectColor;
  91.                                 lib.Background(xx, yy, xx + size*maxlength/2, yy + size, 128, color)
  92.                 end
  93.                                         DrawString(xx,yy,menuItem[n][1],drawColor,size);

  94.                           end
  95.             end
  96.             ShowScreen();
  97.                 keyPress=WaitKey();
  98.                 lib.Delay(CC.Frame);

  99.                 if keyPress==VK_ESCAPE then                  --Esc 退出
  100.                     if isEsc==1 then
  101.                         break;
  102.                     end
  103.                 elseif keyPress==VK_DOWN then                --Down
  104.                         if curx + (cury+1)*col <= numItem then
  105.                     cury = cury + 1;
  106.                     if cury > row then
  107.                             cury = row;
  108.                     elseif cury >= showRow/2 and cury <= row - showRow/2 and start <= row-showRow  then
  109.                                     start = start + 1;
  110.                     end
  111.                    end
  112.             
  113.                 elseif keyPress==VK_UP then                  --Up
  114.             cury = cury -1;
  115.             if cury < 0 then
  116.                 cury = 0;
  117.             elseif cury >= showRow/2-1 and cury < row - showRow/2 and start > 0 then
  118.                             start = start - 1;
  119.             end
  120.             
  121.                 elseif keyPress==VK_RIGHT then                --RIGHT
  122.                     curx = curx +1;
  123.                     if curx > col then
  124.                         curx = 1;
  125.                     elseif curx + cury*col > numItem then
  126.                                 curx = 1;
  127.                     end
  128.                 elseif keyPress==VK_LEFT then                  --LEFT
  129.                     curx = curx -1;
  130.                     if curx < 1 then
  131.                         curx = col;
  132.                         if curx + cury*col > numItem then
  133.                                 curx = numItem - cury*col;
  134.                         end
  135.                     end
  136.                 elseif   (keyPress==VK_SPACE) or (keyPress==VK_RETURN)  then
  137.                                 current = curx + cury*col;
  138.                                 if menuItem[current][3]==3 then
  139.                                        
  140.                     elseif menuItem[current][2]==nil then
  141.                         returnValue=current;
  142.                         break;
  143.                     else
  144.                         local r=menuItem[current][2](menuItem,current);               --调用菜单函数
  145.                         if r==1 then
  146.                             returnValue= -current;
  147.                             break;
  148.                                                 else
  149.                                 lib.LoadSur(surid, 0, 0)
  150.                                                         if isBox==1 then
  151.                                                                 DrawBox(x1, y1, x1 + (w), y1 + (h), C_WHITE)
  152.                                                         end
  153.                               end
  154.                     end
  155.                         end
  156.                         
  157.                         current = curx + cury*col;
  158.     end
  159.         lib.FreeSur(surid)
  160.         
  161.         --返回值,这个是取第4个位置的值
  162.         if returnValue > 0 then
  163.                 return menuItem[returnValue][4]
  164.         else
  165.                 return returnValue
  166.         end
  167. end
复制代码
效果图是这样



也可以这样


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-27 15:03 | 显示全部楼层
蓝大威武!
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-27 15:45 | 显示全部楼层
函数名改为ShowMenu3了,还真不能覆盖之前的ShowMenu2函数,否则攻略里的武功说明又要杯具了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-3-27 16:19 | 显示全部楼层
本帖最后由 蓝烟清 于 2013-3-27 16:21 编辑

回复 苍天泰坦 的帖子

哦,你这么说我倒是想起来了

武功的说明,没有武功的时候也是显示灰色的。。。。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-27 17:40 | 显示全部楼层
回复 蓝烟清 的帖子

是的,应该再加一个灰色可选的选项,不然就只能两个函数共存了

点评

嗯,那还是要改改的。 把灰色不可选定到4  发表于 2013-3-27 18:55
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-27 21:56 | 显示全部楼层
哇,一上来就有好东西。这个太实用了。马上抄下来。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-3-27 22:38 | 显示全部楼层
回复 苍天泰坦 的帖子

不用再定义多一个函数
稍稍改一下就好了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-27 23:02 | 显示全部楼层
回复 蓝烟清 的帖子

收到,我再去试试看
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-28 00:10 | 显示全部楼层
这次效果很好,选中项居中显示特别赞,之前的传送菜单下拉时正好被手指挡住,很不方便,现在好多了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-11-22 05:36

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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