0

我是 Java 新手,我正在尝试为 Android 开发一个非线性空闲游戏。我对如何管理游戏中的“时间”有点困惑。

在线性空闲游戏中,我会System.currentTimeMillis()在游戏期间(应用程序打开)和游戏重新启动时更新我的​​模型(因为模型是线性的,基于经过时间更新模型的简单公式就足够了)。

但是在非线性空闲游戏中,我的模型必须是时间离散的,并且必须在游戏重新开始时进行循环。然后,在游戏重新开始时,我的模型无法使用 System.currentTimeMillis(). 我的想法是在游戏打开时使用特定的计时器来计算模型。但是以我目前的知识,我不知道如何从我的所有课程中访问给定的计时器。

例如,在表示Ship的类中,有一种旅行方法。对于此示例,模型是线性的:

public class Ship {

    double travelStartTime, travelEndTime;
    double positionX, positionY;
    double maxSpeed = 10;

public Ship(double buildPostionX, double buildPositionY) {
        positionX = buildPositionY;
        positionY = buildPostionX;
        maxSpeed = 10;
        travelStartTime = 0; 
        travelEndTime = 0;
    }

public void startTravel(double destX, double destY){
        travelStartTime = System.currentTimeMillis();
        travelEndTime = System.currentTimeMillis() + travelTime(destX, destY);
    }


public double travelTime(double destinationX, double destinationY) {
        double currentX = this.getPositionX();
        double currentY = this.getPositionY();
        //calculate distance in km
        double distance = Math.pow(Math.pow(currentX-destinationX, 2) + Math.pow(currentY-destinationY, 2), 0.5);
        double time = distance/maxSpeed; //time in seconds
        return time;
    }

我的问题是:

1.我想System.currentTimeMillis()用我自己的计时器替换(每次应用程序启动时启动),但我该怎么做?知道我的模型的任何类都需要访问同一个计时器吗?或者还有其他方法可以解决这个问题吗?

2.旅行结束时,我想发送一个新的“事件”,例如显示一个新的弹出窗口(或alertDialog)或启动一个方法。我怎样才能做到这一点 ?

希望我的解释足够清楚。

提前感谢您的任何回答。

4

1 回答 1

0

您可以在主游戏类上添加一个currentTime字段,并在每次更新时将其传递给实体实例。您也可以使用static long字段,但不鼓励这样做。例子:

class MyGame {
    private long currentTime = 0;

    private Ship myShip = /* TODO */;

    // Called every x ms by an ExecutorService
    public void update() {
        // Update currentTime however you want
        // e.g. currentTime += 1000

        myShip.update(currentTime);
    }
}

class Ship {
    private int x;
    private int y;

    public void update(long currentTime) {
        // TODO e.g. perform lerp with previous position
    }
}

这称为更新方法模式。

于 2020-05-15T08:55:29.810 回答