/头文件/
#pragma once
#include "Node.h"
struct WaterUpVertex
{
float x, y, z;
float tu, tv;
enum FVF
{
FVF_Flags = D3DFVF_XYZ | D3DFVF_TEX1
};
};
struct WaterDownVertex
{
float x, y, z;
float nx, ny, nz;
enum FVF
{
FVF_Flags = D3DFVF_XYZ | D3DFVF_NORMAL
};
};
class Water : public CNode
{
public:
LPDIRECT3DVERTEXBUFFER9 m_pWaterDownVB;//材质面顶点缓冲
LPDIRECT3DINDEXBUFFER9 m_pWaterDownIB;//材质面索引缓冲
LPDIRECT3DTEXTURE9 m_pWaterTextures[30];//贴图面纹理数组
WaterUpVertex m_WaterUpVertices[4];//贴图面顶点数组
LPDIRECT3DDEVICE9 m_pDevice;
float m_fWidth;//水面尺寸
float m_fLength;
float m_fTileLength;//水面单元格大小s
UINT m_uiNumXTile;//单元格行数
UINT m_uiNumYTile;//单元格列数
UINT m_uiNumTiles;//单元格总数
UINT m_uiNumVertices;//材质面顶点数
UINT m_uiNumIndices;//材质面索引数
UINT m_uiNumXWrap;//贴图面U向贴图数
UINT m_uiNumYWrap;//贴图面V向贴图数
UINT m_iCurrenrtFrame;//显示帧的当前帧
UINT m_fLifeTime;//换帧计时器
D3DMATERIAL9 m_WaterMaterial;
Water(void);
~Water(void);
// @param fWidth 水面的宽度
// @param fLength 水面的长度
// @param fTileLength 下层水面的格子长度
// @param uiNumWrap 上层水面的纹理包装次数
void Init(float fWidth, float fLength, float fTileLength, UINT uiNumXWrap,
UINT uiNumYWrap, TCHAR* pWaterPrefix,float height ,LPDIRECT3DDEVICE9 pDevice );
void Render( float fElapsedTime ); //换帧时间
};
///
源文件///
#include "StdAfx.h"
#include "Water.h"
Water::Water(void)
{
m_pWaterDownVB=NULL;
m_pWaterDownIB=NULL;
m_pDevice=NULL;
m_uiNumXTile=0;
m_uiNumYTile=0;
m_uiNumTiles=0;
m_uiNumVertices=0;
m_uiNumIndices=0;
m_fTileLength=0.f;
m_fWidth=0.f;
m_fLength=0.f;
m_uiNumXWrap=0;
m_uiNumYWrap=0;
m_iCurrenrtFrame=0;
m_fLength=0;
}
Water::~Water(void)
{
for( int i = 0; i < 30; ++i )
{
SAFE_RELEASE(m_pWaterTextures[i]);
}
SAFE_RELEASE(m_pWaterDownVB);
SAFE_RELEASE(m_pWaterDownIB);
}
void Water::Init(float fWidth, float fLength, float fTileLength, UINT uiNumXWrap,
UINT uiNumYWrap, TCHAR* pWaterPrefix,float height, LPDIRECT3DDEVICE9 pDevice )
{
m_pDevice = pDevice;
m_fWidth = fWidth;
m_fLength = fLength;
m_fTileLength = fTileLength;
m_uiNumXTile = (UINT)(m_fWidth / m_fTileLength);
m_uiNumYTile = (UINT)(m_fLength / m_fTileLength);
m_uiNumTiles = m_uiNumXTile * m_uiNumYTile;
m_uiNumVertices = m_uiNumTiles * 4;
m_uiNumIndices = m_uiNumTiles * 6;
m_uiNumXWrap = uiNumXWrap;
m_uiNumYWrap = uiNumYWrap;
for( int i = 0; i < 30; ++i )//图片的相关信息
{
TCHAR cWaterIdx[255];
wsprintf(cWaterIdx,_T("%s%d.tga"),pWaterPrefix,i+1);//%s:pWaterPrefix %d:i+1
D3DXCreateTextureFromFile( pDevice, cWaterIdx, &m_pWaterTextures[i] );
}
//水面贴图面4个顶点的初始化
float fHalfWidth = m_fWidth * 0.5f;
float fHalfLength = m_fLength * 0.5f;
m_WaterUpVertices[0].x = m_pos.x-fHalfWidth;
m_WaterUpVertices[0].y = height;
m_WaterUpVertices[0].z = m_pos.y-fHalfLength;
m_WaterUpVertices[0].tu = 0.f;
m_WaterUpVertices[0].tv = (float)m_uiNumYWrap;
m_WaterUpVertices[1].x = m_pos.x+fHalfWidth;
m_WaterUpVertices[1].y = height;
m_WaterUpVertices[1].z = m_pos.y-fHalfLength;
m_WaterUpVertices[1].tu = (float)m_uiNumXWrap;
m_WaterUpVertices[1].tv = (float)m_uiNumYWrap;
m_WaterUpVertices[2].x = m_pos.x-fHalfWidth;
m_WaterUpVertices[2].y = height;
m_WaterUpVertices[2].z = m_pos.y+fHalfLength;
m_WaterUpVertices[2].tu = 0.f;
m_WaterUpVertices[2].tv = 0.f;
m_WaterUpVertices[3].x = m_pos.x+fHalfWidth;
m_WaterUpVertices[3].y = height;
m_WaterUpVertices[3].z = m_pos.y+fHalfLength;
m_WaterUpVertices[3].tu = (float)m_u
水纹特效vc++源码
最新推荐文章于 2023-09-10 20:59:39 发布