今回の章から、縦スクロールシューティングを製作するための実作業に入ってきます。まずは、背景と自機を画面に表示してみます。
おおまかな方法ですが、背景と自機のCImage2Dオブジェクトをそれぞれ用意し、テクスチャのセットと表示を行うのが一連の流れになります。CImage2Dについては、Vol4. 2Dポリゴンの表示、Vol5. テクスチャの貼り付けで詳しく説明しています。
ベース プロジェクトを生成します。ProjectEditorの新規作成から「プロジェクト」を選択し、表示されたダイアログボックスでは更に「DirectX対応アプリケーション」を選択して、プロジェクト名を "fight" とします。
背景、キャラクタに必要な2つのビットマップファイルを、プロジェクトディレクトリに用意します。textures.zipをダウンロード&解凍すると、"chara_map1.bmp"、"chara_map2.bmp"、"back_ground.bmp" が生成されます。2つのキャラクタマップについては、DirectGraphicsのテクスチャの特性上、2のn乗の数値の幅・高さに調節されています。余白が生じておりますが、システム上必要なものですので、ご了承ください。
↓キャラクタマップ その1![]() |
↓背景画像![]() |
↓キャラクタマップ その2![]() |
尚、これらのビットマップファイルは、下記サイトのフリー画像を利用させていただいております。
画面サイズに関する定数、画像表示に利用するCImage2Dクラスのオブジェクトポインタ、自機オブジェクトpMyPlaneを定義します。自機オブジェクトの雛型であるCPlaneクラスは、後ほど定義します。
#include "fight.idx"
Dim ScreenX=640 As Long 'ディスプレイの幅 (ピクセル単位)
Dim ScreenY=480 As Long 'ディスプレイの高さ(ピクセル単位)
' TODO: この位置にグローバル変数を定義してください。
Const SCREENBASE_X=140 'ゲーム画面左上のスクリーンX座標
Const SCREENBASE_Y=0 'ゲーム画面左上のスクリーンY座標
Const SCREEN_WIDTH=360 'ゲーム画面の幅
Const SCREEN_HEIGHT=480 'ゲーム画面の高さ
'背景画像
Dim pImage_BackGround As *CImage2D
'キャラクタマップ画像
Dim pImage_CharaMap1 As *CImage2D
Dim pImage_CharaMap2 As *CImage2D
'自機クラス
Dim pMyPlane As *CPlane
画面構成は、下記のような感じになります。SCREENBASE_X、SCREENBASE_Y、SCREEN_WIDTH、SCREEN_HEIGHTは、これらの数値に基準します。
自機を操作するためのクラスCPlaneを定義します。記述場所は先ほどの先頭部分の下にでもしておきましょう。今回は自機の表示を行うだけなので、Draw関数を定義しています。Draw関数の中では、CImage2D::DrawStretchを呼び出し、テクスチャの任意個所を抜き出して画面に描画しています。
'---------------
' 自機クラス
'---------------
Class CPlane
'位置・高さ・幅
x As Long
y As Long
width As Long
height As Long
Public
'コンストラクタ
Sub CPlane()
width=32
height=32
'初期位置
x=SCREEN_WIDTH/2
y=SCREEN_HEIGHT*0.8
End Sub
'デストラクタ
Sub ~CPlane()
End Sub
'描画
Sub Draw()
Dim TextureX As Long, TextureY As Long
TextureX=32*2
TextureY=0
pImage_CharaMap1->DrawStretch(
x-width/2 +SCREENBASE_X,
y-height/2 +SCREENBASE_Y,
width,
height,
TextureX,
TextureY,
32,
32)
End Sub
End Class
背景画像(pImage_BackGround)及び2つのキャラクタマップイメージ(pImage_CharaMap1、pImage_CharaMap2)の生成を行います。それが済んでからCPlaneオブジェクトの生成も行います。
Function InitProc()
'DirectXを初期化
If dx_Init(hMainWnd,ScreenX,ScreenY,FALSE)=0 Then
InitProc=0
Exit Function
End If
'マウスカーソルを非表示にする
ShowCursor(FALSE)
' TODO: この位置にアプリケーションの初期化コードを記述してください。
'背景画像を生成
pImage_BackGround=New CImage2D
pImage_BackGround->SetTexture("back_ground.bmp",D3DCOLOR_XRGB(0,0,0))
'キャラクタマップイメージを生成
pImage_CharaMap1=New CImage2D
pImage_CharaMap1->SetTexture("chara_map1.bmp",D3DCOLOR_XRGB(0,0,0))
pImage_CharaMap2=New CImage2D
pImage_CharaMap2->SetTexture("chara_map2.bmp",D3DCOLOR_XRGB(0,0,0))
'自機を生成
pMyPlane=New CPlane
InitProc=1
End Function
背景画像(pImage_BackGround)、2つのキャラクタマップイメージ(pImage_CharaMap1、pImage_CharaMap2)、自機オブジェクト(pMyPlane)を破棄します。
Sub QuitProc()
' TODO: この位置にアプリケーションの終了処理を記述してください。
'背景画像を破棄
Delete pImage_BackGround
'キャラクタマップイメージを破棄
Delete pImage_CharaMap1
Delete pImage_CharaMap2
'自機を破棄
Delete pMyPlane
'DirectXの終了処理
dx_Quit()
End Sub
今回は何も記述しません。
Sub InputActionProc() ' TODO: この位置に入力に関するコードを記述してください。 ' (キーボード、マウス、ジョイパッド、ジョイスティックなどによる入力) ' メモ - キャラクタの移動など、状況進行(アクション)を意味するコードを ' 記述することもできます。 End Sub
背景と自機を描画します。背景の描画はCImage2D::Drawを、自機の描画はCPlane::Drawを呼び出します。ここで、自機描画のDraw関数は、CImage2Dのメンバ関数ではなく、独自に定義されたCPlaneクラスのものであるところに注意しましょう。先ほどのCPlaneクラスの記述部分を見れば、CPlane::Drawの中でCImage2D::DrawStretchが呼び出されることが確認できますね。
Sub RenderProc()
' TODO: この位置に描画に関するコードを記述してください。
Dim i As Long
'背景を描画
pImage_BackGround->Draw(
SCREENBASE_X,
SCREENBASE_Y,
SCREEN_WIDTH,
SCREEN_HEIGHT)
'自機を描画
pMyPlane->Draw()
End Sub
背景と自機が下のように表示されれば成功です。まだキー入力を受け付けていないので、終了する際はAlt+F4キーを押しましょう。
講座インデックスへ戻る | ©2005 Discoversoft |