首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子弹运动物理和数学到Java (Javafx)

子弹运动物理和数学到Java (Javafx)
EN

Stack Overflow用户
提问于 2016-05-12 19:09:18
回答 1查看 895关注 0票数 1

我的代码有问题。在游戏中有一种射击子弹和更新UI的方法。问题是:我的代码并没有像我想象的那样工作,事实上,子弹形成了一条轨迹和抛物线路径,但并不总是计算出的函数对这个程序来说是好的。我认为问题很明显存在于数学公式中,但我不知道如何调试。请帮帮我!谢谢和抱歉,但是在代码中,一些变量是意大利语的,请耐心等待,我是一个学生。

代码语言:javascript
复制
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

在屏幕中央取决于大炮旋转的角度

代码语言:javascript
复制
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;(如果这就是你的意思)

EN

回答 1

Stack Overflow用户

发布于 2016-05-12 22:20:30

你的配方不是很好的配方,如果子弹直接射向空中怎么办?然后方程式就会崩溃。

首先计算x和y方向的初始速度。

代码语言:javascript
复制
double vx = Math.cos(angle)*vel;
double vy = Math.sin(angle)*vel;
double x0 = P.getLayoutX();
double y0 = P.getLayoutY();

现在我们可以使用使用某种类型的时间值并更新这两个变量。

代码语言:javascript
复制
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++;
}

如果你想坚持你的公式,有几个错误。

代码语言:javascript
复制
P.setLayoutX(x += (Math.tan(angle)-(Gravity/(2*vel*vel)*(Math.cos(angle))) ));

这不可能是正确的,而且你还没有提供x的方程式。如果让我猜的话,我会说:

代码语言:javascript
复制
x += vel*Math.sin(angle);

接下来,你有一个y的方程式,它不会递增。

代码语言:javascript
复制
        P.setLayoutY( 
            Math.tan(angle)*x-Gravity/(2*vel*vel*Math.cos(angle)*Math.cos(angle))*x*x );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37185158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档