Java libgdx创建和显示秒表

Java libgdx创建和显示秒表,java,timer,libgdx,Java,Timer,Libgdx,是否有合适的方法仅使用java sdk和libGDX中的库在java中创建和显示计时器 我希望计时器从零开始,并以分钟:秒的格式显示 我目前正在使用一些变通方法,比如在渲染方法中添加delta时间,并将totalTime/60转换为整数(分钟)和totalTime-minutes*60转换为整数(秒) 在此之前,我尝试将增量添加到秒,并在渲染方法中使用if,该方法将秒设置为0,并在秒>=59.9f时将分钟数增加1。这两种方法效率都很低,也不是很准确。我的计时器在接近一分钟结束时跳过秒,或者显示6

是否有合适的方法仅使用java sdk和libGDX中的库在java中创建和显示计时器

我希望计时器从零开始,并以分钟:秒的格式显示

我目前正在使用一些变通方法,比如在渲染方法中添加delta时间,并将
totalTime/60
转换为整数(分钟)和
totalTime-minutes*60
转换为整数(秒)

在此之前,我尝试将增量添加到秒,并在渲染方法中使用if,该方法将秒设置为0,并在秒>=59.9f时将分钟数增加1。这两种方法效率都很低,也不是很准确。我的计时器在接近一分钟结束时跳过秒,或者显示60秒,然后增加分钟并重置秒,比如1:59、1:60和2:00

我搜索了所有的文档和互联网,但没有找到一种正确显示时间的方法(不是有巨大缺陷的变通方法)。你如何以专业的方式做到这一点


我不认为AAA游戏会认真对待这件事。。。有没有人想过人们可能需要java或libGDX中的倒计时计时器(一个至少不显示1:60的计时器)?

很难准确地理解您所尝试的,所以我不确定您在哪里失去了准确性,但可能与您在计算中使用的整数类型有关

一般来说,时钟显示的是完整的秒数,所以将总时间舍入为整数。每帧应重新计算分钟和秒数。它们除了显示人类可读的
totalTime
,没有任何用途,因此不需要将它们保存在成员变量中
totalTime
应不舍入,以保持准确

//Member variable:
float totalTime = 5 * 60; //starting at 5 minutes

void render(){
    float deltaTime = Gdx.graphics.getDeltaTime(); //You might prefer getRawDeltaTime()

    totalTime -= deltaTime; //if counting down

    int minutes = ((int)totalTime) / 60;
    int seconds = ((int)totalTime) % 60;

    //...
}

6年后编辑:

为了避免由于加上一堆小的浮点增量时间而产生舍入错误,我将存储系统时钟开始时间,并重新计算每帧经过的时间,如下所示:

// Reset this to System.currentTimeMillis() when starting over.
private long startTime = System.currentTimeMillis();

void render(){
    long totalTime = (startTime - System.currentTimeMillis()) / 1000;

    int minutes = totalTime / 60;
    int seconds = totalTime % 60;

    //...
}

很难准确地理解你所尝试的,所以我不确定你在哪里失去了准确性,但也许这与你在计算中使用整数的位置有关

一般来说,时钟显示的是完整的秒数,所以将总时间舍入为整数。每帧应重新计算分钟和秒数。它们除了显示人类可读的
totalTime
,没有任何用途,因此不需要将它们保存在成员变量中
totalTime
应不舍入,以保持准确

//Member variable:
float totalTime = 5 * 60; //starting at 5 minutes

void render(){
    float deltaTime = Gdx.graphics.getDeltaTime(); //You might prefer getRawDeltaTime()

    totalTime -= deltaTime; //if counting down

    int minutes = ((int)totalTime) / 60;
    int seconds = ((int)totalTime) % 60;

    //...
}

6年后编辑:

为了避免由于加上一堆小的浮点增量时间而产生舍入错误,我将存储系统时钟开始时间,并重新计算每帧经过的时间,如下所示:

// Reset this to System.currentTimeMillis() when starting over.
private long startTime = System.currentTimeMillis();

void render(){
    long totalTime = (startTime - System.currentTimeMillis()) / 1000;

    int minutes = totalTime / 60;
    int seconds = totalTime % 60;

    //...
}

对于我的Nothere游戏,我按如下方式打印计时器:

        gameTime += delta;
        float minutes = (float)Math.floor(gameTime / 60.0f);
        float seconds = gameTime - minutes * 60.0f;
        labelTime.setText(String.format("%.0fm%.0fs", minutes, seconds));

我认为它工作得很好。

对于我的Nothere游戏,我将计时器打印如下:

        gameTime += delta;
        float minutes = (float)Math.floor(gameTime / 60.0f);
        float seconds = gameTime - minutes * 60.0f;
        labelTime.setText(String.format("%.0fm%.0fs", minutes, seconds));

我觉得它很好用。

我也会试试这个。到目前为止,我一直使用秒作为浮点:
seconds=totalTime-minutes*60这解释了您遇到的舍入问题。因为我们只想显示一个整数,所以这是最简单的工具。我也会试试这个。到目前为止,我一直使用秒作为浮点:
seconds=totalTime-minutes*60这解释了您遇到的舍入问题。因为我们只想显示一个整数,所以它是最简单的工具。