【分享03】AS3實現(xiàn)RPG游戲鼠標(biāo)8方向操作
在寶寶姐的提醒下為地圖引擎添加了鼠標(biāo)操作的支持?,F(xiàn)在既可以用鍵盤ASDW也可以用鼠標(biāo)實現(xiàn)人物的8方向運動了。 ^-^
為了避免不必要的混亂,鍵盤和鼠標(biāo)不能同時控制人物移動。先新增兩個布爾值mouse和keyboard,分別代表當(dāng)前是否被鼠標(biāo)/鍵盤控制。若其中一個為真,則另一個輸入設(shè)備不被響應(yīng)。 下面是鼠標(biāo)控制移動的邏輯。 先來對舞臺進(jìn)行一下劃分,如下圖: 相對于舞臺上的人物而言,若鼠標(biāo)在它的任一方向被按下,人物則改為向該方向移動;若鼠標(biāo)在保持按下的情況下移動到另外一個區(qū)域,則人物的運動方向也隨之更改;若鼠標(biāo)彈起則停止運動。 根據(jù)之前的鍵盤8方向程序,人物的運動方向由一個數(shù)組dirArr來表示,這個數(shù)組保存著當(dāng)前鍵盤上被按下的鍵的keyCode。如果有新鍵按下或舊鍵彈起,則更新這個數(shù)組,并調(diào)用setDir函數(shù)適當(dāng)更改人物的運動方向。 這 樣一來要添加鼠標(biāo)支持就非常簡單了。讓stage分別偵聽MouseEvent.MOUSE_DOWN,MouseEvent.MOUSE_UP, MouseEvent.MOUSE_MOVE事件,并交由onMouseDir函數(shù)處理。當(dāng)鼠標(biāo)按下,先分析它相對于人物的位置(稍后介紹),然后根據(jù)位 置將代表該方向的keyCode push進(jìn)dirArr數(shù)組。當(dāng)鼠標(biāo)彈起,直接清空dirArr數(shù)組。若按下時有移動,先分析相對位置是否有變化,沒有就什么都不做,有的話先清空 dirArr數(shù)組,再把新的方向push進(jìn)去。這3種情況最后都調(diào)用一下setDir函數(shù)更新人物運動方向就好了。 相對位置的分析如下。 這里要借助三角函數(shù)來判斷鼠標(biāo)當(dāng)前相對于人物的方向,也就是要求出下圖中角a的值。 Flash 的坐標(biāo)系和常用的直角坐標(biāo)系稍有不同,它的y軸正方向是向下的,這里要稍微注意一下。要計算角a,先求出兩直角邊nx、ny以及斜邊r,然后求余弦cos (a) = nx / r,最后求反余弦并取整。取整是為了節(jié)省運算,整數(shù)運算相對于浮點運算要快得多,這在有大量運算時尤為突出。另外需要注意的是當(dāng)鼠標(biāo)位于x軸之上時,角a 會大于180度,而反三角函數(shù)只給出0~180的解,所以需要做一個轉(zhuǎn)換:a = 360 - a。詳細(xì)計算代碼如下: var nx:Number=mouseX-man.x; var ny:Number=mouseY-man.y; var r:Number=Math.sqrt(nx*nx+ny*ny); var cos:Number=nx/r; var angle:int=int(Math.floor(Math.acos(cos)*180/Math.PI)); if(ny<0){ angle=360-angle; } 之后switch變量angle的值,push相應(yīng)的keyCode: var msArr:Array=new Array(); if(angle>337 || angle<23){ msArr.push(68); } else if(angle>292){ msArr.push(68); msArr.push(87); } else if(angle>247){ msArr.push(87); } else if(angle>202){ msArr.push(87); msArr.push(65); } else if(angle>157){ msArr.push(65); } else if(angle>112){ msArr.push(65); msArr.push(83); } else if(angle>67){ msArr.push(83); } else{ msArr.push(83); msArr.push(68); } 最后調(diào)用setDir函數(shù)就完成了。詳細(xì)的代碼參見源文件dirCtr.fla中onMouseEvent函數(shù)和parseMouseDir函數(shù)。希望對有興趣的朋友有幫助。 ^-^ 另 有源文件PPCD.fla是perfectPixelCollisionDetection(精確到像素的任意不規(guī)則形狀的碰撞檢測)類的定義, Dir2.fla是舞臺上走動的人物的定義,要正確運行需要這些代碼,我人懶沒特意分離出去,不好意思啦,不必理會它們。 ^-^ SWF效果: 下載:http:///files/480871_xzu7b/TestMapMouse.swf 源文件下載:http:///files/480923_adhrb/mouse8dir.zip 源文件中關(guān)于鍵盤8方向移動參見原帖: |
|