Java libgdx创建和显示秒表
是否有合适的方法仅使用java sdk和libGDX中的库在java中创建和显示计时器 我希望计时器从零开始,并以分钟:秒的格式显示 我目前正在使用一些变通方法,比如在渲染方法中添加delta时间,并将Java libgdx创建和显示秒表,java,timer,libgdx,Java,Timer,Libgdx,是否有合适的方法仅使用java sdk和libGDX中的库在java中创建和显示计时器 我希望计时器从零开始,并以分钟:秒的格式显示 我目前正在使用一些变通方法,比如在渲染方法中添加delta时间,并将totalTime/60转换为整数(分钟)和totalTime-minutes*60转换为整数(秒) 在此之前,我尝试将增量添加到秒,并在渲染方法中使用if,该方法将秒设置为0,并在秒>=59.9f时将分钟数增加1。这两种方法效率都很低,也不是很准确。我的计时器在接近一分钟结束时跳过秒,或者显示6
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代码>这解释了您遇到的舍入问题。因为我们只想显示一个整数,所以它是最简单的工具。