[Grief.QQ] 发表于 2005-8-31 18:36:38

[原创]用选择菜单来实现表情插件--如何制作选择菜单

AMX0.99+CS1.5测试通过
昨天我们一步步地做了表情插件,但是还不能满足我们的需要,为什么呢,因为我想大家都去不停的按下Y键,然后haha,yumen,aini。。。。。。等等,相信大家的手是很累的,而且普通玩家也不可能把全部的命令都记住,所以,今天我们就来为它加个选择菜单,只需要输入一个命令,然后就提供左右的表情菜单供大家选择,玩家只需要按下1234567890进行选择就可以了。
好了,我们大家动手开始作吧。

首先还是构想一下整个程序的框架,我建议大家最好先这么做,盖房子还要先画图纸不是么?
1。当玩家say命令的时候,屏幕上出现选择菜单。
2。一个菜单选择完毕以后,程序开始执行。
3。开始判断玩家权限,状态是否符合程序要求,获取ID索引,X坐标轴位置
4。当玩家选择菜单的时候,程序开始执行相应的模块,比如say /haha,然后马上关掉菜单显示

好了,简单吧,接下来我们就开始动手做吧!

AMX 在菜单制作方面为我们提供了几个命令,我们需要的是下面三个命令
1。show_menu(id)
单从字面上理解,就是显示菜单,这个当然必须了。
2。register_menuid("菜单的名称")
在程序中注册菜单的ID索引,以方便程序调用。
3。register_menucmd(register_menuid(id),"菜单使用热键","菜单所调用的程序模块名称")
在程序中注册菜单所要执行的命令,比如按下1键,那么程序就开始执行对应的模块,如果对该模块没有注册的话,那么当你按下1键的时候,什么事情都不会发生。
4。注意这些命令的大小写,它们是小写的!!!

好了,了解了这些,我们可以正式开始做了。
首先,要注册我们的插件,
public plugin_init()
{
        register_plugin("face show","0.1","")
        register_clcmd( "say /FaceMenu","ShowMenu",0)//注册客户端命令,名称及执行权限
        register_menucmd(register_menuid("\wFaceMenu:"),(1<<0|1<<1),"MenuCommand")
//上面表示:注册菜单的命令(菜单的ID为FaceMenu,菜单有两个选择,执行命令的模块名称)
        return PLUGIN_CONTINUE
}
其中,\w 表示的是菜单名称的颜色,\y是黄色,依此类推。
FaceMenu表示的是菜单的总体名称,它将显示在整个菜单的最上面,就像下面这样
        FaceMenu
        1....
        2....
        .....

1<<0|1<<1我说明下,这里表示的是按键信息,键盘上的数字键是1-0,但是在AMX中,菜单的ID是由0-9来表示的,所以,当你有很多菜单,当然,最多十个菜单,那么,对应的按键如果按顺序来就是
1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9
这里面符号“|”是不能缺少的,它的位置如上,如果你需要创建两个菜单,那么最正确的应该是
1<<0|1<<9
如果在屏幕上显示就是
1.menu
0.exit
因为只有一个选择,所以用0来表示退出就要好看很多,不然,
1.menu
2.exit
这样就不怎么好看,当然,你可以这么做,只要你觉得无所谓。

第二步,注册完插件后,我们就要写菜单的显示了。
在我们注册插件的时候,菜单的执行模块名称为showmenu,所以,这里我们就开始定义
public ShowMenu(id)//开始定义并获取MENU-ID索引,
{
        new testMenu//定义一个字符串组,它最大支持128-1=127个字符,因为系统保留一个字符,这里你可以设置的很大,比如,256,512,但是不管如何,它都只能支持N-1个字符,而且你必须要保证它所能包含的字符串的数量要大于你的所有菜单的字符串的数量的总和!!,这里我只是举例,两个菜单而已,所以128就足够了。
        new keys//定义按键信息
        new newLen = format(testMenu,127,"\wFaceMenu:^n")
//这里大家可能不太理解,让我们先抛开代码猜想一下(没有丰富的想象力,就没有丰富的创造,呵呵),假设一个固定容积的东西,让你往里面装一些指定的东西,你该怎么做?不管三七二十一全部塞进去?还是一件件的放进去?还是先计算一下每个东西的大小,然后进行排列再放进去?从理论上来说,第三种方法是最科学的方法不是么?好了,回到代码,AMX为我们提供了format()命令,它的作用我并没找到说明,但是从我的理解上来看,就是将字符串进行格式化,以便符合系统读取这里,我们定义一个变量newLen,系统把菜单的名称及换行符转换成字符,然后用我们定义的字符串大小127减掉多余的,并把值赋给newLen,这样,newLen就得到了最适合的字符串大小。简单的说,就是把多的部分去掉留作其他用。
        newLen += format( testMenu, 127-newLen, "^n\w1. HaHa" )
//这里,新的一行产生了,他就是上面多处来的部分,分配给了 "^n\w1.HaHa",并且把多的部分去掉留作他用。
        newLen += format( testMenu, 127-newLen, "^n^n\w0. Exit" )
//这里同上,反复如此,也许你会问,为什么不重新定义一个值呢,我想说,那样做不浪费吗?变量的作用什么?就是用完就丢,说道这里,明白了吧,这里一段程序是顺序执行的,newLen的值已经产生而且已经显示在屏幕上了,所以,结果达到了,就可以不需要了,但是我们可以在下一段中继续使用,因为它是已经定义过的,这样作是为了节省资源。节省代码。
        keys = (1<<0|1<<9)
//这里正如我上面说的,我只做了两个选项,所以,只赋值keys两个按键信息,一个是数字1,一个是数字0
        show_menu(id,keys,testMenu,-1)
//这里开始,获取菜单的ID索引,和菜单的热键,菜单的字符串值并且在屏幕上显示等待用户激活。这里-1表示在等待激活之前一直保留,当然你可以自己定义多少时间后菜单消失。
        return PLUGIN_CONTINUE
//程序继续,这里不用PLUGIN_HANDLED的原因是因为我们仅仅做到了菜单的显示和热键的相应,但是还不能实现命令的执行,想要能执行命令,我们还要继续定义菜单的命令。

}

第三步,我们上面注册插件信息中,表明菜单的命令模块是MenuCommand,OK,继续,
public MenuCommand(id,key)
//这里定义菜单的命令模块,并且获取玩家选择的菜单ID,热键等信息。
{
        switch( key )
//这里学过一些编程的朋友也许熟悉了,amx也提供了switch(){}命令,它表示一个开关,里面包含各种事件的触发信息。
这里包含的就是热键的触发信息。
        {
        case 0: cmdFace(id)//定义事件一,这里我用的是昨天发表的表情插件中定义好的程序模块,一会儿我会提供完整的代码给大家的。
        case 1: return PLUGIN_HANDLED//定义事件二,程序结束。也就是退出。
        }
        return PLUGIN_HANDLED
}

好了,不知不觉又写了这么多,我用的语言应该比较易懂了,实在看不明白的就跟贴,希望通过本文,大家都能制作出自己有特色的菜单来,下面我附上已经写好的代码和编译过的插件,感兴趣的朋友可以试验一下,游戏中抬头看,然后say /facemenu ,当你选择1的时候,你头上就会出现C4的模型,当你选择0的时候,菜单就退出了。当然,还是那句话,我不是要写什么插件,只是想通过这个过程,让大家都能分享到我学到的东西,好了,感兴趣的朋友可以自己往里面添加修改一些代码,大家不要感觉到有多困难,完全可以自己动手写。

这里是代码和编译好的插件,注意,这里菜单只有两个,一个显示表情,一个退出菜单,当然,表情也只有一个,大家可以自己试着自己添加菜单和更多的表情!
各中不足还望高手指正!

Enigmaya 发表于 2005-8-31 19:32:22

回复: [原创]用选择菜单来实现表情插件--如何制作选择菜单

哈哈,今天又没事干啦???

不错,不错。赞一个,:d

另外关于函数的解释,你可以看看amxx的,官网上有函数的查询。

nwb13 发表于 2005-8-31 21:16:48

回复: [原创]用选择菜单来实现表情插件--如何制作选择菜单

写的挺好的,给个建议,下次把涉及到的代码部分用code标签标起来,最好再上点色,就更清楚了。
再加个精华,望Grief继续努力带来更多好东西。

ps:是否愿意加入CHM小组?愿意的话可随时PM我或者wzf828

[Grief.QQ] 发表于 2005-8-31 21:43:22

回复: [原创]用选择菜单来实现表情插件--如何制作选择菜单

啊,由于工作的原因空闲时间是蛮多的,以至于我天天白天夜里没事就看碟,在单位里我有自己的电脑,但是只有办公室这边的电脑房(一共才七台,三台P166/48M,四台C1.2,而且每个人最多只能上两个小时,还不给玩游戏,郁闷吧!!)才有宽带,宿舍是没有的,上网极其不方便,不知道这条件怎么加入CHM小组,哎。。。。。。。
我都不好意思了。。。

nwb13 发表于 2005-8-31 22:19:28

回复: [原创]用选择菜单来实现表情插件--如何制作选择菜单

Post by '
']啊,由于工作的原因空闲时间是蛮多的,以至于我天天白天夜里没事就看碟,在单位里我有自己的电脑,但是只有办公室这边的电脑房(一共才七台,三台P166/48M,四台C1.2,而且每个人最多只能上两个小时,还不给玩游戏,郁闷吧!!)才有宽带,宿舍是没有的,上网极其不方便,不知道这条件怎么加入CHM小组,哎。。。。。。。
我...
比我强啊,呵呵,我现在只能上网吧了,你还不用花钱,我得花钱上,再说了,小组里也不是每个人都天天在线,都是用空余时间的。

BoeZombie 发表于 2005-8-31 23:33:05

回复: [原创]用选择菜单来实现表情插件--如何制作选择菜单

支持~~~!

:qqb026: 大奔着两天没音信

:qqb001: 不用等他决定了
:qqb011: 欢迎加入
:qqb018:

[Grief.QQ] 发表于 2005-9-1 13:04:44

回复: [原创]用选择菜单来实现表情插件--如何制作选择菜单

呵呵,好,好!

今天早上用循环语句完成了分页和分级菜单的制作,已经测试完毕,下午或者晚上把制作过程和注释发上来,看看有没有时间咯,其中附带的会讲一下参数的替代调用,例如%d、%s,我尽量用浅显易懂的语言来解释整个过程,好让更多的人了解和掌握基本的语法和格式。
好了,要去忙了,下午单位领导因为国庆节的节目要排练,我得去伺候那些领导,所以下午可能没时间,郁闷。。。。。。

BoeZombie 发表于 2005-9-1 17:46:58

回复: [原创]用选择菜单来实现表情插件--如何制作选择菜单

:qqb025: 哇,那太棒了~!

:qqb015: 好好学习

:qqb018:

ssj4gogeta 发表于 2005-9-1 19:31:24

回复: [原创]用选择菜单来实现表情插件--如何制作选择菜单

发现一个问题,菜单中2行的间隔太开了,中间像多隔了一行样。。
能否改正?

[Grief.QQ] 发表于 2005-9-1 19:57:09

回复: [原创]用选择菜单来实现表情插件--如何制作选择菜单

哦,怪我没说明白^n表示换行,
"^n^n\w0. Exit" 这里我用了两个换行,以方便突出显示EXIT,所以中间多空了行,呵呵,两个菜单的时候你觉得不怎么好看,但是菜单多的时候你就不会这么认为了...
页: [1] 2
查看完整版本: [原创]用选择菜单来实现表情插件--如何制作选择菜单