簡體   English   中英

帶旋轉炮塔的坦克AS3

[英]Tank with Rotating Turret AS3

我正在制作一艘戰艦模擬器,該模擬器用WASD鍵控制戰艦,並用鼠標指針控制炮塔。 炮塔可以移動360度。

它會旋轉; 但是,每當鼠標指針使轉塔達到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語句,您的炮塔角度很時髦:

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

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

這些使您不斷旋轉(鼠標在頂部,角度為零,角度設置為360,大於零,您減去一個,哦,現在是359,大於零,必須一直旋轉,哦男人,我們必須歸零,必須將其設置為360,......等等.....)。

您可以通過檢查Turret1AnglePTurret1angle之間的差異來完成“有效旋轉”。 這是我的假設:

  • 零正指向上方。
  • 正旋轉是順時針旋轉。
  • 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有點不滿意,所以我實際上不會為您編寫代碼。 我想我已經解釋了如何徹底實施您所要求的兩個修復程序,但是如果遇到任何麻煩,我很樂意對其進行偽編碼。

編輯:這是一些偽代碼:

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;
}

正如盧卡斯(Lukasz)所建議的,您可以用模除法解決大於360問題的數字。

PTurret1Angle = PTurret1Angle % 360;

(注意:那是比psuedocode更實際的代碼。盡管我沒有實際測試過,所以它可能/不起作用)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM