フレームスキップ

どうやら、おめがさんが「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」をつけると参照になりますので、代入ができます。
 

Q4.連想配列が使いたいんですけど……

このようにすると使うことができます。

SomethingObject* [char[]] somethingObjectTable;

 

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」で初期化されます。