2016-05-12 42 views
1

我的代碼有問題。有一種方法可以在遊戲中拍攝子彈並更新UI。問題是:我的代碼不工作,因爲我曾想象過,子彈創建了一個traiectory和Parabolic路徑,但並不總是計算的函數適用於此程序。我認爲這顯然是問題在數學公式,但我不明白如何調試。請幫幫我!!!感謝和抱歉,但在代碼中有些變量是意大利語,請耐心等待我,我是一名學生。子彈運動物理和數學到Java(Javafx)

public class NuovoGiocoController { 

Cannone cannone; 
Aereo aereo; 
double vel = 100; 
Proiettile pro; 
int CAR = 10; 
int raf = 2; 


@FXML 
private Rectangle canna; 

@FXML 
private Rectangle iconaAereo; 
@FXML 
private Circle P; 
@FXML 
private AnchorPane MP;  


void Aggiorna() throws InterruptedException { //Aggiorna = Update 

    //vel = Slider.getValue(); 
    double angle = canna.getRotate(); 
    boolean morto = false; 
    double Gravity = 10; 
    while (morto == false) { 
     double X = P.getLayoutX(); 
     double Y = P.getLayoutY(); 
     if (X > 1 && Y > 1 && X < MP.getWidth() && Y < MP.getHeight()) { 
      System.out.println("x: " + X + " y: " + Y + " maxX: " + MP.getWidth() + " maxY: " + MP.getHeight()); 
      angle = Math.abs(angle); 
      double x = P.getLayoutX(); 
      double y = P.getLayoutY(); 
      P.setLayoutX(x += (Math.tan(angle)-(Gravity/(2*vel*vel)*(Math.cos(angle))))); 
      P.setLayoutY(y -= (Math.tan(angle)+(Gravity/(2*vel*vel)*(Math.cos(angle)))*(x*x))); 

      System.out.println("VIVO"); 
      TimeUnit.MILLISECONDS.sleep(100); 
     } else { 

      System.out.println("MORTO"); 

      P.setLayoutX(pro.posX); 
      P.setLayoutY(pro.posY); 
      morto = true; 
     } 

    } 
} 
void nuovoProcesso() { // nuovoProcesso = newProcess 
    Task task = new Task<Void>() { 
     @Override 
     public Void call() throws InterruptedException { 

      for (int i = 1; i <= raf; i++) { 
       if (isCancelled()) { 
        break; 
       } 
       Aggiorna(); 
      } 
      return null; 
     } 
    }; 
    new Thread(task).start(); 
} 

@FXML 
void Spara(ActionEvent event) throws InterruptedException {//Spara=shoot 
    if (raf <= CAR) { 
     this.CAR -= raf; 
     //car.setText(String.valueOf(CAR)); 
     nuovoProcesso(); 
    } 

    if (CAR <= 0) { 
     //metodo che fà uscire e andare allo score 
     System.exit(0); 
    } 
} 

移動子彈的公式爲:this

public void spostaCannaDestra(ActionEvent event) { 
    if (canna.getRotate() < + 60) { 
     canna.setRotate(canna.getRotate() + 10); 
    } 
} 

public void spostaCannaSinistra(ActionEvent event) { 
    if (canna.getRotate() > - 60) { 
     canna.setRotate(canna.getRotate() - 10); 
    } 
} 
@FXML 
public void initialize() { 
    cannone = new Cannone(0); 

    canna.setLayoutX(cannone.getPosX()); 
    canna.setLayoutY(cannone.getPosY()); 
    canna.setWidth(cannone.getX()); 
    canna.setHeight(cannone.getY()); 

    pro = new Proiettile(16, 16, 300, 340, vel); 
    P.setLayoutX(pro.posX); 
    P.setLayoutY(pro.posY); 


} 

速度等雙初始化取決於大炮的旋轉在屏幕的中心的角度vel = 100;(如果這是你的意思)

+0

你打算使用什麼公式?這是一個初始速度,只有在重力的影響下?什麼是角度? – matt

+0

我改進的問題回答你的評論!感謝您的關注和您的幫助 –

+0

看起來您的角度可能會在動畫過程中發生變化,這意味着您的公式不正確。然後,如果我明白你的方程是從哪裏來的,那麼x應該每次更新一個常數值,這對你的所得是正確的。那麼你應該根據X計算Y,你不應該使用+ =。 – matt

回答

1

你的配方是不是一個好的公式,如果子彈直射在空氣中怎麼辦?然後方程打破。

首先計算x和y中的初始速度。

double vx = Math.cos(angle)*vel; 
double vy = Math.sin(angle)*vel; 
double x0 = P.getLayoutX(); 
double y0 = P.getLayoutY(); 

現在我們可以使用某種時間值並更新這兩個變量。

double t = 0; 
while(morto == false){ 
    double x = x0 + vx*t; 
    double y = y0 + vy*t - 0.5*Gravity*t*t; 
    P.setLayoutX(x); 
    P.setLayoutY(y); 
    t++; 
} 

如果你想堅持你的公式,有幾個錯誤。

P.setLayoutX(x += (Math.tan(angle)-(Gravity/(2*vel*vel)*(Math.cos(angle))))); 

這不可能是正確的,並且您還沒有提供x的公式。如果我猜我會說:

x += vel*Math.sin(angle); 

接下來你有y它不增加的方程。

 P.setLayoutY( 
      Math.tan(angle)*x-Gravity/(2*vel*vel*Math.cos(angle)*Math.cos(angle))*x*x); 
+0

抱歉,延遲,但我不得不工作。我試圖包括你的更正,但也許我錯誤的東西現在子彈不更新在用戶界面除非我把大炮向右或向左旋轉50°,但無論如何不作出正確的traiectory。我試圖插入,編輯,更改,哭泣在我的和你的代碼,但沒有... ps:謝謝你的耐心 –

+0

@NicolaCorea你有'x'正式嗎?你只給出了'y'的公式。 – matt

+0

不幸的是,我的教授只給了我們這種形式... –