LibGDX - 渲染愤怒的小鸟风格的动画计分器
LibGDX - Rendering an Angry Birds style animated score counter
我的游戏有关卡结束屏幕,我希望在该屏幕上显示动画玩家分数。如果您在 Angry birds 和许多其他游戏中看到过,分数文本从“000000”开始并快速递增,直到达到玩家获得的实际分数。我试图用一个 while 循环和一个 for 循环来编写它,但它不能正常工作——我很明显仍然误解了更新方法是如何工作的。这是关卡结束屏幕的 render() 方法:
@Override
public void render (float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
timeElapsed = delta;
while(this.iCounter < this.score) {
font.draw(batch, "Score: " + this.iCounter, screenWidth / 2, screenHeight / 2);
if(timeElapsed > 1.0f) {
iCounter = iCounter + 10;
}
timeElapsed = 0.0f;
}
batch.end();
}
以上似乎使屏幕崩溃。
我只想让分数从零开始,然后每隔半秒增加一次分数,直到达到实际分数。
有没有人知道如何正确执行此操作,因为我似乎无法正常工作。
每帧都会调用渲染方法,您放入其中的所有绘图都应该只针对单个帧。它正在做的是试图 运行 你的整个外观在一个框架中,因此看起来它已经崩溃了。
您需要做的是摆脱循环,只需在每一帧(即每次调用 render() 时)向 iCounter 添加一个数量。
这是你的代码编辑成一个非常简单的实现来展示我的意思...
@Override
public void render (float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "Score: " + this.iCounter, screenWidth / 2, screenHeight / 2);
if (this.iCounter < this.score) {
this.iCounter++;
}
batch.end();
}
这会增加每一帧的分数,我认为可能就是您想要的。它应该提供一个很好的起点的 Eitehr 方式。
您在渲染中多次调用 font.draw()
。结果将是多个分数,相互叠加。
请注意,render
每帧调用一次,您希望在 n
帧上为乐谱设置动画。
所以你的变量 iCounter
应该是一个 class 变量,你在 render
方法中递增并绘制一次。您可能还想存储一个常量 scorePerSecond
,它定义了每秒 iCounter
增量的数量。
所以结果应该是这样的:
public static final int SCORE_PER_SECOND = 100;
private int iCounter;
public void render (float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
iCounter = Math.min((int)(iCounter+SCORE_PER_SECOND*delta), score)
font.draw(batch, "Score: " + this.iCounter, screenWidth / 2, screenHeight / 2);
batch.end();
}
感谢楼上所有帮助过我的人。这就是我最终让它工作的方式。
time += delta;
if (time >= this.SCORE_DELAY) {
if (iCounter < this.score) {
iCounter = iCounter + 10;
}
time -= this.SCORE_DELAY;
}
SCORE_DELAY 被声明为浮点数,我将设置设置为 0.15f,这似乎是一个不错的比率。
private static float SCORE_DELAY = 0.15f;
我的游戏有关卡结束屏幕,我希望在该屏幕上显示动画玩家分数。如果您在 Angry birds 和许多其他游戏中看到过,分数文本从“000000”开始并快速递增,直到达到玩家获得的实际分数。我试图用一个 while 循环和一个 for 循环来编写它,但它不能正常工作——我很明显仍然误解了更新方法是如何工作的。这是关卡结束屏幕的 render() 方法:
@Override
public void render (float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
timeElapsed = delta;
while(this.iCounter < this.score) {
font.draw(batch, "Score: " + this.iCounter, screenWidth / 2, screenHeight / 2);
if(timeElapsed > 1.0f) {
iCounter = iCounter + 10;
}
timeElapsed = 0.0f;
}
batch.end();
}
以上似乎使屏幕崩溃。
我只想让分数从零开始,然后每隔半秒增加一次分数,直到达到实际分数。
有没有人知道如何正确执行此操作,因为我似乎无法正常工作。
每帧都会调用渲染方法,您放入其中的所有绘图都应该只针对单个帧。它正在做的是试图 运行 你的整个外观在一个框架中,因此看起来它已经崩溃了。
您需要做的是摆脱循环,只需在每一帧(即每次调用 render() 时)向 iCounter 添加一个数量。
这是你的代码编辑成一个非常简单的实现来展示我的意思...
@Override
public void render (float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "Score: " + this.iCounter, screenWidth / 2, screenHeight / 2);
if (this.iCounter < this.score) {
this.iCounter++;
}
batch.end();
}
这会增加每一帧的分数,我认为可能就是您想要的。它应该提供一个很好的起点的 Eitehr 方式。
您在渲染中多次调用 font.draw()
。结果将是多个分数,相互叠加。
请注意,render
每帧调用一次,您希望在 n
帧上为乐谱设置动画。
所以你的变量 iCounter
应该是一个 class 变量,你在 render
方法中递增并绘制一次。您可能还想存储一个常量 scorePerSecond
,它定义了每秒 iCounter
增量的数量。
所以结果应该是这样的:
public static final int SCORE_PER_SECOND = 100;
private int iCounter;
public void render (float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
iCounter = Math.min((int)(iCounter+SCORE_PER_SECOND*delta), score)
font.draw(batch, "Score: " + this.iCounter, screenWidth / 2, screenHeight / 2);
batch.end();
}
感谢楼上所有帮助过我的人。这就是我最终让它工作的方式。
time += delta;
if (time >= this.SCORE_DELAY) {
if (iCounter < this.score) {
iCounter = iCounter + 10;
}
time -= this.SCORE_DELAY;
}
SCORE_DELAY 被声明为浮点数,我将设置设置为 0.15f,这似乎是一个不错的比率。
private static float SCORE_DELAY = 0.15f;