游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1406|回复: 0

用ID3DXSprite接口渲染2D图形(简单易用)

[复制链接]

22

主题

92

帖子

94

积分

注册会员

Rank: 2

积分
94
QQ
发表于 2005-8-9 11:20:00 | 显示全部楼层 |阅读模式
论坛里有兄弟着急了
不是说了昨天忙,晚点给你的嘛
我已经上传到我的Blog里了

如有需要可以去下载,太忙了,就不注释了
不知是不是网络问题,Gameres中上传好慢 [em1]


#include <Windows.h>

#include <d3d9.h>
#include <d3dx9.h>
#include <D3dx9core.h>

#pragma comment(lib, "d3dx9dt.lib")
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dxof.lib")
#pragma comment(lib, "dxguid.lib")

#define SAFE_RELEASE(p)      { if(p) { (p)->Release(); (p)=NULL; } }

////////////////////////////////////////////////////////////////////////////////////////////////
LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device
LPDIRECT3DTEXTURE9      g_Texture    = NULL; // Our texture
LPD3DXSPRITE                        g_Sprite     = NULL;


RECT m_SrcRect;                                        //图像显示范围
D3DXVECTOR2 m_Scaling;                        //缩放
D3DXVECTOR2 m_RotationCenter;        //图像中心
D3DXVECTOR2 m_Translation;                //图像显示坐标
FLOAT m_Rotation;                                //旋转角度
D3DCOLOR m_Color;                                //颜色(半透明,滤色镜)


HRESULT InitD3D( HWND hWnd )
{
        g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
        if(g_pD3D == NULL)
        {
                return E_FAIL;
        }

        D3DDISPLAYMODE d3ddm;
        if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
        {
                return E_FAIL;
        }

        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp, sizeof(d3dpp));

        d3dpp.Windowed                        = TRUE;
        d3dpp.SwapEffect                = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat        = d3ddm.Format;

        if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))
        {
                return E_FAIL;
        }

        if( FAILED( D3DXCreateSprite( g_pd3dDevice, &g_Sprite ) ) )
        {
                MessageBox(NULL, TEXT("D3DXCreateSprite Error!"), TEXT("Error"), NULL);
                return E_FAIL;
        }

    return S_OK;
}



void InitGame( HWND hWnd )
{
        InitD3D( hWnd );

        //加载纹理
        if( FAILED( D3DXCreateTextureFromFile(g_pd3dDevice, "mcircle.jpg", &g_Texture) ) )
                MessageBox(NULL, TEXT("InitGame Error!"), TEXT("Error"), NULL);


        m_SrcRect.left = 0;                //图像显示范围
        m_SrcRect.top = 0;
        m_SrcRect.right = 256;
        m_SrcRect.bottom = 256;

        m_Scaling.x = 1.0f;                        //缩放
        m_Scaling.y = 1.0f;

        m_RotationCenter.x = 0.0f;        //图像中心
        m_RotationCenter.y = 0.0f;

        m_Translation.x = 0.0f;                //图像显示坐标
        m_Translation.y = 0.0f;

        m_Rotation = 0.0f;                        //旋转角度
        m_Color = 0XFFFFFFFF;                //颜色(半透明,滤色镜)
}


void Render()
{
        g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 0XFF000000, 1.0f, 0);
        if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
        {
                g_Sprite->Begin();

                g_Sprite->Draw(g_Texture,
                        &m_SrcRect,
                        &m_Scaling,
                        &m_RotationCenter,
                        m_Rotation,
                        &m_Translation,
                        m_Color);

                g_Sprite->End();
                g_pd3dDevice->EndScene();
                g_pd3dDevice-&gtresent(NULL, NULL, NULL, NULL);
        }

}


void GameLoop()
{
        MSG msg;
        BOOL fMessage;

        PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);

        while(msg.message != WM_QUIT)
        {
                fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);

                if(fMessage)
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
                else
                {
                        Render();
                }

        }
}



LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
        switch(msg)
        {
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
                break;
        case WM_KEYUP:
                switch (wParam)
                {
                case VK_ESCAPE:
                        DestroyWindow(hWnd);
                        return 0;
                        break;
                }
                break;

        }

        return DefWindowProc(hWnd, msg, wParam, lParam);
}



void GameRelease()
{
        SAFE_RELEASE(g_Texture);
        SAFE_RELEASE(g_Sprite);
        SAFE_RELEASE(g_pd3dDevice);
        SAFE_RELEASE(g_pD3D);
}


int APIENTRY WinMain(HINSTANCE hInstance,
                                         HINSTANCE hPrevInstance,
                                         LPTSTR    lpCmdLine,
                                         int       nCmdShow)
{
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "2d", NULL };
    RegisterClassEx( &wc );

    HWND hWnd = CreateWindow( "2d", "test",
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                                                          GetDesktopWindow(), NULL, wc.hInstance, NULL );
        ShowWindow(hWnd, SW_SHOWDEFAULT);
        UpdateWindow(hWnd);       

        InitGame(hWnd);

        GameLoop();

        GameRelease();

        UnregisterClass("2d", wc.hInstance);
        return 0;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-26 19:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表