DirectXプログラミング講座 〜Vol17. 【2Dシューティング】自機と背景を表示しよう〜

今回の章から、縦スクロールシューティングを製作するための実作業に入ってきます。まずは、背景と自機を画面に表示してみます。


おおまかな方法ですが、背景と自機の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

尚、これらのビットマップファイルは、下記サイトのフリー画像を利用させていただいております。

コーディング作業

"fight.abp" の先頭部分のコーディング

画面サイズに関する定数、画像表示に利用する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のコーディング

自機を操作するためのクラス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

InitProc関数のコーディング

背景画像(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

QuitProc関数のコーディング

背景画像(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

InputActionProc関数のコーディング

今回は何も記述しません。

Sub InputActionProc()
    ' TODO: この位置に入力に関するコードを記述してください。
    '       (キーボード、マウス、ジョイパッド、ジョイスティックなどによる入力)

    ' メモ - キャラクタの移動など、状況進行(アクション)を意味するコードを
    '        記述することもできます。

End Sub

RenderProc関数のコーディング

背景と自機を描画します。背景の描画は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