手动计算增量时间

时间:2017-11-07 09:20:47

标签: c++ arduino timedelta

我试图学习如何手动计算增量时间(自上次游戏循环更新以来的时间),但我必须误解某些地方。我是为Arduino项目做这件事的,但它同样适用于我想的任何语言或平台。

我定义了变量oldTimecurrentTimedeltaTime以及每个游戏循环我执行以下操作:

void loop() {
   oldTime = currentTime;  // Save time from last loop.
   currentTime = millis(); // Time since program began.
   deltaTime = currentTime - oldTime; // Calculate time taken by game loop.
}

然后,当我使用它们来转换精灵时,我将精灵速度乘以deltaTime。然而,它并没有导致速度与屏幕上绘制的内容无关。当我的背景充满了瓷砖时,速度很快,但是当我根本不绘制背景时,精灵速度真的很慢。

我在这里误解了什么吗?

非常感谢您的帮助!

编辑:添加更多信息.....背景只是在屏幕上重复的一个图块。因此具有背景将增加绘制时间,因此应增加deltaTime。所有绘图都在loop函数的末尾完成。

编辑2:我不妨添加整个代码。

#include <Arduboy.h>
Arduboy arduboy;

const unsigned char background[] PROGMEM = {
  0x81, 0x00, 0x12, 0x40, 0x4, 0x11, 0x00, 0x4,
};
const unsigned char player[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x34, 0xfc, 0x8f, 0x34, 0x6, 0x36, 0x8e, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2, 0x1e, 0xe6, 0xa3, 0xda, 0x83, 0xc4, 0xb8, 0x00, 0x00, 0x00, 0x00,
};

int playerX;
int playerY;

unsigned long currentTime = 0;
unsigned long oldTime = 0;

void setup() {
  arduboy.begin();
  arduboy.clear();
  ResetGame();
}

void loop() {
  oldTime = currentTime;
  currentTime = millis();
  unsigned long deltaTime = currentTime - oldTime;

  arduboy.clear();
  for (int i = 0; i < 128; i += 8) {
    for (int j = 0; j < 64; j += 8) {
      arduboy.drawBitmap(i, j, background, 8, 8, WHITE);
    }
  }
  arduboy.fillRect(playerX + 4, playerY, 8, 16, BLACK);
  arduboy.drawBitmap(playerX, playerY, player, 16, 16, WHITE);
  arduboy.setCursor(0, 0);
  arduboy.print(arduboy.eachFrameMillis);
  if (arduboy.pressed(LEFT_BUTTON))
    playerX -= deltaTime;
  if (arduboy.pressed(RIGHT_BUTTON))
    playerX += deltaTime;
  if (arduboy.pressed(UP_BUTTON))
    playerY -= deltaTime;
  if (arduboy.pressed(DOWN_BUTTON))
    playerY += deltaTime;
  if (arduboy.pressed(A_BUTTON) and arduboy.pressed(B_BUTTON))
    ResetGame();

  arduboy.display();
}

void ResetGame()
{
  playerX = 5;
  playerY = 10;
  return;
}

1 个答案:

答案 0 :(得分:1)

我自己设法解决了这个问题。我只是将字符位置变量更改为浮点数而不是整数,并将时间变量更改为浮点数而不是长整数。我真的不明白为什么这会解决这个问题。