ビルボードの表示。


【サンプルプロジェクトのダウンロード】


Tuto03.zip<-リンクをダウンロードして下さい。


【プログラム解説】


このプログラムは、前々回のプログラムの内容とさほど変わりありません。

プロジェクトをダウンロードしてコンパイル・実行すればメッシュが表示されますが、
前回のプログラムを改造しても同じものが作れます。
以下、前回のプログラムを改造する場合に、変更が必要な箇所を太字で示します。

#include "stdafx.h"

#include <d3dx9.h>
#include "D3DQuickLib.h"
CD3DEnv    *g_pD3DEnv = NULL; // D3DQuickLib が提供する描画環境。

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);

CBillboard   *g_pBillboard = NULL;
float        g_fTime = 0;
//------------------------------------------------------------
// Name: FrameMove
// Desc: アニメーションを行う。
//        UpdateScene 関数(d3dmain.cpp) からコールバックされる。
//------------------------------------------------------------
void FrameMove(float timeElapsed)
{
    g_fTime += timeElapsed;
    if (g_fTime > 600.0f)
        g_fTime -= 600.0f;
    D3DXVECTOR3    vecMin, vecMax, vecPos;
}

//------------------------------------------------------------
// Name: RenderScene
// Desc: レンダリングを行う。
//        UpdateScene 関数(d3dmain.cpp) からコールバックされる。
//------------------------------------------------------------
void RenderScene(LPDIRECT3DDEVICE9 lpd3ddev)
{
    D3DXMATRIX    matWorld;
    D3DXMatrixTranslation(&matWorld,0.0f,sinf((D3DX_PI /60.0f)* g_fTime),0.0f);
    lpd3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
    lpd3ddev->SetRenderState(D3DRS_LIGHTING, FALSE );
    lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld );
    lpd3ddev->SetRenderState(D3DRS_ZENABLE, FALSE );
    g_pBillboard->Render(lpd3ddev,&matWorld,g_pD3DEnv->GetSystemView(),0.0f,2.0f,0);
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor        = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = NULL;
    wcex.lpszClassName    = "Game";
    wcex.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    RegisterClassEx(&wcex);

    HWND hWnd;
    hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,wcex.lpszClassName,"Game",
                WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
                CW_USEDEFAULT,0,640,480,NULL,NULL,hInstance,NULL);
    if( !hWnd )
        return FALSE;

    RECT    bounds,client;
    GetWindowRect(hWnd,&bounds);
    GetClientRect(hWnd,&client);
    MoveWindow(hWnd,bounds.left,bounds.top,
        640 * 2 - client.right,
        480 * 2 - client.bottom,
        false );

    ShowWindow( hWnd, nCmdShow );
    UpdateWindow( hWnd );

    g_pD3DEnv = new CD3DEnv();
    g_pD3DEnv = new CD3DEnv();
    if (FAILED(g_pD3DEnv->InitD3D(hWnd))){
        DestroyWindow(hWnd);
    }else{
        //    グラフィックスの読み込み
        g_pBillboard = new CBillboard(g_pD3DEnv,1);
        g_pBillboard->SetTexture(0,"billboards\\smile.dds");

        //    デバイスへグラフィックスデータを転送
        g_pD3DEnv->ReloadGraphics();
    }

    MSG        msg;
    while(true){
        if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){
            if(msg.message == WM_QUIT)
                break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }else{
            g_pD3DEnv->UpdateScene(FrameMove,RenderScene);
        }
    }
    //    D3DQuickLib の終了
    SAFE_DELETE(g_pBillboard);
    SAFE_DELETE(g_pD3DEnv);
    
    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch (message){
        case    WM_SIZE:
            //    ウインドウが最大化されたら、フルスクリーンモードにする。
            if (SIZE_MAXIMIZED == wParam){
                if (g_pD3DEnv->IsWindowed())
                    g_pD3DEnv->ToggleFullscreen();
            }
            break;
        case    WM_SETCURSOR:
            //    フルスクリーン時はカーソルを表示させない。
            if (g_pD3DEnv->IsWindowed())
                ::SetCursor(::LoadCursor(NULL,IDC_ARROW));
            else
                ::SetCursor(NULL);
            break;
        case    WM_SYSCHAR:
            //    Alt-Enter でフルスクリーンモードへ切り替える
            if (lParam&0x20000000){
                if (wParam == '\x0d'){
                    g_pD3DEnv->ToggleFullscreen();
                    break;
                }
            }
            return DefWindowProc( hWnd, message, wParam, lParam );
        case    WM_SYSCOMMAND:
            if (!g_pD3DEnv->IsWindowed()){    //    フルスクリーン時
                if (wParam != SC_CLOSE)
                    break;

                //    Windowが閉じられる前にWindowモードに戻しておく。
                g_pD3DEnv->ToggleFullscreen();
                Sleep(100);
            }
            return DefWindowProc( hWnd, message, wParam, lParam );

        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return    0;
}


【画像データの保存】

表示させるデータをプログラムから読み込み可能なフォルダに保存します。

【ステップ1 プロジェクトを開く】
解説
チュートリアル1の時と同様にプロジェクトのフォルダを開きます。 すると、画面は左図のようになったはずです。

ここで、「Debug」フォルダを開きます。
図1 フォルダ Game


【ステップ2 Debug フォルダにデータを保存1】
解説
すると、画面は左図のようになったはずです。 ここに画像データを置きます。

データをダウンロードして、 このフォルダに保存して下さい。
図2 フォルダ Debug


【ステップ3 Debug フォルダにデータを保存2】
解説
すると、画面は左図のようになったはずです。
これでデータが設置されました。

確認の為、「Billboards」フォルダを開いてみてください。
図3 フォルダ Debug


【ステップ4 Billboards フォルダ】
解説
左図のようになれば完成です。
これでデータが設置されました。

コンパイルして実行してみましょう。
図4 フォルダ Billboards


コンパイルして実行してみましょう。
下の図のようになったでしょうか?




これで完成です。