我舉個(gè)例子:有這樣一個(gè)游戲角色移動(dòng)的游戲,需要角色具有八方向移動(dòng),如果用戶先按下←鍵,游戲角色向左移動(dòng),這時(shí)候用戶又按下↓鍵(←鍵不抬起),這時(shí)候游戲角色要向左下角移動(dòng),接下來(lái),如果用戶抬起↓鍵(←鍵不抬起),游戲角色轉(zhuǎn)為繼續(xù)左行,如果用戶抬起←鍵(↓鍵不抬起),游戲角色轉(zhuǎn)為繼續(xù)下行。同樣的,向上,向右按鍵也是類似的需求,而且這時(shí)候,如果用戶按下了其它的按鍵,或按下多于三個(gè)光標(biāo)鍵時(shí),最后按下的鍵要忽略。
對(duì)于這種涉及復(fù)合鍵的處理,大家可以寫(xiě)一個(gè)試試是否容易,或者說(shuō)是否足夠完美。
這就是今天想說(shuō)的內(nèi)容,也是我在Flash 游戲開(kāi)發(fā)中對(duì)按鍵控制的一點(diǎn)小經(jīng)驗(yàn),希望能對(duì)從事Flash游戲開(kāi)發(fā)的同行們有所幫助。
一、先熟悉一下與制作按鍵相關(guān)的事件和語(yǔ)法
1).Key 類A).Key類的事件i) onKeyDown = function() {}
當(dāng)按下某按鍵時(shí)獲得通知。同時(shí)只能由一個(gè)按鍵觸發(fā),如果有多個(gè)按鍵按下,以先后次序觸發(fā)。若要使用 onKeyDown,必須創(chuàng)建一個(gè)偵聽(tīng)器對(duì)象。然后可以為 onKeyDown 定義一個(gè)函數(shù),并使用 addListener() 向 Key 對(duì)象注冊(cè)該偵聽(tīng)器,如下面的示例所示:
var keyListener:Object = new Object();
keyListener.onKeyDown = function() {
trace("DOWN -> Code: "+Key.getCode()+"\tACSII: "+Key.getAscii()+"\tKey: "+chr(Key.getAscii()));
};
keyListener.onKeyUp = function() {
trace("UP -> Code: "+Key.getCode()+"\tACSII: "+Key.getAscii()+"\tKey: "+chr(Key.getAscii()));
};
Key.addListener(keyListener);
ii) .onKeyUp = function() {}
當(dāng)釋放某按鍵時(shí)獲得通知。同時(shí)只能由一個(gè)按鍵觸發(fā),如果有多個(gè)按鍵按下后再抬起,以最后按下的鍵觸發(fā)。若要使用 onKeyUp,必須創(chuàng)建一個(gè)偵聽(tīng)器對(duì)象。然后可以為 onKeyUp 定義一個(gè)函數(shù),并使用 addListener() 向 Key 對(duì)象注冊(cè)該偵聽(tīng)器,示例同上。
這二個(gè)按鍵事件,在四方向游戲中,配合Key.isDown,完全夠用了。今天主要重點(diǎn)是在八方向鍵的處理上,下邊繼續(xù)說(shuō)。
B).Key類的方法
i) Key.isDown 方法
如果按下 keycode 中指定的鍵,則返回 true;否則返回 false。
如:
car_mc.onEnterFrame = function() {
if (Key.isDown(Key.RIGHT)) {
this._x += 10;
} else if (Key.isDown(Key.LEFT)) {
this._x -= 10;
}
};
常見(jiàn)keycode(是Key類的靜態(tài)屬性):
修飾符 | 屬性 | 說(shuō)明 |
---|
static | BACKSPACE:Number | Backspace 鍵的鍵控代碼值 (8)。 |
static | CAPSLOCK:Number | Caps Lock 鍵的鍵控代碼值 (20)。 |
static | CONTROL:Number | Ctrl 鍵的鍵控代碼值 (17)。 |
static | DELETEKEY:Number | Delete 鍵的鍵控代碼值 (46)。 |
static | DOWN:Number | 下箭頭鍵的鍵控代碼值 (40)。 |
static | END:Number | End 鍵的鍵控代碼值 (35)。 |
static | ENTER:Number | Enter 鍵的鍵控代碼值 (13)。 |
static | ESCAPE:Number | Esc 鍵的鍵控代碼值 (27)。 |
static | HOME:Number | Home 鍵的鍵控代碼值 (36)。 |
static | INSERT:Number | Insert 鍵的鍵控代碼值 (45)。 |
static | LEFT:Number | 左箭頭鍵的鍵控代碼值 (37)。 |
static | _listeners:Array [只讀] | 一個(gè)引用列表,引用對(duì)象是向 Key 對(duì)象注冊(cè)的所有偵聽(tīng)器對(duì)象。 |
static | PGDN:Number | Page Down 鍵的鍵控代碼值 (34)。 |
static | PGUP:Number | Page Up 鍵的鍵控代碼值 (33)。 |
static | RIGHT:Number | 右箭頭鍵的鍵控代碼值 (39)。 |
static | SHIFT:Number | Shift 鍵的鍵控代碼值 (16)。 |
static | SPACE:Number | 空格鍵的鍵控代碼值 (32)。 |
static | TAB:Number | Tab 鍵的鍵控代碼值 (9)。 |
static | UP:Number | 上箭頭鍵的鍵控代碼值 (38)。 |
其它的字母鍵并沒(méi)有定義成靜態(tài)屬性,需要使用數(shù)字的鍵控代碼值來(lái)使用,有人寫(xiě)了一個(gè)所有按鍵的Key類,我復(fù)制在下邊,可做參考:
自定義Key類ii) Key.getCode 方法返回按下的
最后一個(gè)鍵的鍵控代碼值,并且不會(huì)區(qū)分字母的大小字,即使用此方法時(shí),任何一個(gè)按鍵,只有一個(gè)Code值。
2).MovieClip的事件i) MovieClip.onKeyDown 當(dāng)影片剪輯
具有輸入焦點(diǎn)并且用戶按下某個(gè)鍵時(shí)調(diào)用。
ii) MovieClip.onKeyUp當(dāng)釋放按鍵時(shí)調(diào)用。僅當(dāng)影片剪輯的輸入焦點(diǎn)被啟用和設(shè)置后,onKeyUp 事件處理函數(shù)才能起作用。即要求影片剪輯
具有輸入焦點(diǎn)。
二、Flash中對(duì)按鍵捕獲處理,拔開(kāi)按鍵的迷霧
1).Flash中,如果你使用Key.onKeyDown 事件偵聽(tīng)器,則不管焦點(diǎn)在Flash內(nèi)的那個(gè)對(duì)象上,按鍵均能被捕獲,這里有一種情況,當(dāng)先后按下多個(gè)鍵(二個(gè)以上的按鍵)時(shí),onKeyDown事件是按先后次序觸發(fā)的,而onKeyUp事件只能由最后按下的鍵觸發(fā)。舉例:
我先按下A鍵,再接著按下S鍵,同時(shí)A鍵不抬起,則這時(shí)候,onKeyDown先被A鍵觸發(fā)一次,接著被S鍵觸發(fā)一次,而這時(shí)候,不管你把那個(gè)鍵抬起,
onKeyUp事件始終是由最后按下的那個(gè)鍵觸發(fā)的。這點(diǎn)一定要注意,這時(shí)候A鍵的onKeyUp事件已經(jīng)被后按的鍵“沖”掉了,就算抬起A鍵,onKeyUp也不會(huì)被觸發(fā)?梢允褂帽疚拈_(kāi)頭那段代碼測(cè)試就知道了。
2).使用
Key.isDown,可以知道有那些鍵被按下,不管按鍵的先后(其實(shí)是有先后的,只是先后時(shí)間差別太小,isDown方法并判斷不出先后次序,要判斷次序,需要借助其它方法),只要按下,此方法就能檢測(cè)出,如:
當(dāng)你先后同時(shí)按下a,s,d,f這四個(gè)鍵時(shí),都會(huì)被檢測(cè)到。
利用這點(diǎn),我們就可以制作游戲中的復(fù)合鍵,比如八方向鍵,或快捷鍵,如Ctrl+F等。
3).如果同時(shí)按下了多個(gè)鍵,那么如何知道先后次序呢?
還記得
Key.getCode的用法說(shuō)明嗎?“返回按下的最后一個(gè)鍵的鍵控代碼值”,同樣的,此方法也不能獲得按鍵的先后次序,但是它可以獲得最后一個(gè)按鍵,使用它的這一特性,我們可以寫(xiě)出自己的檢測(cè)類,用來(lái)當(dāng)按下多鍵時(shí),檢測(cè)按鍵的次序。如:
使用此段代碼,你可以嘗試著同時(shí)按下a,s,d,f鍵,可以看看按鍵次序。
4).其實(shí)Flash按鍵的難于處理,主要是在于復(fù)合鍵的處理上,在多復(fù)合鍵中,如果用戶有意按下多鍵,如何拋棄或“不理睬”不想關(guān)注的按鍵呢?
比如光標(biāo)鍵吧,我們想在按下左光標(biāo)+上光標(biāo)鍵時(shí),人物向左上角斜方向移動(dòng),那如果這時(shí)候,用戶又按下向下的光標(biāo)鍵呢,或者又按了其它的字母鍵呢?這時(shí)候往往會(huì)出現(xiàn)我們不想要的結(jié)果。即最后按鍵會(huì)干擾已按下的組合鍵。處理這種情況,除了寫(xiě)較復(fù)雜的if判斷之外,就可以使用上邊說(shuō)的檢測(cè)按鍵次序,這樣只有前兩個(gè)按鍵有效,后邊再按下的鍵就無(wú)效,從而達(dá)到控制的目的。
5).其實(shí)很多時(shí)候,我們是通過(guò)光標(biāo)控制一個(gè)MovieClip的移動(dòng)的,那么如果在此使用MovieClip的按鍵事件下處理按鍵,就要注意MovieClip是與焦點(diǎn)相關(guān)的,如果有多個(gè)對(duì)象,那就得處理焦點(diǎn)一定在要移動(dòng)的對(duì)象上頭,按鍵才有效,除此之外,它的按鍵事件使用原理同Key的按鍵事件原理,所以大多數(shù)時(shí)候,我們并不使用MovieClip的按鍵事件,而改用MovieClip.onEnterFrame來(lái)偵聽(tīng)按鍵。下邊我給了一個(gè)示例,就是使用的這個(gè)方法。
三、八方向按鍵示例
新窗口打開(kāi)>>四、八方向按鍵源碼下載
點(diǎn)此下載(6K)>>