スプライトを使ってみる

 スプライトというのは今でも使われているようですが、昔の(ファミコン全盛期)ゲームでよく使われた機能で、PCやNPCがちいさなイラストで出来ているあの機能です。
マリオブラザーズやゼビウス、RPGなどなどをイメージしてもらえばいいかなと思います。
厳密な定義はWikipedia等で調べてみてください。

 Easy3Dでもこのスプライト機能を用意に使用することが出来ます。Easy3Dのにスプライトのサンプル(e3dhsp_screenpos.as)があるのでとりあえず実行してみてください。
サンプルもあるのであえてここで取り上げる必要もないと思うのですが、とりあえず書いてみました。
さして難しいようなこともないので、さらっといきます。


基本的な使い方

先ずは使用するスプライトを登録します。

E3DCreateSprite "batu.bmp", 1, spid1

で画像を読み込んで、スプライトIDを取得します。

E3DGetSpriteSize spid1, spw1, sph1

表示位置の調整などのためにスプライトのサイズを取得しておきます。

 実際に表示させるにはメインループ内のE3DBeginSceneE3DEndSceneの間にスプライト描画設定の記述をします。
スプライトの描画設定はE3DBeginSpriteE3DEndSpriteで囲んだ間に記述します。

E3DBeginScene E3DBeginSprite E3DRenderSprite spid1, 100, 100, winx/2,winy/2 ;スプライト描画 E3DEndSprite E3DEndScene

基本的な記述はこれだけでOKです。
透過色やアルファチャンネル、半透明表示、移動、回転いろいろありますが、必要な命令もそろっており、またそれほど難しくはなさそうです。


表示されるレイヤー

スプライトサンプル  テキストも同じなのですが、スプライトの描画命令の記述位置で描画される優先順位が変わってきます。

 サンプルスクリプトの中に、「スプライトの描画(1)」〜「スプライトの描画(3)」とコメントで記述した行があるので、 これをどれか1つづつを有効にして実行してみてください。なんとなく理解してもらえると思います。
2つ以上同時に有効にしても効果が確認できないので、必ず1つづつ有効にして残りの2つはコメントアウトしておいてください。

 普通は地面やキャラクターよりも手前に表示してスコア表示や攻撃の照準装置などに使用します。 この場合は「スプライトの描画(1)」の位置に記述します。
あえて(1)以外の位置に描画して特殊な演出効果をねらうのもよさそうです。

今回注意するのはこれぐらいです。


サンプル

 タコモデルを操作して射撃を行なうサンプルです。的にタコモデルを使用します。
最近スクリプトも長くなってきたので、解説のためあんまり関係なさそうなところをいくつか削除しています。
配布スクリプトは実行可能なように全スクリプト掲載していますのでご安心下さい。
操作はキーボードを使用します。操作方法はつぎのとおり。
キー入力 動作
カーソルキー(↑↓) 前後移動
カーソルキー(←→) 方向転換
Escキー 終了
スクリプトと必要なファイルはこちらです。→[e3d022.zip}
タコモデルのファイルtako.sigとタコ用テクスチャファイルtako01.bmpを用意しておいてください。


;
;	スプライトを描画する
;

#include "e3dhsp.as"

	;/////////////////
	;
	;	初期化
	;
	E3DInit
	dim keybuf, 256		;キー入力

	;/////////////////	
	;
	;	カメラの初期化
	;	ライトの設定
	【いつもどおりなので省略】


	;/////////////////	
	;
	;	形状データのロード
	;
	sdim mediadir, 2048
	mediadir = curdir + "\\tako.sig"
	E3DSigLoad mediadir, hsid1
	E3DSetPos hsid1, 5000, 0, 5000
	frameno1 = 0	;モーションは使用しない。
	E3DSetBeforePos hsid1


	;/////////////////	
	;
	; スプライトデータの読み込み
	;
	E3DCreateSprite "batu.bmp", 1, spid1
	E3DGetSpriteSize spid1, spw1, sph1


	;/////////////////	
	;
	;	地面の作成
	;
	sdim pathbuf, 2048, 4
	pathbuf.0 = curdir + "\\yama.bmp"	;地面の座標情報
	pathbuf.1 = curdir + "\\michi.bmp"	;地面の道の情報
	pathbuf.2 = curdir + "\\kawa.bmp"	;地面の川の情報
	pathbuf.3 = curdir + "\\bazou.bmp"	;地面、道、川の模様を決める、BMPファイル

	;地面作成用の値
	mapsize = 60000		;X,Z座標の最大値
	mapdiv = 60			;座標の分割数
	mapheight = 3000	;高さの最大値

	E3DLoadGroundBMP pathbuf.0, pathbuf.1, pathbuf.2, pathbuf.3, mapsize, mapsize, mapdiv, mapdiv, mapheight, hsid0
	frameno0 = 0	;モーションは使用しない。


;////////////////////////////////////////////////////////////////

;/////////////////
;
;	メインループ
;
*main

	E3DGetKeyboardState keybuf	;キー状態取得

	;モデルが、視野内にあるか判定
	E3DChkInView hsid1	;キャラクター
	E3DChkInView hsid0	;地面
	gosub *ChkConf	;地面との当たり判定

	E3DBeginScene	;-----シーンスタート
		;バックバッファへの書き込み作業を行う

		if keybuf.VK_ESCAPE = 1 : goto *bye ; [ESC]で終了
		gosub *MoveChara		;キャラクター移動
		gosub *MoveCamera		;カメラ移動

;		gosub *DrawSprite	;スプライトの描画(3)

		;バックバッファにレンダリングする。
		E3DRender hsid1, 0, frameno1, 0
;		gosub *DrawSprite	;スプライトの描画(2)
		E3DRender hsid0, 0, frameno0, 0

		E3DDrawText 0, winy/2, 1, 255,255,255, "Message Test Message Test Message Test Message Test Message Test Message Test "
		gosub *DrawSprite	;スプライトの描画(1)
		E3DDrawText 0, winy/2+20, 1, 255,255,255, "Message Test 2 Message Test 2 Message Test 2 Message Test 2 Message Test 2 Message Test 2"


	E3DEndScene		;-----シーン終了
	E3DPresent		;バックバッファの内容を、プライマリバッファに転送。描画する。

	E3DSetBeforePos hsid1

	E3DWaitbyFPS 60 : await 0
goto *main

;////////////////////////////////////////////////////////////////
;
;	サブルーチン
;

;/////////////////
;
;	終了処理
;
*bye
	【いつもどおりなので省略】

;/////////////////
;
;	キャラクター移動
;
*MoveChara
	【いつもどおりなので省略】

;/////////////////
;
;	カメラ移動(キャラクター追跡型)
;
*MoveCamera
	【いつもどおりなので省略】

;/////////////////
;
;	キャラクタの地面との当たり判定
;
*ChkConf
	【いつもどおりなので省略】

;/////////////////
;
;	スプライトの描画
;
*DrawSprite
	E3DBeginSprite

		E3DGetScreenPos2 0,0,0, x2d,y2d, validflag	;3D座標から2D座標取得
		if validflag!0 {
			E3DRenderSprite spid1, 100, 100, x2d - (spw1 / 2),y2d - (sph1 / 2)	;スプライト描画
		}

	E3DEndSprite
	return





- HOME -

GHP(仮)