北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

残像を実装してみました

アルゴリズムは知りつつ、今までやったことなかったので。

この残像のアルゴリズムは非常に単純です。動くオブジェクトが、一定時間ごとに残像オブジェクトを発生させることで残像に見せています*1。glView->zanzouが残像タスクのリストで、こいつはNSMutableArrayを使っています*2

-(void)process{
	/* オブジェクトを動かす処理(略) */

	if(count % 2 == 0){
		//残像を追加
		Zanzou *z = [[Zanzou alloc] initView:glView X:x  Y:y Deg:deg];
		[glView->zanzou addObject: z];
		[z release];
	}
}

残像オブジェクトは、生成された位置(x, y)と角度(deg)のまま居座るオブジェクトです。時間経過と共に色が薄くなり、一定時間で消滅します。

-(void)process{
	count--;
	if(count <= 0){
		/* 時間が経ったら消滅 */
		[glView->zanzou removeObject: self];
	}
}

-(void)draw{
	/* 色の計算。時間とともに薄く(黒く)なる */
	GLfloat color = 1.0f / 20.0f * count;
	glColor4f(0, 0, color, 1.0f);

	/* この色で、対象オブジェクトと同じ形状を描写(略) */
}

なお、このサンプルのオブジェクトの形状はごにいさんtekitostrikerからお借りしました(ぇぇぇ。

*1:青いオブジェクトの一つ一つが残像オブジェクト

*2:今は速度気にしてないのでお手軽なのを選択。実用的には循環リストの方がいいと思います。