广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 6805 个阅读者
 
<<   1   2  下页 >>(共 2 页)
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
amore12 手机 会员卡
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖 社区建设奖 优秀管理员勋章
总版主
级别: 总版主 该用户目前不上站
推文 x913 鲜花 x4339
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x2
[CS1.6] 菜单的制作(AMXMOD)
在CS中创建一个菜单系统,我们把它分解成两步.
 
首先必须建立并在屏幕上显示一个菜单

 
其次要注册菜单,这样才能让插件(AMXMOD)知道该怎么做!

 
当一个菜单的内容被设计好时

::::::::::::::::::::菜单系统范例:::::::::::::::::::::::

 菜单标题

 1. 操作1
 2. 操作2
 3. 操作3
 4. 操作4
 5. 操作5
 6. 操作6
 7. 操作7
 8. 操作8
 9. 操作9

 0. 退出
 ::::::::::::::::::::菜单范例结束:::::::::::::::::::::


 ::步骤1::

 我们首先要建立一个长字符串类型的变量来保存我们的菜单,并将我们菜单中的内容以文本的方式赋予这个变量;例如:操作1,操作2,操作3,等等...

 这个变量的建立看起大约像这样:

  代码

  new szMenuBody[256]

 这个大小256可以替换成你想要的任意大小,但是它必须能够储存你的菜单内容+1个字符数(一个中文等于两个字符),这个名字〝szMenubody〝也可以替换成你想要的任意的一个名字.

 现在已经知道如何建立一个字符串变量了,接下来就是如何把菜单内容赋予这个变量,这里有几种方法可以这样做到:

 我们可以用format() 函数, copy() 函数, 或则add() 函数来完成这个赋值过程.

 在实际的运用中,我发现format()函数是最好用的.现在我们将format()来建立我们的菜单.

 首先我们要将菜单的标题输入到变量中去,稍候我们将用这个标题来注册我们的菜单,在我们上面的例子里这个标题被叫做「菜单标题」。

 这段代码看起来应该像这样:

 代码

 new nLen = format( szMenuBody, 255, "\y菜单标题:^n" )

 这里建立了一个新的变量叫做"nLen",它将储存文本(字符)的实际长度,因此我们可以知道变量szMenuBody还剩下多少空间和已经用了多少空间,以上代码的意思是把〝\y菜单标题:^n〝拷贝到变量szMenuBody中去,其中\y的意思的文本的颜色是黄色(还有很多中颜色如:\w表示白色等等),^n表示回车换行的意思(当菜单被显示时将建立一个新的空白行).format函数的第二个参数表示szMenuBody可以储存255-1个字符串(254)(最后一个字符保留).format函数返回一个当前储存了多少个字符的数字.

 现在已经把标题输入到变量中去了,现在我们要把操作(操作1,操作2...操作9和退出)输入到变量中去,接下来我们还是用format函数来完成.

 代码:

 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w1. 操作1" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w2. 操作2" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w3. 操作3" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w4. 操作4" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w5. 操作5" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w6. 操作6" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w7. 操作7" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w8. 操作8" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w9. 操作9" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n^n\w0. 退出" )


 上面的代码本质上是一样的,nLen+表示自加,意思是format返回的数字与nLen变量原先所储存的数字相加在赋予nLen变量.当一行代码完成后,我们可以知道我们已经添加的菜单(内容)的实际长度为nLen,因此我们通过szMenuBody[nLen](format函数的第一个参数)可以安全的继续添加菜单内容,而不用担心后面添加的内容会覆盖前面的内容.format函数的第二个参数255-nLen则表示szMenuBody还剩下多少空间可以储存字符.

 现在做完这些我们已经成功地完成了菜单的设计,接下来我们要准备为每一个操作分配键(key),在分配键之前,首先要建立一个有规则的数字类型的变量来定向到〝bits〝,键盘上的每一个键位都有一个〝bits〝与之一一对应,键位1对应bit0,键位2对应bit1,键位3对应bit2...键位9对应bit8,键位0对应bit9

 创建这个数字变量看起来应该像这样.

 代码:

 new keys

 然后分配bits.

 代码:

 keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9)

 (1<<0) = bit 0 = key 1
 (1<<1) = bit 1 = key 2
 (1<<2) = bit 2 = key 3
 ...
 ...
 (1<<8 ) = bit 8 = key 9
 (1<<9) = bit 9 = key 0


 现在我们已经知道如何的建立一个菜单了.

 ---------------------------------------------------------------------
 我们把上面的代码合在一起看起来应该像这样
 ---------------------------------------------------------------------

CODE:


new szMenuBody[256]
new keys

new nLen = format( szMenuBody, 255, "\y菜单标题:^n" )

nLen += format( szMenuBody[nLen], 255-nLen, "^n\w1. 操作1" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w2. 操作2" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w3. 操作3" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w4. 操作4" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w5. 操作5" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w6. 操作6" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w7. 操作7" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w8. 操作8" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w9. 操作9" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n^n\w0. 退出" )

keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9)



 ----------------------------------------------------------------------

 接下来当这个菜单被请求时,我们要把他显示在屏幕上.

 请求菜单并把它显示在屏幕上,我们可以通过控制台命令(像amx_showmenu)或者say-chat命令(像say /menu),无论那种方法都可以由自己来决定,现在我们用say-chat命令来请求我们的菜单.
 
 首先我们要显示一个菜单,就要建立一个文本字符和一个整数数字,然后调用show_menu()函数来显示菜单.

 这个函数在amxmod.inc库里的原形是这样的:
 
 native show_menu(index,keys,const menu[], time = -1)

 前面提到的文本字符和整数数字我们在前面的代码中已经建立了就是szMenuBody和keys,在我们的代码中,它看起应该像这样:

 代码:

 show_menu( id, keys, szMenuBody, -1 )

 这里的id表示是玩家编号,也就是在哪个玩家的屏幕上显示菜单.第4个参数表示显示的时间,这里用-1表示显示时间是永远.

 我们把上面的代码合在一起看起来应该像这样

CODE


public ShowMenu( id )
{
new szMenuBody[256]
 new keys

 new nLen = format( szMenuBody, 255, "\y菜单标题:^n" )

 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w1. 操作1" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w2. 操作2" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w3. 操作3" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w4. 操作4" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w5. 操作5" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w6. 操作6" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w7. 操作7" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w8. 操作8" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w9. 操作9" )
 nLen += format( szMenuBody[nLen], 255-nLen, "^n^n\w0. 退出" )

 keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9)


show_menu( id, keys, szMenuBody, -1 )

return PLUGIN_CONTINUE
}


 

 现在菜单已经可以显示在玩家的屏幕上了,接下来我们就要告诉插件,当执行一个命令的时候要让菜单显示在屏幕上,这里我们要用'register_clcmd'函数(注册客户端命令),这段代码看起来应该像这样.

 代码:
 
 public plugin_init()
 {
 register_clcmd( "say /menu","ShowMenu", -1, "Shows The menu" )

 return PLUGIN_CONTINUE
 }


 这里plugin_init()是一个触发事件,意思为当插件加载运行时就执行这段代码.register_clcmd函数有4个参数,第1个参数就是我们要连接到菜单的命令,第2个参数表示当我们键入say/menu是将要执行什么函数.第3个参数是管理权限,由于这个菜单是所有玩家都可以调用,所以我们把它设置成-1(-1=无权限认证),第4个参数是描述这个命令是干什么的,可以被忽略.

 好了现在我们的第一步工作已经全部玩成了,接下来我们要开始第2步了

 ::步骤 2::

 现在我们已经注册了一个命令并把它连接到了一个函数上,当一个玩家键入命令后,这个菜单就可以显示在他的屏幕上了,但是这并不能做什么!当一个玩家选择一个操作后,这个菜单不能做任何事情,因为我们还没有注册菜单,我们仅仅只是注册了命令而已,只有当我们注册了一个菜单并把它连接到一个函数上去后,我们才能让菜单起作用.

 我们要注册一个菜单并把它连接到一个函数上去,要用到2个不同的函数,第一个函数是注册菜单id(编号)函数,在cs中菜单有很多,注册菜单id的目的就是当菜单被激活后要让插件(amxmod)知道是那个菜单被激活,这样它才能找到并执行相应的连接函数.

 注册菜单id用register_menuid()函数,这个函数它只有一个字符串参数 ,这个字符串实际上应该与一个以被用过的菜单标题相统一的(毕竟不可能有2个一样的菜单标题),所以我们的参数应该是这样〝\y菜单标题:〝.

 我们的代码应该像这样.

 代码:

 register_menuid("\y菜单标题:")

 这个函数返回的是一个整数数字(实际上就是菜单的id),在接下来我们要用的函数中就要用到这个菜单id,以便告诉amxmod是哪个菜单连接到哪个函数.

 接下来的函数就是'register_menucmd' ,把菜单和键连接到我们自定义的函数上去

 这第2个函数看起来像这样:

 register_menucmd( menuID, keys, "MenuCommand" )

 这里的第一个参数就是菜单的id,第二个参数就是我们在步骤1中所建立的keys,第3个参数就是我们要连接的函数

 所以我们建立的代码应该像这样

 代码

 register_menucmd(register_menuid("\y菜单标题:"), (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9), "MenuCommand" )

 注意:这里的keys参数可以用1023代替,并能正常工作!

 接下来就差最后一步了,就是定义MenuCommand(菜单连接到的函数)

 代码

 public MenuCommand( id, key )
 {
  client_print( id, print_console, "[AMX] Key=%d", key )
 client_print( id, print_chat, "[AMX] Key=%d", key )

  switch( key )
 {
  case 0: client_print( id, print_chat, "操作#1" )
 case 1: client_print( id, print_chat, "操作 #2" )
  case 2: client_print( id, print_chat, "操作 #3" )
 case 3: client_print( id, print_chat, "操作 #4" )
  case 4: client_print( id, print_chat, "操作 #5" )
  case 5: client_print( id, print_chat, "操作 #6" )
  case 6: client_print( id, print_chat, "操作 #7" )
  case 7: client_print( id, print_chat, "操作 #8" )
  case 8: client_print( id, print_chat, "操作 #9" )
  case 9: client_print( id, print_chat, "菜单操作退出" )
  }

 return PLUGIN_CONTINUE
 }



 ---------------------------------------------------------------------
  总代码
 ---------------------------------------------------------------------

include <amxmod>


public plugin_init()
{
register_clcmd( "say /menu","ShowMenu", -1, "Shows The menu" )

register_menucmd(register_menuid("\y菜单标题:"), 1023, "MenuCommand" )

return PLUGIN_CONTINUE
}

public ShowMenu( id )
{
new szMenuBody[256]
new keys

new nLen = format( szMenuBody, 255, "\y菜单标题:^n" )

nLen += format( szMenuBody[nLen], 255-nLen, "^n\w1. 操作1" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w2. 操作2" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w3. 操作3" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w4. 操作4" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w5. 操作5" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w6. 操作6" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w7. 操作7" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w8. 操作8" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w9. 操作9" )
nLen += format( szMenuBody[nLen], 255-nLen, "^n^n\w0. 退出" )

keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9)

show_menu( id, keys, szMenuBody, -1 )

return PLUGIN_CONTINUE
}

public MenuCommand( id, key )
{
client_print( id, print_console, "[AMX] Key=%d", key )
client_print( id, print_chat, "[AMX] Key=%d", key )

switch( key )
{
case 0: client_print( id, print_chat, "操作 #1" )
case 1: client_print( id, print_chat, "操作 #2" )
case 2: client_print( id, print_chat, "操作 #3" )
case 3: client_print( id, print_chat, "操作 #4" )
case 4: client_print( id, print_chat, "操作 #5" )
case 5: client_print( id, print_chat, "操作 #6" )
case 6: client_print( id, print_chat, "操作 #7" )
case 7: client_print( id, print_chat, "操作 #8" )
case 8: client_print( id, print_chat, "操作 #9" )
case 9: client_print( id, print_chat, "菜单操作退出" )
}

return PLUGIN_HANDLED
}





本资源主要来源于djeyl.net forums \ AMX Mod \ [EN] Scripting Support / Help 。作者:xeroblood!



献花 x1 回到顶端 [楼 主] From:台湾 | Posted:2008-11-26 00:59 |
chuchung712 会员卡
个人头像
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖 社区建设奖 优秀管理员勋章 特殊贡献奖-2
知名人士
级别: 知名人士 该用户目前不上站
推文 x774 鲜花 x1169
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

完全不明白你说什么喔... 表情
可以说清楚点吗?


没有理想的世界
献花 x0 回到顶端 [1 楼] From:香港有线宽频 | Posted:2009-04-14 18:17 |
Yuji-Saka 手机
个人头像
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖
小有名气
级别: 小有名气 该用户目前不上站
推文 x72 鲜花 x142
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

很用心也很深澳

可能开伺服器的会需要多学些 表情


献花 x0 回到顶端 [2 楼] From:台湾中华电信HINET | Posted:2009-04-14 21:11 |
卍怪力乱神卍 手机
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x10
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

太深奥啦 表情 我都看不懂 表情
希望直接教我们作法 不要太难懂 表情
一些函数都快要把我弄死了 表情
看来我会恶梦连篇啊 表情
大家 来帮我加油 度过这个难关吧 表情
我不要这些东西 表情 我要更简单的 表情
拜托啰


回文回文回文
献花 x0 回到顶端 [3 楼] From:欧洲 | Posted:2009-07-29 20:46 |
brian1998
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x32
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

简便一点或许会明白


献花 x0 回到顶端 [4 楼] From:香港 | Posted:2009-07-29 20:54 |
smilevirus
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x13
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

看起来很复杂

不过还是感谢你的分享


献花 x0 回到顶端 [5 楼] From:台湾中华电信股份有限公司 | Posted:2011-07-17 13:22 |
e860904e
个人头像
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x3
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

好复杂 表情
看来没有写插件的底子 和英文底子
是很难懂的 表情


献花 x0 回到顶端 [6 楼] From:台湾中华电信股份有限公司 | Posted:2011-07-25 12:59 |
离之彦 会员卡
个人头像
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖 社区建设奖
小有名气
级别: 小有名气 该用户目前不上站
推文 x400 鲜花 x513
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

老实说......不懂插件的真的会看不懂....

所以楼上看不懂的...建议先去多看插件....再来看别人的教学比较实在...




[正题]

菜单的制作....刚好可以拿来做nav的制做菜单~

这样制作nav就不用到控制台打指令了~~

感谢教学~

话说...这不是在教学区嘛?大佬@@?


献花 x0 回到顶端 [7 楼] From:台湾中华电信股份有限公司 | Posted:2011-07-26 10:19 |
aygrq5566
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x6
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

好乱= =


献花 x0 回到顶端 [8 楼] From:台湾中华电信股份有限公司 | Posted:2011-07-26 16:11 |
kenny410
个人文章 个人相簿 个人日记 个人地图
路人甲
级别: 路人甲 该用户目前不上站
推文 x0 鲜花 x1
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

完全唔明白=] 表情


献花 x0 回到顶端 [9 楼] From:香港和记电讯 | Posted:2011-07-26 16:51 |

<<   1   2  下页 >>(共 2 页)
首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.143618 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言