戻る 06. スプライトの表示1 次へ

今回はスプライトの描画です。
J-PHONEには他の携帯JAVAと違ってゲーム志向に設計されています。
その特徴的な事としてスプライト機能があります。

スプライトとは何かというと,
背景とは別に動かせるキャラクタと言った物のことです。
BG面とは独立しているのでスプライトを描画してもBG面は消えません。
これを利用してBG固定ゲームでは高速に処理する事も出来ます。

ファミコンでもキャラクタの表示に使われていました。
しかしファミコンではスプライトの横並びが最大4つまでだったので
ドラクエなどのRPGで横にキャラクタが5人並ぶとちらつくのは
誰もが見たことがあるでしょう。

J-PHONEにも限界はあります,256個まで同時に定義できます。
まぁ充分だと思いますね(^^;
それに実際に同時にそんなにも描画すると重くて使いものにならないでしょう(笑)

J-PHONEスプライトの機能・制限
 最大256個
 サイズは8x8のみ
 90度単位回転・上下左右反転機能搭載
 パレット変更機能搭載

準備中


J-PHONE専用命令なのでMIDPで使用していたCanvasクラスを継承して
用意されているSpriteCanvasクラスを使用します。



必要なパッケージはcom.jblend.graphics.spriteです。
jblendって書いていますけどJ-PHONE用の拡張パッケージです。

スプライトはベタデータ形式から生成します。
まずはベタデータを作る必要がありますがこのフォーマットは単純です。

256色パレットBMPの原理がわかる人ならそれを想像してください。
1バイトがパレット番号をあらわし8x8画素分で1キャラクタとなって
格納する必要があります。64バイトデータ=1キャラクタ

16x16のキャラクタを描画したい場合は4スプライト必要です。
(この辺が融通が利かなくて少し面倒ですね(^^;)
MIDP2.0では自由サイズスプライトが搭載されますのでもう少しの辛抱です(笑)

ソース

//スプライトキャンバスクラスのコンストラクタ
C() {
	// 予約語super(パレット数、パターン数)←必須
	super( 6,4 );

	// パレット・パターンの読み込み
	try {
		InputStream in = getClass().getResourceAsStream("/pal.dat");
		// パレット読み込み
		for ( int c=0 ; c<6 ; c++ ) {
			setPalette( c, ( in.read()<<16)+( in.read()<<8)+in.read());
		}
		in.close();
		in = getClass().getResourceAsStream("/res.dat");
		// パターン読み込み
		for ( int c=0 ; c<4 ; c++ ) {
			byte[] data = new byte[64];
			in.read(data);
			setPattern( c, data);
		}
		in.close();
	} catch ( Exception e ) {
	}

	// スプライト処理コマンドの設定
	for ( int c=0 ; c<4 ; c++) {
		command[ix] = createCharacterCommand( 0, true, 0, false, false, c);
	}
}
createCharacterCommandが肝心のスプライト生成命令です。
不便ですが反転や回転をするには別のスプライトとして用意しなければいけません。
それを引数で与えます。
createCharacterCommand(
	int offset,パレットを指定出来ます(0〜7)
	boolean transparent,透過色を利用するか?(true=利用する)
	int rotation,回転するか?(回転なし:0、90度:1、180度:2、270度:3)
	boolean isUpsideDown,上下反転するか?(true:反転)
	boolean isRightsideLeft,左右反転するか?(true:反転)
	int patternNo パターン番号(登録する番号です)
)


表示部分は次回に持ち越します。

しかし年々ゲーム機も性能が良くなりゲーム自体の視覚効果も派手になってきました。
背景が常に動くゲームの場合,結局毎回全画面書き換えることとなり
そうなるとスプライトの存在の意味もなくなっていきました。
最近のゲーム機ではスプライトはビルボードポリゴンへと
その座をあけわたした感があります..