//////////////////////////////////////////////////////////////////////////////////////////////////
//
// 文件: Example6_10.cpp
//
// 作者:秦春
//
// 系统:Windows Vista, VC++2008
//
// 描述:演示公告板技术。
// 按住左右箭头键后,地面能够左右旋转,但树木不动
//
// 日期:2009.9.12
//
//////////////////////////////////////////////////////////////////////////////////////////////////
#include "d3dUtility.h"
//
// 全局变量
//
LPDIRECT3DDEVICE9 Device = 0; //D3D设备指针
LPDIRECT3DVERTEXBUFFER9 m_pRectVB = 0; //定义地面点缓冲指针
LPDIRECT3DVERTEXBUFFER9 m_pTreeVB = 0; //定义树顶点缓冲指针
LPDIRECT3DVERTEXBUFFER9 m_pSkyVB = 0; //定义天空点缓冲指针
LPDIRECT3DTEXTURE9 m_pRectTex; //定义地面纹理指针
LPDIRECT3DTEXTURE9 m_pSkyTex[5]; //定义天空纹理指针
LPDIRECT3DTEXTURE9 m_pTreeTex; //定义树纹理指针
D3DXMATRIX mat_view; //定义观察矩阵
float radius = 50.0f; //摄象机与视点距离
D3DXVECTOR3 position(0.0f, 1.0f, -radius); //摄象机位置向量
float angle0 = 3.14f; //摄象机起始角(弧度)
float fRectDistance = 320.0f; //地面宽度
const int Width = 640;
const int Height = 480;
//自定义顶点格式
struct CUSTOMERVERTEX
{
FLOAT x, y, z; //三维坐标
FLOAT tu, tv; //纹理坐标
static const DWORD FVF;
};
const DWORD CUSTOMERVERTEX::FVF = (D3DFVF_XYZ | D3DFVF_TEX1);
//
// 框架函数
//
void SetLook(D3DXVECTOR3 pos) //设置观察转换
{
// 放置相机,将相机对准目标
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f); //相机目标的位置,y坐标决定地面的高低
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); //上方向
D3DXMatrixLookAtLH(&mat_view, &pos, &target, &up); //创建观察矩阵
Device->SetTransform(D3DTS_VIEW, &mat_view); //设置观察矩阵转换
}
void SetPerspective() //设置投影转换
{
// 设置投影矩阵
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj, //创建投影矩阵
D3DX_PI * 0.25f, // 90 - degree,视角
(float)Width / (float)Height, //屏幕纵横比
1.0f, //前剪裁平面的z值
1000.0f); //后剪裁平面的z值
Device->SetTransform(D3DTS_PROJECTION, &proj);
}
//创建并设置纹理
bool CreateAndSetTexture()
{
//初始化地面纹理,如果硬件支持多级渐近纹理,该函数将自动创建一个多级纹理链
if( FAILED(D3DXCreateTextureFromFile(Device, "TerrainTex.bmp", &m_pRectTex)))
{
MessageBox(NULL, "地面纹理初始化失败 !", "Errow", MB_OK);
return false;
}
//初始化树木纹理。该纹理图是bmp格式的,必须用本函数加载,主要用于指明纹理图的Alpha通道值D3DCOLOR_RGBA(0,0,0,255)
if( FAILED(D3DXCreateTextureFromFileEx(Device, "Billboard.bmp", D3DX_DEFAULT, D3DX_DEFAULT,
D3DX_DEFAULT, 0, D3DFMT_A1R5G5B5, D3DPOOL_MANAGED, D3DX_FILTER_TRIANGLE, D3DX_FILTER_TRIANGLE,
D3DCOLOR_RGBA(0,0,0,255), NULL, NULL, &m_pTreeTex)))
{
MessageBox(NULL, "树木纹理初始化失败 !", "Errow", MB_OK);
return false;
}
//初始化天空纹理
if( FAILED(D3DXCreateTextureFromFile(Device, "skybox_front.bmp", &m_pSkyTex[0])))
{
MessageBox(NULL, "正面天空纹理初始化失败 !", "Errow", MB_OK);
return false;
};
if( FAILED(D3DXCreateTextureFromFile(Device, "skybox_back.bmp", &m_pSkyTex[1])))
{
MessageBox(NULL, "背面天空纹理初始化失败 !", "Errow", MB_OK);
return false;
};
if( FAILED(D3DXCreateTextureFromFile(Device, "skybox_left.bmp", &m_pSkyTex[2])))
{
MessageBox(NULL, "左面天空纹理初始化失败 !", "Errow", MB_OK);
return false;
};
if( FAILED(D3DXCreateTextureFromFile(Device, "skybox_right.bmp", &m_pSkyTex[3])))
{
MessageBox(NULL, "右面天空纹理初始化失败 !", "Errow", MB_OK);
return false;
};
if( FAILED(D3DXCreateTextureFromFile(Device, "skybox_top.bmp", &m_pSkyTex[4])))
{
MessageBox(NULL, "顶面天空纹理初始化失败 !", "Errow", MB_OK);
return false;
};
//将纹理缩小过滤器和放大过滤器设为线性过滤模式
Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
//将纹理渐近过滤器设为最近点采样方式D3DTEXF_POINT
Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
return true;
}
bool SetTree()
{
//填写树木数据
CUSTOMERVERTEX pTreeVertices[] =
{
{-10.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{-10.0f, 20.0f, 0.0f, 0.0f, 0.0f},
{10.0f, 0.0f, 0.0f, 1.0f, 1.0f},
{10.0f, 20.0f, 0.0f, 1.0f, 0.0f}
};
//创建树木顶点缓冲区
if( FAILED( Device->CreateVertexBuffer(
4 * sizeof(CUSTOMERVERTEX), //点缓冲大小,4 个
D3DUSAGE_SOFTWAREPROCESSING, //点缓冲类型
CUSTOMERVERTEX::FVF, //天空点缓冲格式
D3DPOOL_MANAGED, //点缓冲所处位置,可以有
&m_pTreeVB, //树木点缓冲地址
0)))
{
MessageBox(NULL, "创建树木顶点缓冲区失败 !", "Errow", MB_OK);
return false;
};
//锁定顶点缓存
VOID* pVertices;
if( FAILED(m_pTreeVB->Lock(0, 0, (void**)&pVertices, 0)) )
{
MessageBox(NULL, "锁定树木点缓冲失败 !", "Errow", MB_OK);
return false;
};
//拷贝顶点信息
memcpy(pVertices, pTreeVertices, sizeof(pTreeVertices));
//对树木点缓冲解锁
m_pTreeVB->Unlock();
return true;
}
bool SetSky()
{
//填充天空数据
float fSkyDistance = 320.0f; //天空体距离视点的远近
float fHeight = 320.0f; //天空体高度
CUSTOMERVERTEX pSkyVertices[] =
{
//视点前面的天空体
{-fSkyDistance, 0.0f, fSkyDistance, 0.0f, 1.0f},
{-fSkyDistance, fHeight, fSkyDistance, 0.0f, 0.0f},
{fSkyDistance, 0.0f, fSkyDistance, 1.0f, 1.0f},
{fSkyDistance, fHeight, fSkyDistance, 1.0f, 0.0f},
//视点背面的天空体
{fSkyDistance, 0.0f, -fSkyDistance, 0.0f, 1.0f},
{fSkyDistance, fHeight, -fSkyDistance, 0.0f, 0.0f},
{-fSkyDistance, 0.0f, -fSkyDistance, 1.0f, 1.0f},
{-fSkyDistance, fHeight, -fSkyDistance, 1.0f, 0.0f},
//视点左面的天空体
{-fSkyDistance, 0.0f, -fSkyDistance, 0.0f, 1.0f},
{-fSkyDistance, fHeight, -fSkyDistance, 0.0f, 0.0f},
{-fSkyDistance, 0.0f, fSkyDistance, 1.0f, 1.0f},
{-fSkyDistance, fHeight, fSkyDistance, 1.0f, 0.0f},
//视点右面的天空体
{fSkyDistance, 0.0f, fSkyDistance, 0.0f, 1.0f},
{fSkyDistance, fHeight, fSkyDistance, 0.0f, 0.0f},
{fSkyDistance, 0.0f, -fSkyDistance, 1.0f, 1.0f},
{fSkyDistance, fHeight, -fSkyDistance, 1.0f, 0.0f},
//视点上面的天空体
{fSkyDistance, fHeight, -fSkyDistance, 1.0f, 0.0f},
{fSkyDistance, fHeight, fSkyDistance, 1.0f, 1.0f},
{-fSkyDistance, fHeight, -fSkyDistance, 0.0f, 0.0f},
{-fSkyDistance, fHeight, fSkyDistance, 0.0f, 1.0f},
};
//创建天空顶点缓冲区
if( FAILED( Device->CreateVertexBuffer(
4 * 5 * sizeof(CUSTOMERVERTEX), //点缓冲大小,4 * 5个
D3DUSAGE_SOFTWAREPROCESSING, //点缓冲类型
CUSTOMERVERTEX::FVF, //天空点缓冲格式
D3DPOOL_MANAGED, //点缓冲所处位置,可以有
&m_pSkyVB, //天空点缓冲地址
0)))
{
MessageBox(NULL, "创建天空顶点缓冲区失败 !", "Errow", MB_OK);
return false;
};
//锁定天空点缓冲
VOID* pVertices; //定义CUSTOMERVERTEX指针
if( FAILED(m_pSkyVB->Lock(0, 0, (void**)&pVertices, 0)) )
{
MessageBox(NULL, "锁定天空点缓冲失败 !", "Errow", MB_OK);
return false;
};
//拷贝顶点信息
memcpy(pVertices, pSkyVertices, sizeof(pSkyVertices));
//对天空点缓冲解锁
m_pSkyVB->Unlock();
return true;
}
bool SetTerrain()
{
// 填充地面顶点坐标
CUSTOMERVERTEX pTerrainVertices[] =
{
{-fRectDistance, 0.0f, -fRectDistance, 0.0f, 200.0f},
{-fRectDistance, 0.0f, fRectDistance, 0.0f, 0.0f},
{fRectDistance, 0.0f, -fRectDistance, 200.0f, 200.0f},
{fRectDistance, 0.0f, fRectDistance, 200.0f, 0.0f}
};
//创建地面顶点缓冲区
if( FAILED( Device->CreateVertexBuffer(
4 * sizeof(CUSTOMERVERTEX), //点缓冲大小
D3DUSAGE_SOFTWAREPROCESSING, //点缓冲类型
CUSTOMERVERTEX::FVF, //地面点缓冲格式
D3DPOOL_MANAGED, //点缓冲所处位置,可以有
&m_pRectVB, //地面点缓冲地址
0)))
{
MessageBox(NULL, "创建地面顶点缓冲区失败 !", "Errow", MB_OK);
return false;
};
//锁定地面点缓冲
VOID* pVertices;
if( FAILED(m_pRectVB->Lock(0, 0,(void**)&pVertices, 0)))
{
MessageBox(NULL, "锁定地面点缓冲失败 !", "Errow", MB_OK);
return false;
};
//拷贝顶点信息
memcpy(pVertic
没有合适的资源?快使用搜索试试~ 我知道了~
网络游戏客户端编程》第6章
共90个文件
cpp:28个
h:16个
bmp:15个
5星 · 超过95%的资源 需积分: 3 54 下载量 50 浏览量
2009-09-21
11:09:18
上传
评论
收藏 4.52MB RAR 举报
温馨提示
这是我自己编写的《网络游戏客户端编程》第6章的示例程序,源程序中对一些关键代码都有详细注释,望能对初学者有所帮助,也希望能得到朋友的指教。
资源推荐
资源详情
资源评论
收起资源包目录
6.rar (90个子文件)
Example6
Example6_3
d3dUtility.cpp 5KB
Example6_3.vcproj.秦春.user.user 1KB
asa.X 449KB
Example6_3.vcproj 4KB
chr_h_047.bmp 768KB
d3dUtility.h 2KB
Example6_3.cpp 6KB
Example6_2
Example6_2.vcproj 4KB
Example6_2 - 复制.cpp 7KB
d3dUtility.cpp 5KB
Example6_2.cpp 8KB
Example6_2.vcproj.秦春.user.user 1KB
d3dUtility.h 2KB
Example6_5
Example6_5.vcproj.秦春.user.user 1KB
d3dUtility.cpp 4KB
Example6_5.vcproj 4KB
Example6_5.cpp 4KB
d3dUtility.h 1KB
Example6.sln 5KB
Example6_11
Example6_11.vcproj 4KB
d3dUtility1.cpp 10KB
d3dUtility.cpp 9KB
pSystem.h 3KB
flare.bmp 17KB
Example6_11.cpp 5KB
pSystem.cpp 11KB
camera.h 1KB
desert.bmp 768KB
flare_alpha.dds 64KB
d3dUtility.h 4KB
camera.cpp 4KB
d3dUtility1.h 4KB
Example6_11.vcproj.秦春.user.user 1KB
snow.tga 150KB
TerrainTex.bmp 16KB
Example6_10
skybox_right.bmp 94KB
skybox_back.bmp 95KB
skybox_left.bmp 95KB
skybox_front.bmp 95KB
Example6_10.cpp 13KB
skybox_top.bmp 192KB
d3dUtility.cpp 4KB
Floor.bmp 192KB
camera.h 1KB
Example6_10.vcproj.秦春.user.user 1KB
d3dUtility.h 1KB
Example6_10.vcproj 4KB
camera.cpp 3KB
Billboard.bmp 192KB
TerrainTex.bmp 16KB
Example6.ncb 13.58MB
Example6_4
Example6_4.cpp 3KB
d3dUtility.cpp 4KB
Example6_4.vcproj 4KB
d3dUtility.h 1KB
Example6_4.vcproj.秦春.user.user 1KB
Example6_1
Example6_1.vcproj 4KB
Example6_1.vcproj.秦春.user.user 1KB
Example6_1.cpp 8KB
d3dUtility.cpp 5KB
d3dUtility.h 2KB
Example6_7
d3dUtility.cpp 3KB
Example6_7.vcproj 4KB
Terrain.h 2KB
Terrain_256.bmp 65KB
Example6_7.cpp 5KB
terr_dirt-grass.jpg 20KB
Example6_7.vcproj.秦春.user.user 1KB
d3dUtility.h 1KB
Terrain.cpp 6KB
Example6_6
grass.jpg 51KB
d3dUtility.cpp 4KB
Example6_6.vcproj.秦春.user.user 1KB
Example6_6.cpp 5KB
Example6_6.vcproj 4KB
coastMountain64.bmp 5KB
Terrain_256.bmp 65KB
d3dUtility.h 1KB
Example6_8
Example6_8.vcproj.秦春.user.user 1KB
d3dUtility.cpp 4KB
Example6_8.vcproj 4KB
d3dUtility.h 1KB
Example6_8.cpp 3KB
Example6_9
Autumn Leaves.jpg 270KB
d3dUtility.cpp 4KB
Example6_9.cpp 5KB
d3dUtility.h 1KB
Example6_9.vcproj.秦春.user.user 1KB
Example6_9.vcproj 4KB
Example6.suo 36KB
共 90 条
- 1
资源评论
- yy520xxr2011-09-19有点难度。我现在的水平确实看的不是很懂
- 茶向2011-10-01很好,买了一般书,正愁没有源码
- long6309042014-03-20很好的,就是没有配套的源码,不过还是能够看的懂的。对自己有帮助的
qinchunlf
- 粉丝: 0
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功