基礎

座標の扱い

2Dゲームで座標といえば、画面の左上を(0, 0)としたX軸とY軸で表す。
3Dゲームの場合は画面の中央を(0, 0, 0)として、X軸Y軸Z軸の3次元で座標を表す。

(あとでここに図を挿入)

ゲームループ

ゲームループの基本構造は以下のようになる。
セミコロン(;)の後はコメントとして扱われる。
なお、分かりやすいように下記ソースコードではコメントに日本語を使用しているが、実際にBlitz3DのIDEで日本語のコメントを使うと文字化けするので注意。

基本は以下のゲームループに色々処理を足して行けば、ゲーム完成となる。

; ファイルの先頭に include や グローバル定義の宣言、配列の定義などを挿入します。 

; ビデオモードを設定
Graphics3D 640,480,16,2
SetBuffer BackBuffer()
; カメラをセットアップ
cam1 = CreateCamera()
CameraViewport cam1,0,0,640,480

; オブジェクトをロード。例えば、メッシュ、照明、地形、水、スカイボックス、それらに対する当たり判定の設定など
light1=CreateLight()
cube1=CreateCube()
PositionEntity cube1,-2,-2,10

; ここからがメインゲームループ

While Not KeyHit(1)
     ; キーボード/マウスのコントロールを書く
     ; ここに各オブジェクトの動作設定などを書く

     UpdateWorld
     RenderWorld

     ; 2D描画(ライフや点数など)はここで行う
     Text 50,50,"Hello Cube!"

     Flip
Wend

End

; サブルーチンや関数などは、この下に書く

NEW COMMANDS


※ 説明はあえて抽象的な感じにしている。正確にこういうコマンドだと知りたい場合はリファレンスを参照しよう。

Graphics3D 640, 480, 16, 2
Graphics3Dはグラフィックの描画モードを指定するコマンド。
上記の例では、解像度を 640*480、色深度を16Bit、ウィンドウモード(最後の引数が1でフルスクリーン、2でウィンドウモード)で開く。
基本的にフルスクリーンで起動した方が描画速度は早くなるだろう。ただ、デバッグ時はウィンドウモードで起動した方が便利。

SetBuffer BackBuffer()
画面のちらつきを抑えるために必要なコマンド。
裏画面(バックスクリーンやバックバッファと呼ぶ)で全ての描画を行い、Flipコマンドで実際の画面に描画内容を反映させる。
とりあえずFlipとセットで、必ず書くコマンドだと思って間違いない。

light = CreateLight()
cam1 = CreateCamera()
CameraViewport cam1, 0, 0, 640, 480
CreateLightコマンドで光源を作る。3Dワールドは真っ暗なので、光源が無いと何も見えない。試しにCreateLight()をコメントアウトしてみよう。真っ暗な画面が表示されるはずだ。
CreateCameraはカメラを作る。3Dワールドにカメラがあって、そのカメラがウィンドウに世界の風景を映してくれる。だから、カメラがないとウィンドウには3Dワールドが描画されないのだ。
CameraViewportはウィンドウに描画するカメラを設定するコマンドだ。これは何個も設定できる。
上記の例では、cam1を画面いっぱいにウィンドウに描画している。
CameraViewportをいっぱい設定すれば画面分割も可能だ。(N64のマリオカートの4人対戦時の画面分割みたいなもの)

cube1 = CreateCube()
PositionEntity cube1, -2, -2, 10
Blitz3Dではプリミティブな立体を生成することができる。プリミティブ? まぁ要するに立方体や円錐などの簡単な立体をコマンド一つで作ることができる。
上記の例ではCreateCubeコマンドで立方体を作っている。
CreateCubeで生成した立方体は座標(0, 0, 0)に置かれるので、PositionEntityコマンドで立方体を置く位置を調整している。

While Not KeyHit(1)
Whileはループコマンドで条件を満たす内はWhileコマンド内をひたすら繰り返す。
KeyHitコマンドは、指定のキーが押されたことを感知するコマンドで、引数でキーを判定する。
上記の例では、エスケープキーが押されていない間、繰り返し。という意味になる。
つまり、エスケープキーを押すと、ループから抜けますよ。という意味だ。

UpdateWorld
RenderWorld
UpdateWorldコマンドは、3Dワールド内のオブジェクトの位置や動きを実際に反映させるコマンド。
RenderWorldコマンドは実際に画面やバッファに描画するコマンドだ。
似たようなコマンドだが、UpdateWorldはオブジェクトの動きを確定させるもの。RenderWorldは世界を描画させるものと思えば良い。
大体、セットで書いておけば良い。

  Text 50,50,"Hello Cube!"
  Flip
Wend

End
Textコマンドは指定の座標に文字列を書くコマンド。Blitz3Dは日本語に対応していないので、半角英数字しか画面に描画できないが。
Textコマンドで書かれる文字列は2DグラフィックなのでRenderWorldの後に書こう。
Textコマンドはデバッグでよく使用することになると思われる。
Flipコマンドは裏画面を実際の画面に反映させるコマンド。ゲームループの最後に必ず書いておけば良い。

やってみよう!!!

  1. 実際に上記のソースコードをBlitz3Dで実行させてみよう。
  2. CreateCubeで立方体を生成している箇所を変更して、立方体以外の立体に変えてみよう。(例えば円錐とか球とかにしてみよう)
最終更新:2012年12月27日 13:55