2016-06-28 2 views
0

간단한 FPS에 대한 1 인칭 동작 컨트롤을 만들려고합니다. 나는 플래시로 만들고 싶다. 그러나 나는 방향적인 움직임으로 고심하고있다.액션 스크립트에서 1 인칭 컨트롤 만들기 3

요약 : 플래시에서 FPS 컨트롤을 만들 수 있지만 제대로 만들 수없는 것 같습니다.

세부 사항 : 나는 회전 세상이 보이는 경우 마우스 주위를 회전 할 수 있도록, 당신의 관점 아래의 피벗 포인트 고정 남아 무비 클립 (mc)에 적용하는 방법을 사용하고 있습니다 움직입니다.

그런 다음 회전하는 무비 클립 (mc) 내에 중첩 된 moveclip (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; 

이것은 기본적인 생각이다. 라디안과도 사이의 변환을해야 할 수도 있지만,이를 돕기위한 많은 리소스가 있습니다. 테스트 할 수 없으면 항상 잘못 처리합니다. 지금은 할 수 없습니다.