プログラマーズマガジン SPARCstationで高速ゲーム



 SPARCstation上で高速に動作するゲームを作る方法を検討します。かなり前に SunOS 4.1.X上でブロックくずしと、縦スクロールのシューティングゲーム (シューティングゲームは一応動くがゲームとしてはゲーム性がほとんどない)を 作ったときの記憶をもとに書くので間違いなどがあるかも知れません (これらのゲームはこのページからダウンロードできるようにする予定です)。 なにかお気づきの点がありましたらメールしてください。
 グラフィックが使える環境で最初に思いつくものはX Windowでしょう。 しかし、Windowシステムが存在する以上Windowシステムを介さない方法よりも かならず処理は遅くなります。それにワークステーションはせっかく 大きなディスプレイを装備しているのですから、画面全体を使うようなゲームに したいのでWindowシステムの出る余地はありません。マシンの性能が上がっているの だからX Windowが動いていても構わないという意見も聞かれますが、ゲームには この理屈は当てはまりません。マシンの性能が上がったら、その分画面をダイナミック に動かしたり3D化に使う必用があります。
 X Windowを使わないとなるとグラフィックを表示する方法はほとんどなくなって しまいます。SPARCstationに残されたグラフィックの表示はフレームバッファ を使う方法です。ワークステーションのフレームバッファをマップして使うという 方法ですが、グラフィックボードの種類に応じて処理を変える必用があるなど 非常に厄介な方法です。この方法もいずれ取り上げようと思いますが、今回は フレームバッファへの処理を簡単してくれるライブラリを使ってみようと思います。
 このライブラリはPixrectライブラリでSunOS 4.1.Xで使用できます。ただ、残念な ことにSolaris 2.Xではこのライブラリが外されてしまい、コンパイルできないどころか ダイナミックリンクしたプログラムを実行することもできません。しかし、 SunOS 4.1.XでスタティックリンクしたものはSolaris 2.Xでも実行することができます。 単なるライブラリなのになぜSolaris 2.Xではずす必用があったのか理解できません。 Solaris 2.Xで使用できるPixrectライブラリも存在するようです。ダウンロード してありますが、まだ調べていません(調べたら報告します)。 PixrectライブラリはSunOS 4.1.X用の一部のCAD、ORCHIDの非ウィンドウ用MAX EDITORで 使用されています。

(1)デバイスのオープン
/devディレクトリにはfbというフレームバッファデバイスが存在します。Pixrectライブラリ はこのデバイスを使用します。pr_open()を使ってこのデバイスをオープンします。
	Pixrect	*pr;

	if(!(pr = pr_open("/dev/fb"))){
		ERROR
	}
	.
	.
	.
	pr_close(pr);
prには画面の情報もセットされます。
	pr->pr_size.x : X方向のサイズ
	pr->pr_size.y : Y方向のサイズ
	pr->pr_depth  : 1ドットあたりのビット数
(2)カラーマップテーブルを待避し、新しいテーブルで設定しなおします。
pr_getcolormap()で待避しpr_putcolormap()で設定します。
	2<<(pr->pr_depth-1)が256以下の場合

	unsigned char
		ored[256], ogreen[256], oblue[256],
		nred[256], ngreen[256], nblue[256];

		.
		.
		.
	pr_getcolormap(pr, 0, 2<<(pr->pr_depth-1), ored, ogreen, oblue);
	pr_putcolormap(pr, 0, 2<<(pr->pr_depth-1), nred, ngreen, nblue);
(3)描画 これで準備はすべて完了なのであとは描画を行うだけです。たとえば画面全体を 0番目のカラーエントリーの色(RGBが0,0,0なら黒)にするには次のように 行います。
	pr_rop(pr, 0, 0, pr->pr_size.x, pr->pr_size.y,
	       PIX_DONTCLIP | PIX_SRC | PIX_COLOR(0), 0, 0, 0);
pr_rop()は画面上でのコピーなどにも使用できます。最後の3このパラメータ 0, 0, 0をpr, 10, 10などと指定します。