2016-06-28 8 views
0

シンプルなFPSのファーストパーソンムーブメントコントロールを作成しようとしています。私はフラッシュで作ってみたいですが、私は方向性の動きに苦しんでいます。Actionscript 3でファーストパーソンコントロールを作成する

要約: FPSコントロールをフラッシュで作成したいと思っていますが、それを正しく行うことはできません。

詳細: 私は回転がときにマウス世界は一見あなたの周りに回転するように、あなたの視点の下にそのピボットポイントで静止したままムービークリップ(mc)に適用される方法を使用しています移動される。

次に、回転するムービークリップ(mc)内にネストされたムービークリップ(box)に方向性の動きを適用して、最初の人の視点でウォーキングするような錯覚を与えます。

mcは、 - 回転box用容器)

----- boxハンドル - 翻訳ハンドル(box床として機能するので、私は黒い四角形としてそれを持っている)

mcを回転して矢印キーで移動を開始すると、問題が発生します。 boxの翻訳ではmcの回転を考慮していないので、x軸とy軸にはまだboxに固定されていますので、どこに直面しても、常に軸に固定されていますほとんどの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; 

はこれが基本的な考え方です。ラジアンと度の変換をする必要があるかもしれませんが、それを手助けする多くのリソースがあります。テストすることができなければ、私は今はできません。

関連する問題