[英]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,......等等.....)。
您可以通過檢查Turret1Angle
和PTurret1angle
之間的差異來完成“有效旋轉”。 這是我的假設:
Turret1Angle
是鼠標角度, PTurret1angle
是當前當前刀塔角度 話雖如此,您可以基於兩件事來找出轉彎的方式: Turret1Angle
(鼠標角)和PTurret1angle
(實際轉塔角)之間的差異的符號以及該差異的大小。 我是什么意思
使用Turret1Angle
(鼠標)的示例PTurret1angle
(實際):
我對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.