一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

AS3實現(xiàn)RPG游戲鼠標(biāo)8方向操作 靈動游戲 - 靈動游戲論壇 - Powered by Discuz!NT

 天策 2008-06-25

【分享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方向移動參見原帖:

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    五月的丁香婷婷综合网| 成年午夜在线免费视频| 亚洲淫片一区二区三区| 亚洲一级二级三级精品| 欧美激情中文字幕综合八区| 精品人妻精品一区二区三区| 久久机热频这里只精品| 精品女同一区二区三区| 日韩欧美一区二区不卡看片| 久久成人国产欧美精品一区二区| 91久久精品国产一区蜜臀| 九九九热视频最新在线| 国产精品制服丝袜美腿丝袜| 99福利一区二区视频| 久久精品免费视看国产成人 | 欧美大胆美女a级视频| 国产精品制服丝袜美腿丝袜| 韩国激情野战视频在线播放| 亚洲欧美天堂精品在线| 欧美成人黄色一区二区三区| 中文字幕人妻av不卡| 久久精品亚洲精品一区| 高清一区二区三区不卡免费| 亚洲中文字幕三区四区| 亚洲中文字幕在线综合视频| 欧美日本精品视频在线观看| 久久精品国产亚洲av麻豆| 久久99热成人网不卡| 国产精品不卡高清在线观看| 国产一区二区三中文字幕| 欧美大粗爽一区二区三区| 欧美特色特黄一级大黄片| 日本人妻中出在线观看| 亚洲国产精品肉丝袜久久| 日韩精品视频香蕉视频| 欧美日韩久久精品一区二区| 日本 一区二区 在线| 中文字幕在线区中文色| 五月婷婷综合激情啪啪| 91天堂素人精品系列全集| 精品人妻少妇二区三区|