amore12
|
分享:
▼
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!
|