在保持相同的变量值的同时暂停取消暂停?

时间:2016-05-19 19:39:16

标签: android c++ sdl-2

我正在学习使用 SDL C ++ 制作游戏。

我使用基于时间的移动而不是帧速率。 我的播放器向右/向左移动,当我按空格键时,它会改变方向。

现在如果我暂停游戏

  • 在Windows上最小化它
  • 按下我的手机上的HOME按钮(Android)
  • 或在手机上关闭屏幕

计时器不会暂停。 ( SDL_GetTicks()不会停止)我的播放器继续移动。

当玩家触及"墙壁时#34;或者"敌人"他们死了,游戏结束了。 每当我暂停游戏时都会发生这种情况。

  • 我该如何解决这个问题?
  • 当我暂停游戏X秒然后再取消暂停时,我的变量(例如:不同精灵/物体的位置)如何保持其值?

请尽可能多地留下详细解释,我会非常感激。

2 个答案:

答案 0 :(得分:0)

也许你应该在暂停游戏时停止你的计时器,并在你停止时再次启动它们(可能会考虑暂停的时间)?或者你可能想要检测游戏暂停的时间,并设置一个标志,“#34;一切都处于暂停状态" 有很多方法可以解决这个问题,其中没有一个真的很困难。 尝试一些方法,然后告诉我们您尝试过的内容和结果。 这个问题需要更多细节......

答案 1 :(得分:0)

使用基于时间的(从未听过这个术语)移动或直接帧速率之间的唯一区别很简单:一切都是相同的但是你用基于时间的考虑到从上一帧开始经过的时间(这基本上意味着您有logic(float dt)而不是logic(void)

所以只要循环继续运行,一切都不会以固定的时间步长停止。

最简单的方法是跳过主循环逻辑,如果应用程序已经重新签名,并在恢复后立即重置最后一帧的时间。类似的东西:

while (running) {
  if (!isResigned) {
    uint32_t timeElapsed = SDL_GetTicks();
    uint32_t timeDelta = timeElapsed - timeStart;
    logic(timeDelta);
    timeStart = timeElapsed;
  }
}

void applicationResumed() {
  timeStart = SDL_GetTicks();
  isResigned = false;
}

void applicationResigned() {
  isResigned = true;
}

这可以防止在一段时间后恢复将把所有花费的时间都视为时间用于逻辑,而这不应该发生。