gpt4 book ai didi

Java w/Slick - 我的跳跃动画似乎以处理器可以处理的速度跳跃

转载 作者:行者123 更新时间:2023-12-01 13:25:42 25 4
gpt4 key购买 nike

我正在使用 Slick2D 制作一个小游戏,并且遇到了一个问题,该问题使我的背景移动到我的角色后面(角色不动)。我不确定这是 Slick 还是我的代码的问题(可能是后者)。这个问题最令人沮丧的是它只是偶尔发生。使用完全相同的代码,它可以完美地工作,但它是完全不可预测的。关于我能做什么有什么想法吗?这是我的更新方法(这里还有一些关于游戏其他方面未完成的东西,所以忽略它):

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException {
Input input = gc.getInput();
if (!grounded) {
vertVelocity -= GRAVITY;
charPositionY += (float) vertVelocity;
}

if (input.isKeyDown(Input.KEY_A) && !quit) {
charPositionX += delta * .4f;
}
if (input.isKeyDown(Input.KEY_D) && !quit) {
charPositionX -= delta * .4f;
}
if (input.isKeyDown(Input.KEY_SPACE)) {
if (grounded) {
vertVelocity = 20;
}
grounded = false;
}
if (charPositionY < ground) {
charPositionY = ground;
grounded = true;
}

if (input.isKeyDown(Input.KEY_ESCAPE)) {
quit = true;
}
if (quit) {
if (input.isKeyDown(Input.KEY_R)) {
quit = false;
}
if (input.isKeyDown(Input.KEY_M)) {
sbg.enterState(0);
}
if (input.isKeyDown(Input.KEY_E)) {
System.exit(0);
}
}
if (charPositionX > MAP_LEFT_LIMIT) {
charPositionX = MAP_LEFT_LIMIT;
}
for (int i = 0; i < crates.length; i++) {
int crateShift = -(crates[i].getPosX()) + 428;
if (charPositionX < crateShift && charPositionX > crateShift - crates[i].getWidth() && charPositionY == 0) {
for (int k = 0; k < crates.length - 1; k++) {
charPositionX = crateShift;
}
}
if (onCrate == false && charPositionX < crateShift && charPositionX > crateShift - crates[i].getWidth() && charPositionY > CRATE_HEIGHT_DEFAULT && !grounded) {
System.out.println(crateShift);
System.out.println(crateShift - crates[i].getWidth());
onCrate = true;
System.out.println("ON CRATE");

}else{
onCrate = false;
}
if(!onCrate){
ground = 0;
System.out.println("NOT ON CRATE");
}else{
ground = 100;
}

if (charPositionY < 0) {
charPositionY = 0;
vertVelocity = 0;
}
if (charPositionX > 210 && charPositionX < crates[i].getPosX() - 32 && charPositionY == 0) {
charPositionX = 210;
}

if (charPositionX < - 270 && charPositionX > - 370 && charPositionY <= 75) {
if (!coinCollected) {
score++;
coinCollected = true;
}
}
if (i == crates.length) {
i = 0;
}
}
}

最佳答案

模型和屏幕的更新通常是在主线程内管理的。这应该是一个与 UI 分开的线程,这样它就可以“暂停”一段特定的时间,而不会阻止 UI 渲染输出或游戏引擎处理用户输入。

最简单的方法是使用Thread.sleep(time),这将导致当前Thread hibernate 至少指定的时间(在毫秒)。这样做的问题是它可能会产生不均匀的更新。

我的意思是,如果在一个周期中更新模型和安排 UI 更新需要 20 毫秒,但下一个周期只需要 10 毫秒,下一个周期只需要 30 毫秒,那么时间就会变得不均匀。

例如,假设您使用 25fps,则需要 40 毫秒的延迟。

  • 第 1 周期,更新 20 毫秒,延迟 40 毫秒,总延迟 = 60 毫秒
  • 周期 #2,更新 10 毫秒,延迟 40 毫秒,总延迟 = 50 毫秒
  • 周期 #3,更新 30 毫秒,延迟 40 毫秒,总延迟 = 70 毫秒

这将开始降低您的帧速率,并可能使您的更新看起来参差不齐。

另一个解决方案是记录执行给定更新所需的时间,并从您想要等待的时间中减去该时间,以确保帧速率尽可能保持恒定。

long startTime = System.currentTimeMillis();
// Update the game state...
long endTime = System.currentTimeMillis();
long cycle = endTime - startTime;
long delay = MAX_DELAY - cycle;
Thread.sleep(delay); // This might need to be wrapped in a try-catch

例如,假设MAX_DELAY = 40...

  • 周期 #1,更新 20 毫秒,40 - 20 = 20 毫秒延迟,总延迟 = 40 毫秒
  • 周期 #2,更新 10 毫秒,40 - 10 = 30 毫秒延迟,总延迟 = 40 毫秒
  • 周期 #3,更新 30 毫秒,40 - 30 = 10 毫秒延迟,总延迟 = 40 毫秒

现在,您可以使用 System.nanoTime,但恕我直言,除非您的 MAX_DELAY 约为 5 毫秒(大约 200fps),否则将时间转换为毫秒所需的额外工作不会带来很多好处 - 请记住高清是 60fps,大约 16 毫秒。

这都是理论,如何将其应用于特定 API 将有所不同。

您的下一步是查找一个很好的教程,该教程更详细地解释了与 Slick2D API 的关系。

关于Java w/Slick - 我的跳跃动画似乎以处理器可以处理的速度跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21817745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com