テキストの表示

 やるのをすっかり忘れていましたが、今回は、画面上にテキストメッセージを表示してみます。
文字を1文字ずつ表示するなどの便利機能もありますが、今回は表示するだけです。

 さて、テキストを表示するには大きく分けて2つの方法があります。

命令 内容・特徴
E3DDrawText
E3DDrawBigText
英数字のみ表示でき、日本語は使用できない。フォントの指定が必要ないので手軽に利用できるが、大きさが指定しにくく、またあまりきれいではない。
デバッグ向き?
E3DDrawTextByFontID
E3DDrawTextByFontIDWithCnt
E3DDrawTextByFontIDWithCnt2
日本語の表示にも対応している。事前に文字のフォントやスタイルを宣言してフォントIDを取得しておく必要があります。自由な表現が可能で、大きさを変えてもきれいです。
通常はこちらを使うようにするといいでしょう。

フォントを指定して使う後者の方法を用いるのが普通だと思います。

フォントIDを発行する

 E3DDrawTextByFontID系の命令を使用するには事前にフォントやスタイルを指定したフォントIDを作成しておく必要があります。 これはE3DDrawText系の命令では必要ありませんので、E3DDrawText系命令を使うときは気にしなくていいです。

 フォントの指定には、E3DCreateFont命令を使用します。
この命令では、フォント名、文字の高さ、文字幅、太さ。斜体、下線、取り消し線の有無。が指定できます。
E3DCreateFont命令を実行してこれらの設定をするとフォントIDが1つ発行されます。
文字を表示するときは、このフォントIDを使ってフォントやスタイルを決めて表示します。

 通常は、メインループに入る前に、事前に使用するフォントやスタイルのパターンを全てE3DCreateFont命令で登録し、フォントIDを発行しておいてください。 メインループ内ではE3DCreateFont命令は使用しないほうが無難です。

メインループ内での使い方

文字列を表示するときは、メインループ内のテキスト表示命令を挿入する位置に注意する必要があります。次のような感じです。

  • E3DBeginSceneより後で実行してください。
  • E3DPresentより前に実行してください。
  • E3DRenderで地面やモデルをレンダリングした後に実行するようにしてください。

 E3DBeginSceneE3DPresentの間に記述しないと、テキストは表示されません。
 E3DRenderより前に実行するとE3DRenderで作成したモデルの後ろ側に表示されてしまいます。(テキストがモデルの影に隠れてしまう。)
これを利用すれば特定のモデル上にだけ文字列が表示するという妙な効果も出せそうです。(なんに使うのかはさておき。)(^_^;

サンプル

テキストの表示 表示するだけなので、特に注意点はありません。
メインループ内のサブルーチンへのジャンプ位置をいろいろ変えて動作を確認してみてください。
あとは、E3DDrawTextByFontID系命令での文字サイズを変えたときの文字の拡大方法に注目。

実行に必要なファイル:e3d3004.zip

解凍に成功すると、Mediaフォルダとe3d3004.hspが作成されます。

次に、下のスクリプトをコピーして、HSPのスクリプトファイルを作成してください。
作成したファイルは、e3d3004.hspがある場所と同じ場所におきます。

これでサンプルを実行することが出来ます。

;
;	文字列を表示する
;

#include "e3dhsp3.as"

	;/////////////////
	;
	;	初期化
	;
	wid = 0		;ウインドウID
	objid = -1	;オブジェクトID
	fullscreenflag = 0		;フルスクリーンフラグ
	bits = 16	;色数ビット数(fullscreenflag = 1 のときのみ有効)
	multisamplenum = 0		;アンチエイリアスのマルチサンプル数(0,2~16)
	;scid	スワップチェインID
	E3DInit wid, objid, fullscreenflag, bits, multisamplenum, scid

	;フォントの設定
;	E3DCreateFont 24,, 400, , , , "MS ゴシック", fontid
	E3DCreateFont 24,, 400, , , , msgothic, fontid

	;/////////////////
	;
	;	カメラの初期化
	;
	camposx = 0.0 : camposy = 2500.0 : camposz = 0.0
;	camposx = 0 : camposy = 0 : camposz = 4200	;デフォルト値
	E3DSetCameraPos camposx, camposy, camposz	;カメラ座標を設定
	targetx = 4500		;注視点座標
	targety = 0
	targetz = 4500
	upvecx = 0		;カメラの上方向のベクトル
	upvecy = 1
	upvecz = 0
	E3DSetCameraTarget targetx, targety, targetz, upvecx, upvecy, upvecz	;カメラの注視点を設定
	;プロジェクションの設定
	proj_near = 100.0 : proj_far = 50000.0 : proj_fov = 45.0
	E3DSetProjection proj_near, proj_far, proj_fov

	;/////////////////
	;
	; ライトの設定
	;
	E3DCreateLight lid1 ;光源を作成
	lightdirx1 = 1 ;平行光の向き
	lightdiry1 = -1
	lightdirz1 = 0
	lightr1 = 255	;平行光の色
	lightg1 = 255
	lightb1 = 255
	E3DSetDirectionalLight lid1, lightdirx1, lightdiry1, lightdirz1, lightr1, lightg1, lightb1 ;光源を平行光源に設定

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

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

	E3DLoadGroundBMP pathbuf.0, pathbuf.1, pathbuf.2, pathbuf.3, mapsize, mapsize, mapdiv, mapdiv, mapheight, hsid0
	posx0 = 0.0 : posy0 = 0.0 : posz0 = 0.0
	degx0 = 0.0 : degy0 = 0.0 : degz0 = 0.0
	E3DSetPos hsid0, posx0, posy0, posz0	;地面表示位置を設定
	E3DSetDir hsid0, degx0, degy0, degz0	;地面の向きを設定
	frameno0 = 0	;モーションは使用しない。


;/////////////////
;
;	メインループ
;
*main
	E3DChkInView scid, hsid0	;モデルが、視野内にあるか判定
	E3DBeginScene	;-----シーンスタート
		;バックバッファへの書き込み作業を行う

		stick key
		if key&128 : goto *bye
;		gosub *text
		E3DRender scid1, hsid0, 0, frameno0, 0	;バックバッファにレンダリングする。(地面描画)
		gosub *text

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

	E3DWaitByFPS 60, chkfps1 : await 0
	title ""+chkfps1 + " FPS"

goto *main


;/////////////////
;
;	終了処理
;
*bye
	E3DDestroyLight lid1	;ライトを破棄
	E3DBye
	end

;/////////////////
;
;	テキスト表示
;
*text
	scl = 24
	E3DDrawText 10,10, 1, 255,255,255, "\"E3DDrawText\" (alphabet only)"
	E3DDrawText 10,10+scl*1, 2.0, 255,255,255, "2.0"
	E3DDrawText 50,10+scl*1, 1.0, 255,255,255, "1.0"
	E3DDrawText 150,10+scl*1, 0.5, 255,255,255, "0.5"
	E3DDrawBigText  10,10+scl*3, 1.0, 255,255,255, "\"E3DDrawBigText\" (alphabet only)"
	E3DDrawBigText  10,10+scl*5, 2.0, 255,255,255, "2.0"
	E3DDrawBigText  50,10+scl*5, 1.0, 255,255,255, "1.0"
	E3DDrawBigText 150,10+scl*5, 0.5, 255,255,255, "0.5"

	E3DDrawTextByFontID scid, fontid, 10,250, "\"E3DDrawTextByFontID\" (日本語表示)", 255,255,255,255
return