フレームスキップ
どうやら、おめがさんが「RECT WINDER」に手を入れようとされている模様。
http://d.hatena.ne.jp/o_mega/20061109/1163033243
しかし、ソースコードを読んだところ、フレームスキップ処理を入れてないのにガッカリしたようです。
適当ですみません。
その点、ABAさんだと、ウェイトを可変にしたりフレームスキップしていたりと、しっかり計算してますね。
(mainloop.dからコード抜粋)
public void loop() { done = false; // ゲームループ終了フラグ long prvTickCount = 0; // 1つ前の時間 int i; long nowTick; // 現在の時間 int frame; // 更新フレーム数 // ゲームループ while (!done) { nowTick = SDL_GetTicks(); // 現在の時間を取得 frame = cast(int) (nowTick-prvTickCount) / interval; // interval=16 経過時間を更新間隔で割って、更新回数を求める if (frame <= 0) { frame = 1; // 1回だけ動かす SDL_Delay(prvTickCount+interval-nowTick); // 余裕が出来たので止めてやる if (accframe) { prvTickCount = SDL_GetTicks(); // 早送り } else { prvTickCount += interval; } } else if (frame > maxSkipFrame) { // フレームスキップ数の最大値を超えた(処理落ち) frame = maxSkipFrame; prvTickCount = nowTick; } else { prvTickCount += frame * interval; } // フレームスキップ for (i = 0; i < frame; i++) { gameManager.move(); } } }
まー、お詫びにD言語Tipsでも。
Q1.Access Violationで落ちる
たいていヌルポです。または.objを消してからビルドしなおすとうまくいく場合があります。
Q2.これ何で型の指定がないのにうまくいくの?
foreach(i; [1,2,3]) { printf("%d\n", i); }
foreachでは「型推論」というのが働いてくれるので、型の指定を省略することが出来ます。
Q3.この「inout」って何?
foreach(inout token; getToken()) { token = new Token; }
foreachはデフォルトではコピーしてしまうので代入ができません。
「inout」をつけると参照になりますので、代入ができます。
Q5.数値を文字列に変換したい!
std.string.toString()を使います。
import std.string; ・ ・ ・ char[] str = std.string.toString(50) ~ "/" ~ std.string.toString(100);
Q6.これ何?
static TokenManager!(Item) parent;
TokenManager(T)
というテンプレートクラスのテンプレートを「Item」クラスで使用する、という宣言です。
Q7.this()って?
クラスのコンストラクタです。
Q8.cast(int)posXって?
変数「posX」をint型にキャストしています。
Q9.「nan」とかいう怪しい値が出てきたんですけど、、。
「float/double/real」型の初期値は「nan」で、これを加算代入したりすると「nan」になってしまいます。
必ず「0」などで初期化したほうがよいです。
なお、bool型は「false」、int型は「0」で初期化されます。