变量始终为“0.0”

Variable always being "0.0"

此代码循环运行,但变量d始终为“0.0”(使用断点测试)。

private static float startTime;

private boolean attackCore(Canvas canvas, RectF eCastle, float width, float height) {
    if (startTime == -1) startTime = System.currentTimeMillis();

    randomX = new Random((long) width);
    randomY = new Random((long) height);
    float x2 = randomX.nextFloat() + eCastle.right;
    float y2 = randomY.nextFloat() + eCastle.top;

    double d = ((System.currentTimeMillis() - startTime) / 1000) * 30;

    float[] c = Game.moveTo(x1, y1, x2, y2, d);
    if (d >= sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2))) {
        canvas.drawBitmap(arrow, x2, y2, null);
        startTime = -1;
        return true;
    }
    canvas.drawBitmap(arrow, c[0], c[1], null);
    return false;
}

这是 Game 中的 moveTo

public static float[] moveTo(float xA, float yA, float xB, float yB, double dAC) {
    double dAB = sqrt(pow(xA - xB, 2) + pow(yA - yB, 2));

    float xC = (float) (xA + (xB - xA)*dAC/dAB);
    float yC = (float) (yA + (yB - yA)*dAC/dAB);

    return new float[] {xC, yC};
}

我尝试使变量成为非静态变量并将其值设置为 -1。还必须说代码在另一个 class 中工作,所以我有点不知道错误在哪里,如果您需要代码的另一部分,请问我。

System.currentTimeInMillis() 是一个长

(long - long) / int = int 如果 currentTime - startTime / 1000,则 currentTime - startTime<1000 = 0 总是

你需要将它们转换为浮点数

(浮动)(当前时间 - 开始时间)/ 1000.f

发生这种情况是因为将 System.currentTimeMillis()long 转换为 float 时会丢失精度。对于大至 System.currentTimeMillis() 通常 returns 的值,连续 float 值的间距比整数大得多。

您应该 startTime 作为 long。可能 d 也应该是 long。当你做除法时,确保你在除法之前做乘法,这样四舍五入的时间越晚越好。

long startTime;
// ... assign startTime to whatever it's supposed to be
long d = (System.currentTimeMillis() - startTime) * 30 / 1000;