⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winmain.cpp

📁 VC++ DEMO, used for the beginners and the amour
💻 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 + -