我的游戏有一个关卡水平的结束,我想在其上显示一个动画播放器得分。如果您在“愤怒的小鸟”和许多其他游戏中看过一个,则乐谱文本从“000000”开始并快速递增,直到达到玩家所达到的实际分数。我试图用while循环和for循环编写它,但它只是不能正常工作 - 我很明显仍然误解了更新方法的工作原理。这是我的End of Level屏幕的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();
}
以上情况似乎让屏幕崩溃。
我只想让分数从零开始,然后每半秒一次,例如增加分数,直到达到实际分数。
有没有人对如何正确地做到这一点有任何想法,因为我似乎无法使其正常工作。
答案 0 :(得分:1)
每个帧都会调用render方法,并且放在那里的所有绘图应该只用于单个帧。它正在做的是试图在一个框架中运行你的整个外观,因此看起来像它已经崩溃。
你需要做的就是摆脱循环,只需每帧向iCounter添加一个数量(即每次调用render())。
这里将您的编码编辑成一个非常简单的实现,以显示我的意思......
@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的方式应该提供一个很好的起点。
答案 1 :(得分:1)
您在渲染中多次调用font.draw()
。结果将是多个分数,在其他分数上绘制。
请注意,每帧调用一次render
,您希望在n
帧上设置分数动画。
因此,您的变量iCounter
应该是一个类变量,并在render
方法中递增并绘制一次。 Yoou可能还想存储一个常量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();
}
答案 2 :(得分:0)
感谢上面帮助过我的每个人。这就是我最终实现它的方式。
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;