游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3669|回复: 10

请教问题.....

[复制链接]

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2005-10-11 02:09:00 | 显示全部楼层 |阅读模式
#include<windows.h>
#include<d3d9.h>
#include<d3dx9math.h>
#pragma comment(lib,"D3D9.lib")
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;  //D3D设备
//LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Direct3D设备指针
LPDIRECT3D9       g_pD3D=NULL;               //D3D对象
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // 顶点缓冲区指针
/*D3DXVECTOR3 Eye;
D3DXVECTOR3 LookAt;
D3DXVECTOR3 Up;
*/


struct CUSTOMVERTEX
{
   FLOAT x,y,z;  //Position
   DWORD color;  //Color
};


HRESULT InitD3D(HWND hWnd)
{
          //第2步 建立D3D对象
       
        if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
                return E_FAIL;
        //得到当前显示模式
        /*
         D3DDISPLAYMODE d3ddm;
    if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
        return E_FAIL;
        */
          
        //第3步 建立D3D设备对象
        //Pointer to a Direct3D device
   

        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp,sizeof(d3dpp));
        d3dpp.Windowed=true;
        d3dpp.SwapEffect= D3DSWAPEFFECT_DISCARD ;
        d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
        d3dpp.EnableAutoDepthStencil=TRUE;
        d3dpp.AutoDepthStencilFormat=D3DFMT_D16;

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

};

//初始化顶点信息
HRESULT InitIB()
{
        CUSTOMVERTEX g_Vertices[] =
        {   { 50.0f,  50.0f,   0.5f,  0xffff0000, },     //红色
                { 250.0f,  250.0f,  0.5f,  0xff00ff00, },                //蓝色
                { 50.0f ,  250.0f,  0.5f,  0xff00ffff, },                //绿色
                { 250.0f,  50.0f,   0.5f,   0xffffffff, },     //白色
        };
        //创建顶点缓冲区
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB,NULL ) ) )
    {
        return E_FAIL;
    }
       
    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
    g_pVB->Unlock();
};


VOID Cleanup()
{
    if( g_pVB != NULL )        
        g_pVB->Release();
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();
    if( g_pD3D != NULL )      
        g_pD3D->Release();
}



VOID Render()
{

  g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
  
  //Set the matricse
  D3DMATRIX g_Transform;
  g_pd3dDevice->SetTransform(D3DTS_WORLD,&g_Transform);

  D3DXMATRIX g_View;
  D3DXVECTOR3 Eye(0.0f,-5.0f,0.0f);
  D3DXVECTOR3 LookAt(0.0f,0.0f,0.0f);
  D3DXVECTOR3 Up(0.0f,1.0f,0.0f);

  D3DXMatrixLookAtLH(&g_View,&Eye,&LookAt,&Up);
  g_pd3dDevice->SetTransform(D3DTS_VIEW,&g_View);

  D3DXMATRIX Projection;
  FLOAT FOV=D3DX_PI/4;
  FLOAT Aspect=1.0f;  //如何知道窗口的宽和高,利用哪个函数?

  D3DXMatrixPerspectiveFovLH(&amprojection,FOV,Aspect,1.0f,500.0f);
  g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&Projection);

  //Begin the scene
  if(SUCCEEDED(g_pd3dDevice->BeginScene()))
  {
     g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
         g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST ,0,1);

    //End the scene
         g_pd3dDevice->EndScene();
  }

  //Present the back buffer contents to the display
  g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}



LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }
    return DefWindowProc( hWnd, msg, wParam, lParam );
}

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
   //第1步 建立窗口对象和窗体 Register the window class
        WNDCLASSEX wc;
        wc.cbSize=sizeof(WNDCLASSEX);
        wc.style =CS_CLASSDC;
        wc.lpfnWndProc =MsgProc;
        wc.cbClsExtra =0;
        wc.cbWndExtra =0;
        wc.hInstance=GetModuleHandle(NULL);
        wc.lpszClassName=TEXT("WindowClass");
        wc.hbrBackground =NULL;
        wc.hCursor =NULL;
        wc.hIcon =NULL;
        wc.hIconSm =NULL;
        wc.lpszMenuName =NULL;

        RegisterClassEx(&wc);

        //Create the application's window
        HWND hWnd =CreateWindow(TEXT("WindowClass"),TEXT("Test"),WS_OVERLAPPEDWINDOW,
                                    100,100,512,512,GetDesktopWindow(),NULL,wc.hInstance ,NULL);


   
/*        MSG mssg;
        PeekMessage(&mssg,NULL,0,0,PM_NOREMOVE);
    //run till completed
        while(mssg.message!=WM_QUIT)
        {
           //is there a message to process?
                if(PeekMessage(&mssg,NULL,0,0,PM_REMOVE))
                {
                   //dispatch the message
          TranslateMessage(&mssg);
               DispatchMessage(&mssg);
                }

                else
                        //No message to process?
                        //Then do your game stuff here
                        Render();
        }

*/

          if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // 初始化顶点
        if( SUCCEEDED( InitIB() ) )
        {
            ShowWindow( hWnd, SW_SHOWDEFAULT );
            UpdateWindow( hWnd );

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

    Cleanup();
    UnregisterClass( "WindowClass", wc.hInstance );
    return 0;


}

}



编译时没有发生错误,但连接时有如下的错误显示,不知道怎么回事啊??谢谢
--------------------Configuration: chapter4 - Win32 Debug--------------------
Linking...
chapter4.obj : error LNK2001: unresolved external symbol _D3DXMatrixPerspectiveFovLH@20
chapter4.obj : error LNK2001: unresolved external symbol _D3DXMatrixLookAtLH@16
Debug/chapter4.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

chapter4.exe - 3 error(s), 0 warning(s)

1

主题

177

帖子

198

积分

注册会员

Rank: 2

积分
198
QQ
发表于 2005-10-11 02:36:00 | 显示全部楼层

Re:请教问题.....

从你的出错提示看,你调用了d3d的扩展库
加上#pragma comment(lib,"d3dx9dt.lib")试试吧!

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2005-10-11 11:49:00 | 显示全部楼层

Re:请教问题.....

恩,谢谢,原来是D3D9头文件不包含这些矩阵转换的函数, 又学到一招,谢谢

不过又出现了一个新问题
请看:
#include<windows.h>
#include<d3d9.h>
#include<d3dx9math.h>

#pragma comment(lib,"D3D9.lib")
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;  //D3D设备
//LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Direct3D设备指针
LPDIRECT3D9       g_pD3D=NULL;               //D3D对象
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // 顶点缓冲区指针
/*D3DXVECTOR3 Eye;
D3DXVECTOR3 LookAt;
D3DXVECTOR3 Up;
*/


struct CUSTOMVERTEX
{
   FLOAT x,y,z;  //Position
   DWORD color;  //Color
};


HRESULT InitD3D(HWND hWnd)
{
          //第2步 建立D3D对象
       
        if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
                return E_FAIL;
        //得到当前显示模式
        /*
         D3DDISPLAYMODE d3ddm;
    if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
        return E_FAIL;
        */
          
        //第3步 建立D3D设备对象
        //Pointer to a Direct3D device
   

        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp,sizeof(d3dpp));
        d3dpp.Windowed=true;
        d3dpp.SwapEffect= D3DSWAPEFFECT_DISCARD ;
        d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
        d3dpp.EnableAutoDepthStencil=TRUE;
        d3dpp.AutoDepthStencilFormat=D3DFMT_D16;

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

   return S_OK;
};

//初始化顶点信息
HRESULT InitIB()
{
        CUSTOMVERTEX g_Vertices[] =
        {   { 50.0f,  50.0f,   0.5f,   D3DCOLOR_XRGB(255, 0, 0), },     
                { 250.0f,  250.0f,  0.5f,   D3DCOLOR_XRGB(0, 255, 0), },               
                { 50.0f ,  250.0f,  0.5f,   D3DCOLOR_XRGB(0, 0, 255), },       
        //        { 250.0f,  50.0f,   0.5f,    D3DCOLOR_XRGB(255, 0, 0), },   
        };
        //创建顶点缓冲区
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB,NULL ) ) )
    {
        return E_FAIL;
    }
       
    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (VOID**)&pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
    g_pVB->Unlock();
        return S_OK;
};


void Cleanup()
{
    if( g_pVB != NULL )        
        g_pVB->Release();
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();
    if( g_pD3D != NULL )      
        g_pD3D->Release();
}



void Render()
{

  g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);


  

  //Begin the scene
  if(SUCCEEDED(g_pd3dDevice->BeginScene()))
  {
                  //Set the matricse
  D3DMATRIX g_Transform;
  g_pd3dDevice->SetTransform(D3DTS_WORLD,&g_Transform);

  D3DXMATRIX g_View;
  D3DXVECTOR3 Eye(0.0f,-5.0f,0.0f);
  D3DXVECTOR3 LookAt(0.0f,0.0f,0.0f);
  D3DXVECTOR3 Up(0.0f,1.0f,0.0f);

/*
--------------------Configuration: chapter4 - Win32 Debug--------------------
Linking...
chapter4.obj : error LNK2001: unresolved external symbol _D3DXMatrixPerspectiveFovLH@20
chapter4.obj : error LNK2001: unresolved external symbol _D3DXMatrixLookAtLH@16
Debug/chapter4.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

chapter4.exe - 3 error(s), 0 warning(s)

注意,矩阵转换的函数只在d3dx9.h中有定义,而d3d0.h没有这两个函数的定义
*/
  D3DXMatrixLookAtLH(&g_View,&Eye,&LookAt,&Up);
  g_pd3dDevice->SetTransform(D3DTS_VIEW,&g_View);

  D3DXMATRIX Projection;
  FLOAT FOV=D3DX_PI/4;
  D3DXMatrixPerspectiveFovLH(&amprojection,FOV, 1.0f, 1.0f, 500.0f);

  //D3DXMatrixPerspectiveFovLH(&Projection,FOV,Aspect,1.0f,500.0f);
  g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&Projection);
  

     g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
         g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST ,0,1);

    //End the scene
         g_pd3dDevice->EndScene();
  }

  //Present the back buffer contents to the display
  g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}

void GameLoop()
{
    MSG msg;
        BOOL fMessage;
       
        PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE);
        if(g_pd3dDevice=NULL)
                return;

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

          if(fMessage)
          {
            //Process message
                  TranslateMessage(&msg);
                  DispatchMessage(&msg);
          }
          
          else
          {
           Render();
          }
        }
}
        //The windows message handler
LRESULT WINAPI MsgProc(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:
                    //User has pressed the escape key, so quit
                    DestroyWindow(hWnd);
                    return 0;
                break;
            }
        break;

    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}
/*
    switch( msg )
    {
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }
    return DefWindowProc( hWnd, msg, wParam, lParam );
}
*/

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
   //第1步 建立窗口对象和窗体 Register the window class
        WNDCLASSEX wc;
        wc.cbSize=sizeof(WNDCLASSEX);
        wc.style =CS_CLASSDC;
        wc.lpfnWndProc =MsgProc;
        wc.cbClsExtra =0;
        wc.cbWndExtra =0;
        wc.hInstance=GetModuleHandle(NULL);
        wc.lpszClassName=TEXT("WindowClass");
        wc.hbrBackground =NULL;
        wc.hCursor =NULL;
        wc.hIcon =NULL;
        wc.hIconSm =NULL;
        wc.lpszMenuName =NULL;

        RegisterClassEx(&wc);

        //Create the application's window
        HWND hWnd =CreateWindow(TEXT("WindowClass"),TEXT("Test"),WS_OVERLAPPEDWINDOW,
                                    100,100,512,512,GetDesktopWindow(),NULL,wc.hInstance ,NULL);


   
/*        MSG mssg;
        PeekMessage(&mssg,NULL,0,0,PM_NOREMOVE);
    //run till completed
        while(mssg.message!=WM_QUIT)
        {
           //is there a message to process?
                if(PeekMessage(&mssg,NULL,0,0,PM_REMOVE))
                {
                   //dispatch the message
          TranslateMessage(&mssg);
               DispatchMessage(&mssg);
                }

                else
                        //No message to process?
                        //Then do your game stuff here
                        Render();
        }



          if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // 初始化顶点
        if( SUCCEEDED( InitIB() ) )
        {
            ShowWindow( hWnd, SW_SHOWDEFAULT );
            UpdateWindow( hWnd );

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


        } */
         //Initialize Direct3D
    if(SUCCEEDED(InitD3D(hWnd)))
    {
        //Show our window
        ShowWindow(hWnd, SW_SHOWDEFAULT);
       
        UpdateWindow(hWnd);

                //Initialize Vertex Buffer
                if(SUCCEEDED(InitIB()))
                {
                        //Start game running: Enter the game loop
                        GameLoop();
                }
    }

    Cleanup();
    UnregisterClass( "WindowClass", wc.hInstance );
    return 0;

}


现在是编译没问题,连接没问题,但是运行的时候却老是非法操作,检查了半天,看不出来哪里出现问题,真是苦啊!!

2

主题

18

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2005-10-11 11:54:00 | 显示全部楼层

Re:请教问题.....

跟踪调试是一个非常重要的能力。如果自己不能有效的跟踪和调试程序,其他的都无从谈起。所以,还是自己跟跟吧。

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-10-11 12:58:00 | 显示全部楼层

Re:请教问题.....

是呀!不会跟踪调试就无法编写比较大的程序,更不要说制作游戏了,还是自己多练习练习吧!

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2005-10-11 13:54:00 | 显示全部楼层

Re:请教问题.....

OK,谢谢,继续努力

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2005-10-11 17:08:00 | 显示全部楼层

Re:请教问题.....

一定要学会调试。。。

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2005-10-11 18:23:00 | 显示全部楼层

Re:请教问题.....

#include<d3d9.h>
#include<d3dx9math.h>

#pragma comment(lib,"D3DX9.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"D3D9.lib")
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
#define SafeRelease(pObject) if(pObject != NULL) {pObject->Release(); pObject=NULL;}

    //D3D对象
LPDIRECT3D9       g_pD3D=NULL;   

LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;  //D3D设备
      
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // 顶点缓冲区指针
LPDIRECT3DINDEXBUFFER9  g_pIndexBuffer   = NULL; // 索引缓冲区指针
/*D3DXVECTOR3 Eye;
D3DXVECTOR3 LookAt;
D3DXVECTOR3 Up;
*/


struct CUSTOMVERTEX
{
   FLOAT x,y,z;  //Position
   DWORD color;  //Color
};


HRESULT InitD3D(HWND hWnd)
{
          //第2步 建立D3D对象
       
        if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
        {
          /* MessageBox(          HWND hWnd,
                           LPCTSTR lpText,
                           LPCTSTR lpCaption,
                            UINT uType);*/
                MessageBox(NULL,"建立D3D对象错误","miss",MB_OK);

                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_FLIP ;
        d3dpp.BackBufferFormat=d3ddm.Format;
        d3dpp.EnableAutoDepthStencil=TRUE;
        d3dpp.AutoDepthStencilFormat=D3DFMT_D16;

        //Create the D3DDevice
        if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT ,
                                           D3DDEVTYPE_HAL,hWnd,
                                                                   D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                                                   &d3dpp,&g_pd3dDevice)))
        {
           MessageBox(NULL,"建立D3D设备错误","miss",MB_OK);
           return E_FAIL;
        }
       

   return S_OK;
}

//初始化顶点信息
HRESULT InitIB()
{
       
        CUSTOMVERTEX g_Vertices[] =
        {   { 50.0f,  50.0f,   0.5f,   D3DCOLOR_XRGB(255, 0, 0), },     
                { 250.0f,  250.0f,  0.5f,   D3DCOLOR_XRGB(0, 255, 0), },               
                { 50.0f ,  250.0f,  0.5f,   D3DCOLOR_XRGB(0, 0, 255), },       
                { 250.0f,  50.0f,   0.5f,    D3DCOLOR_XRGB(255, 0, 0), },   
        };
        //创建顶点缓冲区
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB,NULL ) ) )
    {
        return E_FAIL;
    }
       
    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (VOID**)&pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
    g_pVB->Unlock();




        //Create index buffer 创建索引缓冲
        if(FAILED(g_pd3dDevice->CreateIndexBuffer(sizeof(short)*6,
                                     0,D3DFMT_INDEX16,
                                                         D3DPOOL_SYSTEMMEM ,&g_pIndexBuffer,NULL)))
        {
           MessageBox(NULL,"建立索引缓冲错误","miss",MB_OK);
           return E_FAIL;
        }
        //Fill index buffer
        short Indices[6]=
        {
          0,1,2,
          3,1,0
        };

        VOID* IndexData =NULL;
        if(SUCCEEDED(g_pIndexBuffer->Lock(0,0,&IndexData,0)))
        {
           memcpy(IndexData,(void*)&Indices,sizeof(Indices));
       g_pIndexBuffer->Unlock();
        }
        return S_OK;
       
}


void Cleanup()
{
    SafeRelease(g_pVB);
        SafeRelease(g_pd3dDevice);
        SafeRelease(g_pD3D);
}

void Render();


void GameLoop()
{
    MSG msg;
        BOOL fMessage;
       
        PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE);
        if(g_pd3dDevice=NULL)
        {
            MessageBox(NULL,"空设备,循环不能进行","miss",MB_OK);
                return;
        }
        while(msg.message !=WM_QUIT)
        {
          fMessage=PeekMessage(&msg,NULL,0U,0U,PM_REMOVE);

          if(fMessage)
          {
            //Process message
                  TranslateMessage(&msg);
                  DispatchMessage(&msg);
          }
          
          else
          {
           Render();
          }
        }
}
        //The windows message handler
LRESULT WINAPI MsgProc(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:
                    //User has pressed the escape key, so quit
                    DestroyWindow(hWnd);
                    return 0;
                break;
            }
        break;

    }

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


INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
   //第1步 建立窗口对象和窗体 Register the window class
        WNDCLASSEX wc;
        wc.cbSize=sizeof(WNDCLASSEX);
        wc.style =CS_CLASSDC;
        wc.lpfnWndProc =MsgProc;
        wc.cbClsExtra =0;
        wc.cbWndExtra =0;
        wc.hInstance=GetModuleHandle(NULL);
        wc.lpszClassName=TEXT("WindowClass");
        wc.hbrBackground =NULL;
        wc.hCursor =NULL;
        wc.hIcon =NULL;
        wc.hIconSm =NULL;
        wc.lpszMenuName =NULL;

        RegisterClassEx(&wc);

        //Create the application's window
        HWND hWnd =CreateWindow(TEXT("WindowClass"),TEXT("Test"),WS_OVERLAPPEDWINDOW,
                                    100,100,512,512,GetDesktopWindow(),NULL,wc.hInstance ,NULL);


         //Initialize Direct3D
    if(SUCCEEDED(InitD3D(hWnd)))
    {
        //Show our window
        ShowWindow(hWnd, SW_SHOWDEFAULT);
       
        UpdateWindow(hWnd);

                //Initialize Vertex Buffer
                if(SUCCEEDED(InitIB()))
                {
                        //Start game running: Enter the game loop
                        GameLoop();
                }
    }

    Cleanup();
    UnregisterClass( "WindowClass", wc.hInstance );
    return 0;

}

void Render()
{
  
   if(g_pd3dDevice == NULL)
    {
       MessageBox(NULL,"空设备,渲染不能进行","miss",MB_OK);
           return;
    }
  g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
  g_pd3dDevice->BeginScene();

/*          //Set the matricse
          //世界空间
  D3DXMATRIX  g_Transform;
  //每帧物体绕Y轴旋转
  UINT iTime=timeGetTime();
  FLOAT fAngle=iTime*(2.0f*D3DX_PI)/1000.f;
  D3DXMatrixRotationY(&g_Transform,fAngle);
  g_pd3dDevice->SetTransform(D3DTS_WORLD,&g_Transform);
     //视图空间
  D3DXMATRIX g_View;
  D3DXVECTOR3 Eye(0.0f,-5.0f,0.0f);
  D3DXVECTOR3 LookAt(0.0f,0.0f,0.0f);
  D3DXVECTOR3 Up(0.0f,1.0f,0.0f);
  D3DXMatrixLookAtLH(&g_View,&Eye,&LookAt,&Up);
  g_pd3dDevice->SetTransform(D3DTS_VIEW,&g_View);
    //视口空间
  D3DXMATRIX Projection;
  FLOAT FOV=D3DX_PI/4;
  D3DXMatrixPerspectiveFovLH(&amprojection,FOV, 1.0f, 1.0f, 500.0f);

  //D3DXMatrixPerspectiveFovLH(&Projection,FOV,Aspect,1.0f,500.0f);
  g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&Projection);
  
*/

     g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
     g_pd3dDevice->SetIndices(g_pIndexBuffer);
     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
         g_pd3dDevice->DrawIndexedPrimitive (  D3DPT_TRIANGLELIST ,
                            0, //INT BaseVertexIndex
                                        0, //UINT MinIndex
                                        4, //UINT NumVertices
                                        0, //UNIT StartIndex
                                        2); //PrimitiveCount
//         g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST ,0,1);

    //End the scene
         g_pd3dDevice->EndScene();

  //Present the back buffer contents to the display
  g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}


OK,现在我发现了问题,在Render()函数里, g_pd3dDevice居然为空,但我反复检查代码,没有发现有哪个地方把它释放掉啊?  g_pd3dDevice为一个全局变量. 这到底是怎么回事呢?? 真奇怪,
有哪个高手能帮我解决一下吗? 急死我了........

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2005-10-12 11:08:00 | 显示全部楼层

Re:请教问题.....

小顶一下

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2005-10-12 11:26:00 | 显示全部楼层

Re:请教问题.....

=,==,不能错啊!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-28 03:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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