游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1738|回复: 3

不知道为什么执行不了

[复制链接]

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2008-5-12 21:46:00 | 显示全部楼层 |阅读模式
我的代码是控制一部飞机移动和开枪的,但是不知道为什么执行不了,请高手指点一下,我不知道那里错了



#include<d3d9.h>
#include<d3dx9.h>
LPDIRECT3D9 g_pD3D = NULL; //D3D对象
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //D3D设备对象
D3DMATERIAL9 *g_cz = NULL; //材质
LPDIRECT3DTEXTURE9 *g_wenli = NULL; //纹理
//ID3DXBuffer *g_czhc; //材质缓冲
ID3DXBuffer *g_mhcq;
ID3DXMesh *mesh1 = NULL; //模型对象
ID3DXMesh *mesh2 = NULL;
DWORD czzs; //材质总数
BYTE m_bKey[256];
D3DXMATRIX sys,zidan[20]; //飞机矩阵,子弹矩阵
float fu[2];
int zidanbz[20]; //子弹标志,0=无,1=有
int i,j,k,e,l;
DWORD ttt,t;
VOID Inputresponse()  //设置反应
{

        if(m_bKey['A'])
        {
                sys._41 += fu[0];
        }
        if(m_bKey['D'])
        {
                sys._41 -= fu[0];
        }
        if(m_bKey['W'])
        {
                sys._42 += fu[0];
        }
        if(m_bKey['S'])
        {
                sys._42 += fu[0];
        }
        if(m_bKey['J'])
        {
                for(i=0;i<20;i++)
                {
                        if(zidanbz==0)
                        {
                                zidan=sys,zidanbz=1;
                        }
                }
        }

}
VOID SetViewAndProjMatrix() //设置观察矩阵和投影矩阵
{
        D3DXMatrixTranslation(&sys,0.0f,0.0f,-50.0f);
        g_pd3dDevice->SetTransform(D3DTS_WORLD,&sys);
        D3DXVECTOR3 vEyePt(0.0f,100.0f,100.0f);
        D3DXVECTOR3 vLookatPt(0.0f,0.0f,-100.0f);
        D3DXVECTOR3 vUpVec(0.0f,1.0f,0.0f);
        D3DXMATRIXA16 matView;
        D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);
        g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView);
        D3DXMATRIXA16 matProj;
        D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI * 0.25f,1,1.0f,500.0f);
        g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);

        fu[0]=2.0f;
        fu[1]=3.0f;
}
HRESULT InitD3D(HWND hWnd)
{
        if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
                return E_FAIL;
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp,sizeof(d3dpp));
        d3dpp.BackBufferHeight=800; //后备缓冲区高度
        d3dpp.BackBufferWidth=600; //后备缓冲区宽度
        d3dpp.BackBufferCount=1;  // 后备缓冲区表面数量,设为1,表示只有一个后备表面
        d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8; //后备缓冲表面的像素格式
        d3dpp.Windowed = TRUE; //true为窗口模式,false为全屏
        d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
        d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
        d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;  //设置交换链如何被交换的,设置D3DSWAEFFECT_DISCARD是最有效的
        d3dpp.EnableAutoDepthStencil=TRUE; //自动创建深度/模板缓冲
        d3dpp.AutoDepthStencilFormat=D3DFMT_D16; //深度/模板缓冲格式
        if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))
        {
                return E_FAIL;
        }
        SetViewAndProjMatrix();
        ZeroMemory(m_bKey,256);
        return S_OK;
}
HRESULT InitGeometry()
{
        ID3DXBuffer *g_czhc;
        D3DXLoadMeshFromXA("airplane.x",D3DXMESH_MANAGED,g_pd3dDevice,&g_mhcq,&g_czhc,0,&czzs,&mesh1); //加载网格模型
        D3DXLoadMeshFromXA("ball",D3DXMESH_MANAGED,g_pd3dDevice,&g_mhcq,&g_czhc,0,&czzs,&mesh2);
        D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)g_czhc->GetBufferPointer();
        g_cz = new D3DMATERIAL9[czzs];
        if(g_cz == NULL)
                return E_OUTOFMEMORY;

        g_wenli = new LPDIRECT3DTEXTURE9[czzs];
        if(g_wenli == NULL)
                return E_OUTOFMEMORY;
        for(DWORD i=0;i<czzs;i++)
        {
                g_cz = d3dxMaterials.MatD3D; //材料属性
                g_cz.Ambient = g_cz.Diffuse; //设置模型材料的环境光反射系数, 因为模型材料本身没有设置环境光反射系数
                g_wenli = NULL;
                if(d3dxMaterials.pTextureFilename != NULL && strlen(d3dxMaterials.pTextureFilename) > 0)
                {
                        D3DXCreateTextureFromFileA(g_pd3dDevice,d3dxMaterials.pTextureFilename,&g_wenli);
                }
        }
        g_czhc->Release();
        return S_OK;
}
VOID Cleanup()
{
                //释放网格模型材质
        if(g_cz != NULL)
                delete[] g_cz;
                //释放网格模型纹理
        if(g_wenli)
        {
                for(DWORD i=0;i<czzs;i++)
                {
                        if(g_wenli)
                                g_wenli->Release();
                }
                delete[] g_wenli;
        }
        if(mesh1 != NULL)
                mesh1->Release();
        if(mesh2 != NULL)
                mesh2->Release();
        if(g_pd3dDevice != NULL)
                g_pd3dDevice->Release();
        if(g_pD3D != NULL)
                g_pD3D->Release();
}
VOID Render()
{
        //dx->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
        //dx->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
        g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
        g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
        g_pd3dDevice->BeginScene();
        Inputresponse();
        g_pd3dDevice->SetTransform(D3DTS_WORLD,&sys);
        g_pd3dDevice->SetMaterial(&g_cz[0]);
        mesh1->DrawSubset(0);
        for(i=0;i<20;i++)
        {
                if(zidanbz==1)
                {
                        zidan._42+=fu[1];
                        if(zidan._42>60.0f)
                        {
                                zidanbz=0;
                        }
                        g_pd3dDevice->SetTransform(D3DTS_WORLD,&zidan);
                        mesh2->DrawSubset(0);
                }
        }
        g_pd3dDevice->EndScene();
        g_pd3dDevice-&gtresent(NULL,NULL,NULL,NULL);
}
LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
        switch(msg)
        {
        case WM_DESTROY:
                Cleanup();
                PostQuitMessage(0);
                return 0;
        case WM_KEYDOWN:
                m_bKey[wParam] = 1;
                return 0;
        case WM_KEYUP:
                m_bKey[wParam] = 0;
                return 0;
        }
        return DefWindowProc(hWnd,msg,wParam,lParam);
}
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
        WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,L"ClassName",NULL};
        RegisterClassEx(&wc);
        HWND hWnd = CreateWindow(L"ClassName",L"飞机游戏",WS_OVERLAPPEDWINDOW,100,100,600,600,GetDesktopWindow(),0,wc.hInstance,0);
        if(SUCCEEDED(InitD3D(hWnd)))
        {
                if(SUCCEEDED(InitGeometry()))
                {
                        ShowWindow(hWnd,SW_SHOWDEFAULT);
                        UpdateWindow(hWnd);
                        MSG msg;
                        ZeroMemory(&msg,sizeof(msg));
                        while(msg.message!=WM_QUIT)
                        {
                                if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                                {
                                        TranslateMessage(&msg);
                                        DispatchMessage(&msg);
                                }
                                else
                                {
                                        Render();
                                }
                        }
                }
        }
        UnregisterClass(L"ClassName",wc.hInstance);
        return 0;
}

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2008-5-12 21:47:00 | 显示全部楼层

Re:不知道为什么执行不了

我在线等,我不知道错在那里.上传不了ZIP文件,只有这样发代码出来了

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2008-5-12 22:13:00 | 显示全部楼层

Re:不知道为什么执行不了

执行就显示feijiyouxi.exe 中的 0x00411c37 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突
编译没有错误

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2008-5-12 22:13:00 | 显示全部楼层

Re:不知道为什么执行不了

如果觉得麻烦的可以加我的Q,我直接发文件过去给你.30154465
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 12:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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