📄 winmain.cpp
字号:
#include "CGE\HEADERS.H"
#include "CGE\STRUCTS.H"
#include "CGE\DISPLAY.H"
#include "CGE\PARTICLE.H"
#include "CGE\FOUNTAIN.H"
USING NAMESPACE CGE;
DISPLAY_SYSTEM::LPBEHAVIOR Behavior = NULL;
PARTICLE_SYSTEM::LPFOUNTAIN Fountain = NULL;
FLOAT g_fCurTime = 0;
FLOAT g_fLastUpdateTime = 0;
LPDIRECT3DTEXTURE8 pTexture = NULL;
//Application entry point
typedef class SubMember:public DISPLAY_SYSTEM::MEMBER
{
public:
SubMember()
:m_pParticleTexture(0),m_pWaterSurface(0),m_pWaterMesh(0)
{};
virtual ~SubMember()
{
SAFE_RELEASE(m_pParticleTexture);
SAFE_RELEASE(m_pWaterSurface);
SAFE_RELEASE(m_pWaterMesh);
};
virtual BOOL Install();
virtual BOOL UnInstall();
public:
LPDIRECT3DTEXTURE8 m_pParticleTexture;
LPDIRECT3DTEXTURE8 m_pWaterSurface;
LPDIRECT3DTEXTURE8 m_pWaterLightTex;
LPDIRECT3DVERTEXBUFFER8 m_pWaterMesh;
}*LPSUBMEMBER;
BOOL SubMember::Install()
{
HRESULT hr;
LPDIRECT3DDEVICE8 device;
device = Behavior->GetSafeDevice();
hr = D3DXCreateTextureFromFile(device, "WATER.BMP", &m_pWaterSurface);
if ( FAILED(hr) )
return FALSE;
hr = D3DXCreateTextureFromFileEx(device, "PARTICLE.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_pParticleTexture);
if ( FAILED(hr) )
return FALSE;
VERTEX_STRUCT::D3DLVERTEX WATERSURFACE[4];
WATERSURFACE[0] = VERTEX_STRUCT::D3DLVERTEX(D3DXVECTOR3(-50.0f, 0.0f,50.0f), 0XFFFFFFFF,0,0.0f, 0.0f);
WATERSURFACE[1] = VERTEX_STRUCT::D3DLVERTEX(D3DXVECTOR3(50.0f, 0.0f, 50.0f), 0XFFFFFFFF,0,1.0f, 0.0f);
WATERSURFACE[2] = VERTEX_STRUCT::D3DLVERTEX(D3DXVECTOR3(-50.0f,0.0f,-50.0f), 0XFFFFFFFF,0,0.0f, 1.0f);
WATERSURFACE[3] = VERTEX_STRUCT::D3DLVERTEX(D3DXVECTOR3(50.0f, 0.0f,-50.0f), 0XFFFFFFFF,0,1.0f, 1.0f);
hr = device->CreateVertexBuffer( 4 * sizeof(VERTEX_STRUCT::D3DLVERTEX),
0,0,D3DPOOL_DEFAULT, &m_pWaterMesh);
if ( FAILED(hr) )
return FALSE;
BYTE * Ptr = NULL;
hr = m_pWaterMesh->Lock(0,0, (BYTE**)&Ptr, 0);
if ( FAILED(hr) )
return FALSE;
memcpy(Ptr, WATERSURFACE, sizeof(WATERSURFACE));
m_pWaterMesh->Unlock();
return TRUE;
}
BOOL SubMember::UnInstall()
{
SAFE_RELEASE( m_pParticleTexture );
SAFE_RELEASE( m_pWaterSurface );
SAFE_RELEASE( m_pWaterMesh );
return TRUE;
}
LPSUBMEMBER Member = NULL;
D3DXMATRIX MatrixLookAt()
{
D3DXMATRIX mat;
D3DXMatrixIdentity(&mat);
FLOAT Angle = (FLOAT)g_fCurTime / 5000.0f;
D3DXMatrixLookAtLH(&mat, &D3DXVECTOR3( sinf(Angle) * 200.0f , 200.0f, cosf(Angle) * 200.0f), &D3DXVECTOR3( 0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
return mat;
}
D3DXMATRIX MatrixPerspectiveFov()
{
D3DXMATRIX mat;
D3DXMatrixIdentity(&mat);
D3DXMatrixPerspectiveFovLH(&mat,D3DX_PI/4,1.0f,1.0f,2000.0f);
return mat;
}
VOID Render()
{
LPDIRECT3DDEVICE8 device = Behavior->GetSafeDevice();
LPDIRECT3DVERTEXBUFFER8 vb = Behavior->GetSafeDefaultVertBuffer();
device->SetTransform(D3DTS_VIEW,&MatrixLookAt());
device->SetTransform(D3DTS_PROJECTION,&MatrixPerspectiveFov());
device->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_COLORVALUE(0.0f, 0.0f, 0.0, 1.0f), 1.0f, 0 );
device->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE);
device->SetRenderState( D3DRS_LIGHTING, FALSE);
device->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
device->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
device->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE);
device->SetTextureStageState(0,D3DTSS_ALPHAOP, D3DTOP_SELECTARG2);
device->SetTextureStageState(0,D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
device->SetTextureStageState(0,D3DTSS_MINFILTER, D3DTEXF_LINEAR);
device->BeginScene();
device->SetStreamSource(0,Member->m_pWaterMesh,sizeof(VERTEX_STRUCT::D3DLVERTEX));
device->SetVertexShader(VERTEX_STRUCT::D3DLVERTEX::D3DFVF_D3DLVERTEX);
device->SetTexture(0,Member->m_pWaterSurface);
device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
device->SetTexture(0,0);
device->SetTexture(0,Member->m_pParticleTexture);
Fountain->DrawAliveList(device,vb);
device->SetTexture(0,0);
device->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
device->EndScene();
device->Present(0,0,0,0);
}
//The windows message handler
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);return 0; break;
case WM_KEYUP:
switch (wParam)
{
case VK_ESCAPE:
//User has pressed the escape key, so quit
DestroyWindow(hWnd);
return 0;break;
} break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
//Register the window class
WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"CGE", NULL};
RegisterClassEx(&wc);
//Create the application's window
HWND hWnd = CreateWindow("CGE", "喷泉",
WS_OVERLAPPED | WS_CAPTION| WS_SYSMENU | WS_MINIMIZEBOX,
50, 50, 500, 500,
GetDesktopWindow(), NULL, wc.hInstance, NULL);
Member = new SubMember;
Behavior = new DISPLAY_SYSTEM::BEHAVIOR;
Fountain = new PARTICLE_SYSTEM::FOUNTAIN;
Fountain->SetMaxNumber( 2000 );
Fountain->SetNumberToCreate(10);
Fountain->SetMouth( 0.5f );
Fountain->SetColor(0.25F,0.5f,0.5f,1);
Fountain->SetSprayBulk(5.0f);
Fountain->SetRadius( 4.0f);
Fountain->SetPosition(0,0,0);
Fountain->SetColumnHeight(80);
Fountain->SetBarSurface(D3DXVECTOR3(0,1,0),D3DXVECTOR3(0,-1,0),0.1f);
if ( !Behavior->BehaviorCreate(Member,hWnd,450,450))
{
SAFE_DELETE(Behavior);
SAFE_DELETE(Fountain);
SendMessage(hWnd,WM_CLOSE,0,0);
UnregisterClass("CGE", wc.hInstance);
}
if ( !Behavior->SetDefaultVertexBuffer(5000*sizeof(PARTICLE_SYSTEM::COLORVERTEX)))
{
SAFE_DELETE(Behavior);
SAFE_DELETE(Fountain);
SendMessage(hWnd,WM_CLOSE,0,0);
UnregisterClass("CGE", wc.hInstance);
}
g_fLastUpdateTime = timeGetTime();
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
//Enter the game loop
MSG msg;
BOOL fMessage;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while(msg.message != WM_QUIT)
{
fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if(fMessage)
{
//Process message
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//No message to process, so render the current scene
g_fCurTime = timeGetTime();
FLOAT fElpasedTime = (g_fCurTime-g_fLastUpdateTime) * 0.0018f;
g_fLastUpdateTime = g_fCurTime;
Fountain->Behavior(fElpasedTime);
Render();
}
}
SAFE_DELETE(Behavior);
SAFE_DELETE(Fountain);
UnregisterClass("CGE", wc.hInstance);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -