游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1824|回复: 2

高手帮我看一下程序!谢谢!

[复制链接]

13

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2004-4-4 12:29:00 | 显示全部楼层 |阅读模式
编译没错误,可是就是无法运行!

#include <d3d8.h>
#include <d3dx8math.h>
#pragma comment(lib,"d3d8.lib")
#pragma comment(lib,"winmm")
#pragma comment(lib,"d3dx8.lib")

LPDIRECT3D8                                g_pD3D=NULL;
LPDIRECT3DDEVICE8                g_pD3DDevice=NULL;
LPDIRECT3DVERTEXBUFFER8  g_pVertexBuffer=NULL;

struct CUSTOMVERTEX
{
        float x,y,z;
        DWORD color;
};

#define D3DFVF_CUMSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

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

        D3DDISPLAYMODE d3ddm;
        if (NULL==(g_pD3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm))) return E_FAIL;

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

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

        g_pD3D -> CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice);
        if (NULL==(g_pD3DDevice)) return E_FAIL;
       
        g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
        g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

        return S_OK;
}

HRESULT InitVertexBuffer()
{
        VOID *pVertices;
        CUSTOMVERTEX cvVertices[]=
        {
    //Top Face
                {-5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(0, 0, 255),}, //Vertex 0 - Blue
                {-5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 1 - Red
                {5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 2 - Red
                {5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 3 - Green
//Face 1
                {-5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 4 - Red
                {-5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(0, 0, 255),}, //Vertex 5 - Blue
                {5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 6 - Green
                {5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 7 - Red
        //Face 2
                {5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 0, 255),}, //Vertex 8 - Blue
                {5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 9 - Green        
        //Face 3
                {-5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 10 - Green
                {-5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 11 - Red
        //Face 4
                {-5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 12 - Red
                {-5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(0, 0, 255),}, //Vertex 13 - Blue
        //Bottom Face
                {5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 14 - Green
                {5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 0, 255),}, //Vertex 15 - Blue
                {-5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 16 - Red
                {-5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 17 - Green
        };
        if (FAILED(g_pD3DDevice -> CreateVertexBuffer(18*sizeof(CUSTOMVERTEX),0,D3DFVF_CUMSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVertexBuffer))) return E_FAIL;

        if (FAILED(g_pVertexBuffer -> Lock(0,sizeof(cvVertices),(BYTE**)&pVertices,0))) return E_FAIL;
        memcpy(pVertices, cvVertices, sizeof(cvVertices));
        //语法结构:memcpy(复制目的地址,源地址,尺寸)
        g_pVertexBuffer -> Unlock();

        return S_OK;
}

void SetupRotation()
{
        D3DXMATRIX        matWorld,matWorldX,matWorldY,matWorldZ;
        D3DXMatrixRotationX(&matWorldX,timeGetTime()/400.0f);
        D3DXMatrixRotationY(&matWorldY,timeGetTime()/400.0f);
        D3DXMatrixRotationZ(&matWorldZ,timeGetTime()/400.0f);

        D3DXMatrixMultiply(&matWorld,&matWorldX,&matWorldY);
        D3DXMatrixMultiply(&matWorld,&matWorld,&matWorldZ);

        g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);
}

void SetupCarema()
{
        D3DXMATRIX matView;
        D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0.0f, 0.0f,-30.0f),&D3DXVECTOR3(0.0f, 0.0f, 0.0f),&D3DXVECTOR3(0.0f, 1.0f, 0.0f));
        //建立一个笛卡儿左手坐标系统观察矩阵
        g_pD3DDevice->SetTransform(D3DTS_VIEW, &matView);
        //第一个是DTS_WORLD,第二个是DTS_VIEW。是不是先建立世界再来看
}

void SetupPerspective()
{
        D3DXMATRIX matProj;

        D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 500.0f);
        //建立左右坐标来标志视野
        g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}

void Render()
{
        if (NULL==g_pD3DDevice) return;
        g_pD3DDevice -> Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0, 0, 0),1.0f,0);

        g_pD3DDevice -> BeginScene();

        SetupRotation();
        SetupCarema();
        SetupPerspective();
//建立的一切都在绘制场景中体现出来
        g_pD3DDevice -> SetStreamSource(0,g_pVertexBuffer,sizeof(CUSTOMVERTEX));

        g_pD3DDevice -> DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
        g_pD3DDevice -> DrawPrimitive(D3DPT_TRIANGLESTRIP,4,8);
        g_pD3DDevice -> DrawPrimitive(D3DPT_TRIANGLESTRIP,14,2);

        g_pD3DDevice -> EndScene();

        g_pD3DDevice -> Present(NULL, NULL, NULL, NULL);
}

void Cleanup()
{
        if (g_pVertexBuffer != NULL) g_pVertexBuffer -> Release();
        if (g_pD3DDevice != NULL) g_pD3DDevice -> Release();
        if (g_pD3D != NULL) g_pD3D -> Release();
}

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 );
}

// WinMain程序入口
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    // 注册窗口类
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "D3D Tutorial", NULL };
    RegisterClassEx( &wc );

    // 创建窗口
    HWND hWnd = CreateWindow( "Takhisis's Cube", "Takhisis",
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL );

    // 初始化D3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
                if( SUCCEEDED( InitVertexBuffer() ) )
                {
                        // 显示窗口
                        ShowWindow( hWnd, SW_SHOWDEFAULT );
                        UpdateWindow( hWnd );

                        // 消息循环
                        MSG msg;
                        while( GetMessage( &msg, NULL, 0, 0 ) )
                        {
                                TranslateMessage( &msg );
                                DispatchMessage( &msg );
                        }
                }
    }

    // 结束处理
    Cleanup();
    UnregisterClass( "Takhisis's Cube", wc.hInstance );
    return 0;
} [em3]

0

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2004-4-4 13:21:00 | 显示全部楼层

Re:高手帮我看一下程序!谢谢!

不懂

13

主题

145

帖子

149

积分

注册会员

Rank: 2

积分
149
发表于 2004-4-5 14:15:00 | 显示全部楼层

Re:高手帮我看一下程序!谢谢!

debug,F11,F10.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-16 15:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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