廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 6745 個閱讀者
04:00 ~ 4:30 資料庫備份中,需等較久的時間,請耐心等候
 
<<   1   2  下頁 >>(共 2 頁)
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
amore12 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎 社區建設獎 優秀管理員勳章
總版主
級別: 總版主 該用戶目前不上站
推文 x913 鮮花 x4338
分享: 轉寄此文章 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.078697 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言