2016-06-28 29 views
0

我正在嘗試爲一個簡單的FPS創建第一人稱運動控件。我想用閃光燈製作,但我正在爲定向運動而努力。在Actionscript 3中創建第一人稱控件

摘要:我希望能夠在Flash中創建FPS控件,但似乎無法做到。

詳情: 我使用的是由旋轉被應用於保持靜止與你的觀點之下的支點,讓世界看起來你在鼠標周圍旋轉的影片剪輯(mc)的方法被移動。

然後,我將方向移動應用到嵌套在旋轉動畫片段(mc)中的回形針(box),以給出在第一人稱視圖中漫步的幻覺。

mc - 把手旋轉(用於box容器)

----- box - 處理翻譯box作爲地板,所以我把它作爲一個黑方塊)

當您旋轉mc並開始使用箭頭鍵移動時,問題就開始了。 box的翻譯沒有考慮到mc的旋轉,所以你仍然鎖定在box的x軸和y軸上,所以無論你面對的是什麼,你總是鎖定在那些軸上,而不是無論您面對的是大多數FPS遊戲所採用的傳統趨勢。

我還沒有線索去哪裏從這裏,所以任何幫助將不勝感激。

時間軸代碼:

//You’ll need a symbol named mc. With another symbol named box within it. 
//mc should be centered on the stage. 
//stage size 1920x1080 


var mL: Boolean = false; 
var mR: Boolean = false; 
var mD: Boolean = false; 
var mU: Boolean = false; 

var speed: int = 10; 

mc.rotationX=90; 
mc.y=1000; 

mc.x=932.1; 
mc.z=0; 
mc.width=980; 
mc.height=98; 



stage.addEventListener(Event.ENTER_FRAME, EF); 

function EF(e: Event): void { 
//Rotates mc based on distance of mouseX to the center of the stage. 
    if(mouseX<stage.stageWidth){ 
     mc.rotationY += speed*((mouseX-stage.stageWidth/2)*.0001); 
    } 
    if(mouseX>stage.stageWidth){ 
     mc.rotationY += speed*((mouseX-stage.stageWidth/2)*.0001); 
    } 


//Arrow key controls. 
    if (mL == true) { 
     mc.box.x += speed; 
    } 
    if (mR == true) { 
     mc.box.x -= speed; 
    } 
    if (mD == true) { 
     mc.box.y += speed; 
    } 
    if (mU == true) { 
     mc.box.y -= speed; 
    } 

} 

stage.addEventListener(KeyboardEvent.KEY_DOWN, kD); 
function kD(e: KeyboardEvent): void { 
//Key down conditionals. 
    if (e.keyCode == Keyboard.LEFT && mR == false && mD == false && mU == false) { 
     mL = true; 
    } 
    if (e.keyCode == Keyboard.LEFT && mR == false && mD == false && mU == true) { 
     mL = true; 
     mU = true; 
    } 
    if (e.keyCode == Keyboard.UP && mR == false && mD == false && mL == true) { 
     mL = true; 
     mU = true; 
    } 
    if (e.keyCode == Keyboard.LEFT && mR == false && mD == true && mU == false) { 
     mL = true; 
     mD = true; 
    } 
    if (e.keyCode == Keyboard.DOWN && mR == false && mU == false && mL == true) { 
     mL = true; 
     mD = true; 
    } 


    if (e.keyCode == Keyboard.RIGHT && mL == false && mD == false && mU == false) { 
     mR = true; 
    } 
    if (e.keyCode == Keyboard.RIGHT && mL == false && mD == false && mU == true) { 
     mR = true; 
     mU = true; 
    } 
    if (e.keyCode == Keyboard.UP && mL == false && mD == false && mR == true) { 
     mR = true; 
     mU = true; 
    } 
    if (e.keyCode == Keyboard.RIGHT && mL == false && mD == true && mU == false) { 
     mR = true; 
     mD = true; 
    } 
    if (e.keyCode == Keyboard.DOWN && mL == false && mU == false && mR == true) { 
     mR = true; 
     mD = true; 
    } 


    if (e.keyCode == Keyboard.UP && mR == false && mD == false && mL == false) { 
     mU = true; 
    } 
    if (e.keyCode == Keyboard.DOWN && mL == false && mR == false && mU == false) { 
     mD = true; 
    } 


} 

stage.addEventListener(KeyboardEvent.KEY_UP, kU); 
function kU(e: KeyboardEvent): void { 
//Key up conditionals. 
    if (e.keyCode == Keyboard.LEFT) { 
     mL = false; 
    } 
    if (e.keyCode == Keyboard.RIGHT) { 
     mR = false; 
    } 
    if (e.keyCode == Keyboard.UP) { 
     mU = false; 
    } 
    if (e.keyCode == Keyboard.DOWN) { 
     mD = false; 
    } 
} 

回答

0

您正試圖使一個按鍵(前進)添加x和y的定位相對量。這裏你需要一個小三角。您將使用mc.rotationY作爲角度。

if (mU == true) { 
    mc.box._speed += speed; // instead of mc.box.y -= speed; 
    mc.box._ySpeed = Math.sin(mc.rotationY)*mc.box._speed; 
    mc.box._xSpeed = Math.cos(mc.rotationY)*mc.box._speed; 
} 

同樣更新您的其他邏輯語句。

,然後添加一個最終的功能來更新位置:

mc.box.y += mc.box._ySpeed; 
mc.box.x += mc.box._xSpeed; 

這是基本的想法。您可能需要在弧度和度數之間進行一些轉換,但有足夠的資源可以幫助您完成這些轉換,而且我總是在無法測試的情況下出錯,這是我現在無法做到的。