游戏技能冷却时间的图标绘制(转)

只是马马虎虎的 实现了个简陋的,完成基本思想,剩下的就没做了。以后在补上,希望有好的方法的留下脚印。


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

#pragma comment(lib, 
" d3d9.lib " )
#pragma comment(lib, 
" d3dx9.lib " )
#pragma comment(lib, 
" winmm.lib " )

LPDIRECT3D9                g_pd3d 
=   0 ;
LPDIRECT3DDEVICE9        g_pd3dDevice 
=   0 ;
LPDIRECT3DVERTEXBUFFER9    g_pVB 
=   0 ;

const   int  g_width  =   1024 ;
const   int  g_height  =   768 ;

struct  CUSTOMVERTEX 
{
    FLOAT x, y, z, rhw;
    DWORD color;
    
// CUSTOMVERTEX(FLOAT _x, FLOAT _y, FLOAT _z, FLOAT _rhw, DWORD _color)
    
//     :x(_x)
    
//     ,y(_y)
    
//     ,z(_z)
    
//     ,rhw(_rhw)
    
//     ,color(_color){}
};

#define  D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

HRESULT InitD3D(HWND hwnd)
{
    
if  (NULL  ==  (g_pd3d  =  Direct3DCreate9(D3D_SDK_VERSION)))
    {
        MessageBox(NULL, 
" Create D3D Failed! " " Lession13 " , MB_OK);
        
return  E_FAIL;
    }

    D3DCAPS9    caps;
    
int  vp  =   0 ;
    g_pd3d
-> GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,  & caps);
    
if  (caps.DevCaps  &  D3DDEVCAPS_HWTRANSFORMANDLIGHT)
        vp 
=  D3DCREATE_HARDWARE_VERTEXPROCESSING;
    
else
        vp 
=  D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    D3DPRESENT_PARAMETERS d3dpp;
    ::ZeroMemory(
& d3dpp,  sizeof (d3dpp));
    d3dpp.AutoDepthStencilFormat 
=  D3DFMT_D24S8;
    d3dpp.BackBufferCount 
=   1 ;
    d3dpp.BackBufferFormat 
=  D3DFMT_A8R8G8B8;
    d3dpp.BackBufferHeight 
=  g_height;
    d3dpp.BackBufferWidth 
=  g_width;
    d3dpp.EnableAutoDepthStencil 
=   true ;
    d3dpp.Flags 
=   0 ;
    d3dpp.FullScreen_RefreshRateInHz 
=  D3DPRESENT_RATE_DEFAULT;
    d3dpp.hDeviceWindow 
=  hwnd;
    d3dpp.MultiSampleQuality 
=   0 ;
    d3dpp.MultiSampleType 
=  D3DMULTISAMPLE_NONE;
    d3dpp.PresentationInterval 
=  D3DPRESENT_INTERVAL_IMMEDIATE;
    d3dpp.SwapEffect 
=  D3DSWAPEFFECT_DISCARD;
    d3dpp.Windowed 
=   true ;

    
if  (FAILED(g_pd3d -> CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp,  & d3dpp,  & g_pd3dDevice)))
    {
        MessageBox(NULL, 
" Create Device Failed! " " Lession13 " , MB_OK);
        
return  E_FAIL;
    }

    
// D3DXMATRIX matProj;
    
// D3DXMatrixIdentity(&matProj);
    
// D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1, 1, 1000);

    
// g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
     return  S_OK;
}

HRESULT InitVB(FLOAT angle, LPRECT rt, DWORD dwColor)
{
    
// float angle = (360*0.01)*nPercent;
     int  nArea  =  angle  /   45 ;

    
int  nTriangles  =  nArea  +   1 ;
    
int  nPoints  =  nArea  +   2 ;

    
//  规定中心点
     int  ndivX  =  (rt -> right  -  rt -> left) >> 1 ;
    
int  ndivY  =  (rt -> bottom  -  rt -> top) >> 1 ;

    
//  默认的赋值
    CUSTOMVERTEX pVerteics[]  =  
    {
            {ndivX,        ndivY,        
0 0 .f, dwColor},  //  1
            {ndivX,        rt -> top,     0 0 .f, dwColor},  //  2
            {rt -> left,    rt -> top,     0 0 .f, dwColor},  //  3
            {rt -> left,    ndivY,         0 0 .f, dwColor},  //  4
            {rt -> left,    rt -> bottom,     0 0 .f, dwColor},  //  5
            {ndivX,        rt -> bottom,  0 0 .f, dwColor},  //  6
            {rt -> right,    rt -> bottom,     0 0 .f, dwColor},  //  7
            {rt -> right, ndivY,         0 0 .f, dwColor},  //  8
            {rt -> right, rt -> top,     0 0 .f, dwColor},  //  9
            {ndivX,        rt -> top,     0 0 .f, dwColor},  //  2
    };

    
int  leave_angle  =  ( int )angle  %   45 ;
    
if  ( ! leave_angle)
    {
        nTriangles 
-=   1 ;
    }
    
//  计算此时秒针的向量
    D3DXVECTOR2    v  =    * (D3DXVECTOR2  * )(pVerteics + nTriangles);
    D3DXVECTOR2 v2 
=   * (D3DXVECTOR2  * )(pVerteics + nPoints);
    D3DXVECTOR2 nor 
=   * (D3DXVECTOR2  * )(pVerteics);
    D3DXVECTOR2 vResult;

    
if  ((angle != 45 ) || (angle != 225 ))
    {
        D3DXVECTOR2 vDummy1 
=  v  -  nor;
        D3DXVECTOR2 vDummy2 
=  v2 -  nor;
        
// D3DXVec2Lerp(&vResult, &vDummy1, &vDummy2, leave_angle);
         switch  (nArea)
        {
        
case   0 :
            vResult.y 
=   0 ;
            vResult.x 
=  ndivX  -  ndivY * tanf((leave_angle) * D3DX_PI / 180 );
            
break ;
        
case   1 :
            vResult.x 
=  rt -> left;
            vResult.y 
=  ndivY  -  ndivX * tanf(( 45 - leave_angle) * D3DX_PI / 180 );
            
break ;
        
case   2 :
            vResult.x 
=  rt -> left;
            vResult.y 
=  ndivY  +  ndivX * tanf((leave_angle) * D3DX_PI / 180 );
            
break ;
        
case   3 :
            vResult.y 
=  rt -> bottom;
            vResult.x 
=  ndivX  -  ndivY * tanf(( 45 - leave_angle) * D3DX_PI / 180 );
            
break ;
        
case   4 :
            vResult.y 
=  rt -> bottom;
            vResult.x 
=  ndivX  +  ndivY * tanf((leave_angle) * D3DX_PI / 180 );
            
break ;
        
case   5 :
            vResult.x 
=  rt -> right;
            vResult.y 
=  ndivY  +  ndivX * tanf(( 45 - leave_angle) * D3DX_PI / 180 );
            
break ;
        
case   6 :
            vResult.x 
=  rt -> right;
            vResult.y 
=  ndivY  -  ndivX * tanf((leave_angle) * D3DX_PI / 180 );
            
break ;
        
case   7 :
            vResult.x 
=  ndivX  +  ndivY  *  tanf(( 45 - leave_angle) * D3DX_PI / 180 );
            vResult.y 
=  rt -> top;
            
break ;
        }
        
* (D3DXVECTOR2  * )(pVerteics + nPoints)  =  vResult;
    }
    
else
    {
        D3DXVec2Lerp(
& vResult,  & v,  & v2, leave_angle / 45 );
        
* (D3DXVECTOR2  * )(pVerteics + nPoints)  =  vResult;
    }

    
// g_pd3dDevice->CreateVertexBuffer((nPoints+1)*sizeof(CUSTOMVERTEX), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &g_pVB, 0);
    
// void * pV;
    
// if (SUCCEEDED(g_pVB->Lock(0, 0, (void **)&pV, 0)))
    
// {
    
//     memcpy(pV, pVerteics, (nPoints+1)*sizeof(CUSTOMVERTEX));
    
//     g_pVB->Unlock();
    
// }

    g_pd3dDevice
-> SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    g_pd3dDevice
-> SetRenderState(D3DRS_LIGHTING, FALSE);
    g_pd3dDevice
-> Clear( 0 , NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,  0xffffffff 1 .f,  0 );
    g_pd3dDevice
-> BeginScene();
    
// g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
    g_pd3dDevice -> SetFVF(D3DFVF_CUSTOMVERTEX);
    
// g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, nTriangles, nPoints);
    g_pd3dDevice -> DrawPrimitiveUP(D3DPT_TRIANGLEFAN,nTriangles,pVerteics, sizeof (CUSTOMVERTEX)); 
    g_pd3dDevice
-> EndScene();
    g_pd3dDevice
-> Present( 0 0 0 0 );
    
return  S_OK;
}

VOID Cleanup()
{
    
if  (g_pVB)
    {
        g_pVB
-> Release();
        g_pVB 
=   0 ;
    }

    
if  (g_pd3dDevice)
    {
        g_pd3dDevice
-> Release();
        g_pd3dDevice 
=   0 ;
    }

    
if  (g_pd3d)
    {
        g_pd3d
-> Release();
        g_pd3d 
=   0 ;
    }
}

int  timeCounter  =   0 ;
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    
switch ( msg )
    {
    
case  WM_CREATE:
        SetTimer(hWnd, 
1 25 , NULL);
        
return   0 ;
    
case  WM_DESTROY:
        
        Cleanup();
        PostQuitMessage( 
0  );
        
return   0 ;
    
case  WM_TIMER:
        {
            timeCounter
++ ;
            timeCounter
%= 360 ;
            RECT rt
=  { 0 0 200 200 };
            InitVB(
360 - timeCounter,  & rt,  0xffff0000 );
        }
        
return   0 ;
    }

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




// -----------------------------------------------------------------------------
//  Name: WinMain()
//  Desc: The application's entry point
// -----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    
//  Register the window class
    WNDCLASSEX wc  =  {  sizeof (WNDCLASSEX), CS_CLASSDC, MsgProc,  0L 0L ,
        GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
        
" D3D Tutorial " , NULL };
    RegisterClassEx( 
& wc );

    
//  Create the application's window
    HWND hWnd  =  CreateWindow(  " D3D Tutorial " " D3D Tutorial 05: Textures " ,
        WS_OVERLAPPEDWINDOW, 
100 100 , g_width, g_height,
        NULL, NULL, wc.hInstance, NULL );

    
//  Initialize Direct3D
     if ( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        
/// / Create the scene geometry
         // if( SUCCEEDED( InitVB() ) )
        
// {
            
//  Show the window
            ShowWindow( hWnd, SW_SHOWDEFAULT );
            UpdateWindow( hWnd );

            
//  Enter the message loop
            MSG msg;
            ZeroMemory( 
& msg,  sizeof (msg) );
            
while ( msg.message != WM_QUIT )
            {
                
if ( PeekMessage(  & msg, NULL,  0U 0U , PM_REMOVE ) )
                {
                    TranslateMessage( 
& msg );
                    DispatchMessage( 
& msg );
                }
                
else
                {

                }
            }
        
// }
    }

    UnregisterClass( 
" D3D Tutorial " , wc.hInstance );
    
return   0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值