0

嗨,我正在尝试找出一种使用弹丸运动使物体移动的方法。出于某种原因我自己处理它时,我得到了指数运动而不是弹丸。我看过其他例子,但它们有点不同,因为我有它应该降落的坐标,并且需要找到它必须拍摄物体的速度和角度。

我的代码:

public void updateDir(){

    distY = (int)( projectedY - y);
    distX = (int)(projectedX - x);
    spdY = (double)(2*distY)/(time*time);
    spdX =  (double)(distX)/time;
    dir = Math.atan(spdY/spdX);


    System.out.println("spdY: " + spdY);
    System.out.println("spdX: " + spdX);
    System.out.println("dir: " + Math.toDegrees(dir));
}


public void move() {
    x +=   (spd*Math.cos(dir));
    y -=  (spd * Math.sin(dir));
}

projectionY 和projectedX 是它应该降落的坐标。

那么为什么它没有在抛射运动路径中移动,而是在指数路径中移动的任何原因?

4

1 回答 1

0

这些是(牛顿)方程,用于计算以速度 v0 开始,角度为 theta,在时间 t 后受重力 g 影响的物体坐标:

x = v0 * t * cos(θ)

y = v0 * t * sin(theta) - (gt^2)/2

这些公式可以扩展为包括 x0 和 y0,这将是起始位置,也可以将 t 更改为包含不为 0 的起始时间,这样您就可以找到从 1 秒到 1.5 秒的相对差异小路。这些已被省略。

每次您需要绘制对象时,您都可以使用这些公式来计算位置,假设有人(一段代码)跟踪时间(在游戏中非常重要)。

示例代码(不完整和伪代码):

class GUI {
    startProjectile() {
        model.startProjectile();
    }    

    paint() {
        Location l = model.getLocationOfProjectile();
        graphics.draw(projectile, l);
    }
}

class Model {
    startProjectile() {
        long projectileStartTime = System.currenttimemillis();
    }

    Location getLocationOfProjectile() {
        long timeInAir = System.currentTimemillis() - projectileStartTime;
        // Insert formulas for calculating the x and y coordinates based on the time, initial velocity and gravity
    }
}

从上面你应该注意的最重要的事情是,你不需要直接计算 x 和 y 速度,除非你当然需要它们来做其他事情。您可以根据您的世界的常数和时间,直接计算 x 和 y 位置并简单地将其绘制在那里。

你也需要考虑碰撞,但我想你稍后会解决这个问题。:)

于 2013-08-12T14:04:54.107 回答