Ручное вычисление времени дельты

Я пытаюсь научиться вручную вычислять дельта-время (время с момента последнего обновления игрового цикла), но я, должно быть, кое-что неправильно понимаю. Я делаю это для проекта Arduino, но это в равной степени применимо к любому языку или платформе, я думаю.

Я определил переменные oldTime, currentTime а также deltaTime и в каждом игровом цикле я делаю следующее:

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;
}

0

Решение

Ну, я сумел это исправить сам. Я просто изменил переменные положения символов на числа с плавающей точкой вместо целых и изменил переменные времени на числа с плавающей точкой вместо длинных. Я не очень понимаю, почему это все исправлено.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]