我的代码有问题。有一种方法可以射击子弹并更新游戏中的 UI。问题是:我的代码并不像我想象的那样工作,实际上子弹会形成轨迹和抛物线路径,但计算的函数并不总是适合该程序。我认为显然问题出在数学公式中,但我不明白如何调试它。请帮我!!!谢谢,抱歉,但在代码中,一些变量是意大利语,请耐心等待,我是一名学生。
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);
}
速度初始化为 double vel = 100;(如果这就是你的意思)
最佳答案
你的配方不太好,如果子弹直接射向空中怎么办?然后方程就破裂了。
首先计算 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 );
关于java - 子弹运动物理和数学转 Java (Javafx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37185158/