2017-11-07 3 views
0

デルタ時間(最後のゲームループ更新からの時間)を手動で計算する方法を学習しようとしていますが、私はどこかの何かを誤解する必要があります。私はArduinoプロジェクトでこれをやっていますが、それは私が推測するどんな言語やプラットフォームにも等しく適用できます。手動でデルタ時間を計算する

私は、変数oldTimecurrentTimedeltaTimeと、私は次の操作を行い、各ゲームループに定義:スプライトを翻訳するためにそれらを使用しているとき、私はその後、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を増やす必要があります。すべての描画は、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

情報が不十分で、背景を描画するときに何らかの副作用があります。何かがレンダリングされるたびにループが実行されますか? – George

+0

私はいくつかの情報を追加しました。 –

答えて

1

よく私はそれを自分で修正することができました。私は文字の位置変数をintではなくfloatに変更し、longの代わりに時間変数をfloatに変更しました。私は本当になぜこの固定されたものを理解していない。