📄 main.cpp
字号:
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <mmsystem.h>
#include <math.h>
#include <stdio.h>
#include "Mesh.h"
#include "Girl.h"
//#include "effects.h"
//#include "effects.cpp"
//#include "Fog.h"
#pragma comment (lib,"d3dx9.lib")
#pragma comment (lib,"d3d9.lib")
/////////////////////
//
/////////////////////
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000)? 1 : 0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000)? 0 : 1)
#define D3DFVF_POINTVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
inline DWORD FtoDW( FLOAT f ) { return *((DWORD*)&f); }
struct CONTROL
{
D3DXVECTOR3 LookAt[3];
};
struct POINTVERTEX
{
D3DXVECTOR3 p;
D3DCOLOR color;
};
// 定义雪效果的结构
struct SNOW
{
LPDIRECT3DVERTEXBUFFER9 m_pSnowVB;
LPDIRECT3DTEXTURE9 m_pTextureSnow;
LONG m_lSnowCount;
D3DXVECTOR3 m_vPosition;
DWORD m_Width;
DWORD m_Lenth;
DWORD m_Hight;
float m_offset;
};
CONTROL g_Control;
float g_Angle = 0;
LPDIRECT3D9 g_pD3D=NULL;//指向D3D接口的指针
LPDIRECT3DDEVICE9 g_pD3DDevice=NULL;//指向D3D设备接口的指针
LPD3DXFONT g_pFont;//文本框对象,用于显示文字
CMesh *g_pMesh;
Girl *g_pMeshGirl;
//Flower g_Flower;
SNOW g_Snow;
//-----------------------------------------------------------------------------
// 名称: 3DEn_Snow_Init()
// 功能: 初始化雪
//-----------------------------------------------------------------------------
HRESULT En_Snow_Delete(SNOW *pSnow)
{
if(pSnow->m_pSnowVB)
pSnow->m_pSnowVB->Release();
if(pSnow->m_pTextureSnow != NULL )
pSnow->m_pTextureSnow->Release();
return D3D_OK;
}
HRESULT En_Snow_Init(LPDIRECT3DDEVICE9 pd3dDevice,
SNOW *pSnow,
LONG density)
{
HRESULT hr;
DWORD width = pSnow->m_Width;
DWORD lenth = pSnow->m_Lenth;
DWORD hight = pSnow->m_Hight ;
LONG lSnowCount = width*lenth*density*density;
pSnow->m_lSnowCount = lSnowCount;
// 创建渲染雪花的纹理
if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, "Model\\snow.tga",
&pSnow->m_pTextureSnow ) ) )
{
//MessageBox(NULL,"加载雪花纹理失败!\n可能是文件名或路径错误。",&pSnow,MB_OK|MB_ICONERROR);
return E_FAIL;
}
// 生成雪花的顶点
hr = pd3dDevice->CreateVertexBuffer( lSnowCount*sizeof(POINTVERTEX),
D3DUSAGE_WRITEONLY, D3DFVF_POINTVERTEX,
D3DPOOL_MANAGED, &pSnow->m_pSnowVB,NULL );
POINTVERTEX* pVertices = NULL;
LPDIRECT3DVERTEXBUFFER9 pVB = pSnow->m_pSnowVB;
hr = pVB->Lock( 0, lSnowCount*sizeof(POINTVERTEX),
(void**)&pVertices, 0 );
for( DWORD line = 0; line < (DWORD)(width*density) ; line++ )
{
float offwidth = (float)1/density;
for( DWORD seg=0; seg < (DWORD)(lenth*density); seg++ )
{
FLOAT fRandx = ((FLOAT)rand()/(FLOAT)RAND_MAX) * 2.1f;
FLOAT fRandy = ((FLOAT)rand()/(FLOAT)RAND_MAX) * 10.0f;
FLOAT fRandz = ((FLOAT)rand()/(FLOAT)RAND_MAX) * 0.1f;
float offlenth = (float)1/density;
pVertices->p.x = -(float)width/2 + seg * (offwidth + fRandx);
pVertices->p.y = (float)pSnow->m_Hight + fRandy;
pVertices->p.z = -(float)lenth/2 + line *(offlenth + fRandz);
pVertices->color = 0xffffffff;
pVertices++;
}
}
pVB->Unlock();
return S_OK;
}
HRESULT En_Snow_Move( SNOW *pSnow, float offset )
{
HRESULT hr;
DWORD lSnowCount = pSnow->m_lSnowCount;
// 移动雪花的顶点
POINTVERTEX* pVertices = NULL;
LPDIRECT3DVERTEXBUFFER9 pVB = pSnow->m_pSnowVB;
hr = pVB->Lock( 0, lSnowCount*sizeof(POINTVERTEX),
(void**)&pVertices, 0 );
for( DWORD seg=0; seg < lSnowCount; seg++ )
{
if(pVertices->p.y < 0)
pVertices->p.y = (float)pSnow->m_Hight;
else
pVertices->p.y -= offset;
pVertices++;
}
pVB->Unlock();
return S_OK;
}
HRESULT En_Snow_Draw( LPDIRECT3DDEVICE9 pd3dDevice, SNOW *pSnow )
{
D3DXMATRIX matWorld;
DWORD lSnowCount = pSnow->m_lSnowCount;
D3DXMatrixTranslation( &matWorld, g_Control.LookAt[0].x , 35 , g_Control.LookAt[0].z );
g_pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld );
// 渲染雪花的顶点
POINTVERTEX* pVertices = NULL;
LPDIRECT3DVERTEXBUFFER9 pVB = pSnow->m_pSnowVB;
pd3dDevice->SetTexture( 0, pSnow->m_pTextureSnow );
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
pd3dDevice->SetRenderState( D3DRS_ALPHAREF, 0x0f);
pd3dDevice->SetRenderState( D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL );
pd3dDevice->SetRenderState( D3DRS_POINTSPRITEENABLE, TRUE );
pd3dDevice->SetRenderState( D3DRS_POINTSCALEENABLE, TRUE );
pd3dDevice->SetRenderState( D3DRS_POINTSIZE, FtoDW(0.04f) );
pd3dDevice->SetRenderState( D3DRS_POINTSIZE_MIN, FtoDW(0.00f) );
pd3dDevice->SetRenderState( D3DRS_POINTSCALE_A, FtoDW(1.00f) );
pd3dDevice->SetRenderState( D3DRS_POINTSCALE_B, FtoDW(1.00f) );
pd3dDevice->SetRenderState( D3DRS_POINTSCALE_C, FtoDW(1.00f) );
pd3dDevice->SetFVF( D3DFVF_POINTVERTEX );
pd3dDevice->SetStreamSource( 0, pVB,0, sizeof(POINTVERTEX) );
pd3dDevice->DrawPrimitive( D3DPT_POINTLIST,
0, lSnowCount);
En_Snow_Move(pSnow,0.01f);
pd3dDevice->SetFVF( D3DFVF_POINTVERTEX );
pd3dDevice->SetStreamSource( 0, pVB,0, sizeof(POINTVERTEX) );
pd3dDevice->DrawPrimitive( D3DPT_POINTLIST,
0, lSnowCount);
pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
En_Snow_Move(pSnow, pSnow->m_offset);
return S_OK;
}
/////////////////////////
//初始化D3D程序
////////////////////////
HRESULT InitialiseD3D(HWND hWnd)
{
g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);//创建D3D对象,指针参数唯一
if(g_pD3D==NULL)
{
return E_FAIL;
}
D3DDISPLAYMODE d3ddm;//获取显示设备模式
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
{
return E_FAIL;
}
D3DPRESENT_PARAMETERS d3dpp;//创建结构保存设备的显示模式
ZeroMemory(&d3dpp,sizeof(d3dpp));
//填充显示结构????????????
d3dpp.Windowed=true;//窗口模式
d3dpp.BackBufferCount = 1;
//d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferWidth = d3ddm.Width;
d3dpp.BackBufferHeight = d3ddm.Height;
d3dpp.hDeviceWindow = hWnd;
//d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;//翻转的模式
d3dpp.BackBufferFormat=d3ddm.Format;//后缓冲的显示模式
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = TRUE;
//创建D3D设备接口
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,
hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice)))
{
return E_FAIL;
}
g_pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
g_pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
g_pMesh=new CMesh(g_pD3DDevice,"Model\\world\\world.x",false);
g_pMeshGirl=new Girl(g_pD3DDevice,"asa.x",false);
// 创建雪结构
g_Snow.m_Hight = 15;
g_Snow.m_Lenth = 15;
g_Snow.m_Width = 15;
g_Snow.m_offset = 0.1f;
En_Snow_Init(g_pD3DDevice,&g_Snow,10);
g_Control.LookAt[0] = 1*D3DXVECTOR3( 0.0f, 40.0f,0.0f );//摄影机的位置
g_Control.LookAt[1] = 1*D3DXVECTOR3( 0.0f, 40.0f,1.0f );//摄影机朝向的位置
g_Control.LookAt[2] = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );//摄影机的正方向
// g_lightPosition = D3DXVECTOR3( 0.0f, 1.0f,-4.0f );
//实例化LPD3DXFONT文本框对象
#if(D3D_SDK_VERSION==32)
D3DXCreateFont(g_pD3DDevice,32,0,0,1,0,ANSI_CHARSET,0,0,0,"Comic Sans MS",&g_pFont);
#else
HFONT hFont = CreateFont(32, 0, 1, 0, 0, 1, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, "Comic Sans MS");
D3DXCreateFont(g_pD3DDevice,hFont,&g_pFont);
#endif
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: SetFog()
// Desc: 设置雾化效果
//-----------------------------------------------------------------------------
VOID SetFog()
{
g_pD3DDevice->SetRenderState( D3DRS_FOGENABLE,TRUE );
g_pD3DDevice->SetRenderState( D3DRS_FOGCOLOR,0x00ffffFF);
D3DCAPS9 stCaps;
g_pD3DDevice->GetDeviceCaps (&stCaps);
if (stCaps.RasterCaps&D3DPRASTERCAPS_FOGRANGE)
g_pD3DDevice->SetRenderState(D3DRS_RANGEFOGENABLE, TRUE);
float start=1000;
float end=4000;
float density=10.1f;
g_pD3DDevice->SetRenderState( D3DRS_FOGSTART,*(DWORD*)&start);
g_pD3DDevice->SetRenderState( D3DRS_FOGEND,*(DWORD*)&end);
g_pD3DDevice->SetRenderState( D3DRS_FOGTABLEMODE,D3DFOG_LINEAR);
/*
float fTime=timeGetTime()/1000.0f;
fTime=fTime/10;
int FogKey=((int)fTime)%3;
switch(FogKey)
{
case 0:
g_pD3DDevice->SetRenderState( D3DRS_FOGSTART,*(DWORD*)&start);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -