2014-04-16 2 views
1

WASD 키와 포탑을 마우스 포인터로 사용하여 전함을 제어하는 ​​전함 시뮬레이터를 만들고 있습니다. 포탑은 360도 움직일 수 있습니다.탱크와 회전 터렛 AS3

필요에 따라 회전합니다. 그러나 마우스 포인터가 터릿을 0도 또는 360도 각도에 도달 할 때마다 마우스 포인터를 다시 다른 각도로 움직일 때까지 끝없이 회전하기 시작합니다.

var PTurret1angle:Number = 270; 

function PTurretRotate(Evt:Event){ 

var Turret1x:Number; 
var Turret1y:Number; 
var Turret1Angle:Number; 

Turret1x = mvi_PTurret1.x - mouseX; 
Turret1y = mvi_PTurret1.y - mouseY; 

Turret1Angle = Math.round(Math.atan2(Turret1y,Turret1x) * (180/Math.PI) + 180); 

if(Turret1Angle > PTurret1angle){ 
    mvi_PTurret1.rotation += 1; 
    PTurret1angle += 1; 
    if(PTurret1angle == 360){ 
     PTurret1angle = 0; 
    } 
} 
else if(Turret1Angle < PTurret1angle){ 
    mvi_PTurret1.rotation -= 1; 
    PTurret1angle -= 1; 
    if(PTurret1angle == 0){ 
     PTurret1angle = 360; 
    } 
} 


txt_Turret1Angle.text = Turret1Angle.toString(); 
txt_PTurret.text = PTurret1angle.toString(); 
} 

그래서, 내 두 가지 질문은 다음과 같습니다 : 첨부

는 지금까지 터렛 운동이 코드입니다

1) 어떻게 포탑에에 고정됩니다 수 있도록 할 곳 마우스 포인터는 마우스 포인터 위치에 관계없이 있습니까?

2) 회전을보다 효율적으로 만들 수있는 방법이 있습니까? 예를 들어, 내 포인터가 터렛이 약 30 도만 돌리도록 요구하는 경우 실제로 상황에 따라 330도 회전합니다.

도움 주셔서 감사합니다.

if(PTurret1angle == 0){ 
    PTurret1angle = 360; 
} 

if(PTurret1angle == 360){ 
    PTurret1angle = 0; 
} 

이 당신의 끝없는 회전 (위에 마우스, 각도가 제로를 만들고, 각도로 설정 :

답변

0

터렛의 각도 때문에이 두 문장 경우의 펑키 있습니다 360보다 더 큰 360은 1을 뺍니다. 오, 이제는 359에서 0보다 크고, 모든 방향으로 회전해야합니다. 오, 우리는 0으로 설정해야합니다. 360으로 설정해야합니다 ...... 등등. .....).

Turret1AnglePTurret1angle의 차이를 확인하여 "효율적인 회전"을 수행 할 수 있습니다. 여기 내 가정은 다음과 같습니다.

  • 0이 똑바로 향하게됩니다.
  • 양의 회전은 시계 방향 회전입니다.
  • Turret1Angle 마우스 각도와 PTurret1angle는 가장 당신이 이 켜려고 180도이며 실제 전류 포탑 각도
  • 입니다. (효율적인 회전) 밝혔다되고 그건

, 당신은 두 가지를 기반으로 좌회전하기 위해 어떤 방법을 알아낼 수 있습니다 Turret1Angle (마우스 각도)와 PTurret1angle의 차이의 부호 (실제 포탑 각도), 그리고 크기를 이 차이. 이게 무슨 뜻이야? Turret1Angle (마우스)를 사용

예 - PTurret1angle (실제)

1 개 정도로, 터릿 (359) 마우스이다
  • 되는 마우스 - 터릿 = -358. 가장 많이 돌리고 싶은 것은 180도이므로 abs (-358)> 180 이후로 360을 추가합니다 (차이가 음수이므로). 그러면 시계 방향으로 2도 회전하는 +2가됩니다!
  • 마우스가 359에 있고 포탑이 1에 있습니다. 마우스 - 터렛 = 358. abs (358)> 180이므로 360도 빼기 (차이가 양수이므로).-2가 나오므로 반 시계 방향으로 2도 돌립니다!
  • 마우스는 1, 터렛은 3입니다. 마우스 - 터렛 = -2. abs (-2) < 180부터 360을 더할 필요가 없습니다. 시계 반대 방향으로 2 도만 돌리면됩니다!

ActionScript가 약간 녹슬어서 실제로 코드를 작성하지 않겠습니다. 나는 당신이 철저히 물어 본 두가지 픽스를 구현하는 방법을 설명해 주었다고 생각하지만, 문제가 있다면 그것을 psuedocode 해 드리겠습니다. 루카스 알 수 있듯이,

var AngleDiff:Number; 

// starting after declarations/getting basic information, within your function 

Turret1Angle = Math.round(Math.atan2(Turret1y,Turret1x) * (180/Math.PI) + 180); 
AngleDiff = Turret1Angle - PTurret1angle; 

if(Math.abs(AngleDiff) > 180){ // efficient movement 
    if(AngleDiff > 0){ 
     AngleDiff -= 360; 
    }else if(AngleDiff < 0){ 
     AngleDiff += 360; 
} 

if(AngleDiff > 0){ // do the actual movement 
    PTurret1Angle += 1; 
    mvi_PTurret1.rotation += 1; 
}else if(AngleDiff < 0){ 
    PTurret1Angle -= 1; 
    mvi_PTurret1.rotation -= 1; 
} 

당신은 아마 숫자를 모듈 부문에보다 큰 360 문제를 해결할 수 :

편집 :는 여기에 몇 가지 psuedocode입니다.

PTurret1Angle = PTurret1Angle % 360; 

: 답장을

+0

감사합니다 (참고. psuedocode보다 더 실제 코드이었다 사실은 그래서/작동하지 않을 수 있지만 그것을 테스트하지 않은)! 포탑은 더 이상 0도에서 멈추지 않습니다. 이는 굉장합니다. 그러나, 나는 효율적인 회전과 함께 약간의 문제를 아직도 가지고있다. 혹시라도 가짜 코딩 제안에 당신을 데려 갈 수 있을까요? 나는 as3을 처음 접했을뿐 프로그래밍에 능숙하지 않기 때문에 내 자신을 가질 수있을 때까지 외부의 지침이 필요합니다. – Mario

+1

단순히 360을 초과하는 것을 감싸는 % 360을 사용하지 않는 것이 어떻습니까? –

+0

@ 루이스 : 고마워! 그것은 위대한 지금 작동합니다. – Mario