2016-02-20 34 views
0

我正在嘗試做一個塔防和子彈路徑有點問題,也許你們中的一些人可以給我一個問題的建議。javafx計算子彈的路徑

這裏我設置了子彈的漸變。

bullet.setxGradient((turret.getPosX() - turret.getEnemies().getPosX())); 
bullet.setyGradient((turret.getPosY() - turret.getEnemies().getPosY())); 

在這裏我移動子彈。 moveBullet在AnimationTimer中調用。

public void moveBullet(Bullet bullet) { 

    bullet.setPosX(bullet.getPosX() - (bullet.getxGradient())); 
    bullet.setPosY(bullet.getPosY() - (bullet.getyGradient())); 
} 

問題是,如果子彈靠近炮塔,子彈速度會變慢。 有沒有另一種方式,也許更好的方式來跟蹤和設置路徑?

回答

0

這是有人給我的答案,它的工作。

bullet.setVelocity(new Point2D(turret.getEnemies().getPosX(),turret.getEnemies().getPosY()) 
.subtract(bullet.getPosX(),bullet.getPosY()).normalize().multiply(3)); 

所以我做了一個Point2D並添加了敵人和子彈頭的X和Y座標。

public void moveBullet(Bullet bullet) { 
    bullet.setPosX(bullet.getPosX() + bullet.getVelocity().getX()); 
    bullet.setPosY(bullet.getPosY() + bullet.getVelocity().getY()); 

} 

這裏我將速度添加到posX和posY。

0

您的代碼中沒有任何時間控制。這一切都取決於AnimationTimer發生的頻率,並不總是以60Hz的標稱速率完成。我會重寫代碼來計算子彈的位置,這取決於子彈發射後的時間。

+0

感謝您的回答。但時機不成問題。我只是計算了錯誤的路徑。 – KreCha

0

那麼,你的代碼只是零零碎碎,幫助你是不可能的。因此,這裏是它是如何做一些僞代碼:

double speed = 1; 
double angle = turret.getAngle(); 

// start at the edge of the turret, not inside of it, given that the turret is centered at location 
double x = turret.location.x + Math.cos(angle) * turret.width/2; 
double y = turret.location.y + Math.sin(angle) * turret.height/2; 

// calculate velocity depending on angle 
double dx = Math.cos(angle) * speed; 
double dy = Math.sin(angle) * speed; 

bullet.setLocation(x, y); 
bullet.setVelocity(dx, dy); 
bullet.setAngle(angle); 

,而你在運動AnimationTimer簡直是

location.add(velocity); 

注:角度爲RAD,你可能在使用Math.toDegrees一些點或至少當你旋轉節點

看起來或多或少像這樣的大矩形是一個旋轉炮塔在旋轉過程中發射矩形子彈。

enter image description here

+0

此代碼也未考慮到AnimationTimers計時的變化。重負荷下子彈會變慢。 – mipa

+0

OP的問題並不在於AnimationTimer,而是子彈的速度因地點而異。關於AnimationTimer,你必須保持穩定的速度。 – Roland

+0

mipa你可以給我一個建議,我應該怎麼做沒有AnimationTimer的循環?會好的。順便說一句,我是編程新手。邊幹邊學。 – KreCha