游戏开发论坛

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

多玩家游戏程序设计的例子程序。我照抄了一遍

[复制链接]

80

主题

173

帖子

189

积分

注册会员

Rank: 2

积分
189
发表于 2006-5-6 17:23:00 | 显示全部楼层 |阅读模式
呵呵!刚开始学习,扔鸡蛋到我的blog 嘻嘻!:)
#define INITGUID

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <d3d8.h>
#include <d3dx8.h>
#include <stdio.h>

#pragma comment(lib,"d3d8.lib")
#pragma comment(lib,"d3dx8.lib")

//Direct3D 全局变量
LPDIRECT3D8                                        pD3D = NULL;
LPDIRECT3DDEVICE8                        pd3dDevice;
D3DXMATRIX                                        matProj;//投影矩形
D3DXMATRIX                                        matCameraView;
D3DXVECTOR3                                        vecCameraSource;
D3DXVECTOR3                                        vecCameraTarget;
LPDIRECT3DVERTEXBUFFER8                lpVertexBuffer = NULL;
LPDIRECT3DTEXTURE8                        g_pTexture = NULL;

#define  D3DFVF_MYVETTEX (D3DFVF_XYZ | D3DFVF_TEX1)
typedef struct MYVERTEX
{
        float x,y,z,u,v;

}MYVERTEX ,*LPMYVERTEX;
MYVERTEX g_Verices[4];
const char *szWndClass = "Draw3DPrimitive";
const char *szProgramName = "Draw3DPrimitive Example";
HINSTANCE g_hInstance;
HWND g_hWnd;
LRESULT CALLBACK WindowProc(HWND hWnd,UINT Msg ,WPARAM wParam,LPARAM lParam);
HRESULT hrInit3D(HWND hWnd);
void vCleanup(void);
void vRenderScence(void);
void vSetupView(void);
void vInitGeometry(void);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
        WNDCLASSEX WndClass;
        HWND hWnd;
        MSG msg;
        WndClass.cbSize = sizeof(WNDCLASSEX);
        WndClass.style = CS_HREDRAW | CS_VREDRAW;
        WndClass.lpfnWndProc = (WNDPROC)WindowProc;
        WndClass.cbClsExtra = 0;
        WndClass.cbWndExtra = 0;
        WndClass.hInstance = hInstance;
        WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
        WndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
        WndClass.hbrBackground = (HBRUSH)GetStockObject(NULL);
        WndClass.lpszClassName = szWndClass;
        WndClass.lpszMenuName = NULL;
        WndClass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);

        if(!RegisterClassEx(&WndClass))
                return (-1);
        if(!(hWnd =
                CreateWindowEx(
                NULL,
                szWndClass,
                szProgramName,
                WS_OVERLAPPEDWINDOW,
                0,
                0,
                800,
                600,
                NULL,
                NULL,
                hInstance,
                NULL)
                ))
                return (-1);
        ShowWindow(hWnd, SW_SHOW);
        UpdateWindow(hWnd);
        if(hrInit3D(hWnd) == E_FAIL)
        {
                DestroyWindow(hWnd);
        }
        vInitGeometry();
        vSetupView();
        while(TRUE)
        {
                if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                {
                        if(msg.message == WM_QUIT)
                                break;
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
                else
                {
                        vRenderScence();
                }
        }
        vCleanup();
        return ((int)msg.wParam);
}
LRESULT CALLBACK WindowProc(HWND hWnd,UINT Msg ,WPARAM wParam,LPARAM lParam)
{
        PAINTSTRUCT ps;
        HDC hdc;
        switch(Msg)
        {
        case WM_CREATE:
                {
                        return (0);
                }
                break;
        case WM_PAINT:
                {
                        hdc = BeginPaint(hWnd,&ps);
                        EndPaint(hWnd,&ps);
                        return (0);
                }
                break;
        case WM_DESTROY:
                {
                        PostQuitMessage(0);
                        return (0);
                }
                break;
        default:
                break;
        }
        return (DefWindowProc(hWnd,Msg,wParam,lParam));

}
HRESULT hrInit3D(HWND hWnd)
{
        D3DPRESENT_PARAMETERS                d3dpp;
        D3DDISPLAYMODE                                d3ddm;
        RECT                                                rcWindowBounds;
        RECT                                                rcWindowClient;

        //创建D3D对象
        if(NULL == (pD3D = Direct3DCreate8(D3D_SDK_VERSION)))
        {
                return E_FAIL;
        }
        if(FAILED(pD3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
        {
                return E_FAIL;
        }
        GetWindowRect(hWnd,&rcWindowBounds);
        GetClientRect(hWnd,&rcWindowClient);
        ZeroMemory(&d3dpp,sizeof(d3dpp));
        //建立设备参数
        d3dpp.hDeviceWindow = hWnd;
        d3dpp.BackBufferWidth = (rcWindowClient.right - rcWindowClient.left);
        d3dpp.BackBufferHeight = (rcWindowClient.bottom - rcWindowClient.top);
        d3dpp.BackBufferFormat = d3ddm.Format;
        d3dpp.BackBufferCount  = 1;
        d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
        d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
        d3dpp.EnableAutoDepthStencil = TRUE;
        d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
        d3dpp.Windowed = TRUE;
        //创建D3D设备
        if(FAILED(pD3D -> CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&pd3dDevice)))
        {
                return E_FAIL;
        }
        //启动Z缓存
        pd3dDevice -> SetRenderState(D3DRS_ZENABLE,TRUE);
        pd3dDevice -> SetRenderState(D3DRS_AMBIENT,0xffffffff);
        pd3dDevice -> SetRenderState(D3DRS_LIGHTING,FALSE);
        return S_OK;

}
void vSetupView()
{
        //设置照相机的原始点
        vecCameraSource.x = 0.0f;
        vecCameraSource.y = 0.0f;
        vecCameraSource.z = 10.0f;
        //设置照相机的目标点
        vecCameraTarget.x = 0.0f;
        vecCameraTarget.y = 0.0f;
        vecCameraTarget.z = 0.0f;
        D3DXMatrixLookAtLH(
                &matCameraView,
                &vecCameraSource,
                &vecCameraTarget,
                &D3DXVECTOR3(0.0f,1.0f,0.0f)
                );
        //告诉设备把照相机的视图作为视口
        pd3dDevice -> SetTransform(D3DTS_VIEW,&matCameraView);
        D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
        //告诉设备把上边的矩阵作为投影矩阵
        pd3dDevice -> SetTransform(D3DTS_PROJECTION,&matProj);

}
void vCleanup(void)
{
        if(g_pTexture != NULL)
                g_pTexture -> Release();
        if (lpVertexBuffer != NULL)
                lpVertexBuffer -> Release();
        if(pd3dDevice != NULL)
                pd3dDevice -> Release();
        if(pD3D != NULL)
                pD3D -> Release();
        UnregisterClass(szWndClass,g_hInstance);

}
void vRenderScence(void)
{
        D3DXMATRIX matTranslation;
        pd3dDevice -> Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
        pd3dDevice -> BeginScene();
        D3DXMatrixIdentity(&matTranslation);
        pd3dDevice -> SetTransform(D3DTS_WORLD,&matTranslation);
        pd3dDevice -> SetTexture(0,g_pTexture);
        pd3dDevice -> SetStreamSource(0,lpVertexBuffer,sizeof(MYVERTEX));
        pd3dDevice -> SetVertexShader(D3DFVF_MYVETTEX);
        pd3dDevice -> DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
        pd3dDevice -> SetTexture(0,NULL);
        pd3dDevice -> EndScene();
        pd3dDevice -> Present(NULL,NULL,NULL,NULL);

}
void vInitGeometry(void)
{
        void *lpVertices;
        float fSizeX = 5.0f;
        float fSizeY = 5.0f;
        //创建几何图形
        g_Verices[0].x = -fSizeX / 2;
        g_Verices[0].y = fSizeY / 2;
        g_Verices[0].z = 0.0f;
        g_Verices[0].u = 0.0f;
        g_Verices[0].v = 0.0f;
        g_Verices[1].x = -fSizeX / 2;
        g_Verices[1].y = -fSizeY / 2;
        g_Verices[1].z = 0.0f;
        g_Verices[1].u = 0.0f;
        g_Verices[1].v = 1.0f;
        g_Verices[2].x = fSizeX / 2;
        g_Verices[2].y = fSizeX / 2;
        g_Verices[2].z = 0.0f;
        g_Verices[2].u = -1.0f;
        g_Verices[2].v = 0.0f;
        g_Verices[3].x = fSizeX / 2;
        g_Verices[3].y = -fSizeX / 2;
        g_Verices[3].z = 0.0f;
        g_Verices[3].u = -1.0f;
        g_Verices[3].v = 1.0f;
        //创建顶点缓存
        if (FAILED(pd3dDevice -> CreateVertexBuffer(4*sizeof(MYVERTEX),0,D3DFVF_MYVETTEX,D3DPOOL_DEFAULT,&lpVertexBuffer)))
        {
                return;
        }
        if (FAILED(lpVertexBuffer -> Lock(0,sizeof(g_Verices),(BYTE**)&lpVertices,0)))
        {
                return;
        }
        memcpy(lpVertices,g_Verices,sizeof(g_Verices));
        lpVertexBuffer ->Unlock();
        if (FAILED(D3DXCreateTextureFromFile(pd3dDevice,"texture.jpg",&g_pTexture)))
        {
                return;
        }
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 10:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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