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

📄 capplication.cpp

📁 一个2D的赛车游戏 在VC下运行 开发库DIRECTX8.1以上
💻 CPP
字号:
// CMAIN LIB - APPLICATION AND DIRECT WRAPPER
//
// Written by Mauricio Teichmann Ritter
//
// Copyright (C) 2002, Brazil. All rights reserved.
// 
//

#include "cApplication.h"


cApplication* CreateApplication();
cApplication* pApp;

cApplication* GetMainApp()
{
	return pApp;
}


long FAR PASCAL MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
    case WM_SIZE:
        // Check to see if we are losing our window...
        if( SIZE_MAXHIDE==wParam || SIZE_MINIMIZED==wParam )
            GetMainApp()->m_bActive = FALSE;
        else
            GetMainApp()->m_bActive = TRUE;

        break;
	case WM_CREATE:
        break;
	case WM_CLOSE:
    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        break;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);

} /* MainWndproc */


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int iCmdShow)
{
	cApplication::m_hInst = hInst;


	pApp = CreateApplication();


	CoInitialize(NULL);

	if(!pApp->InitApplication())
	{
		MessageBox(NULL, "Error Starting up application.\n Close all open programs and try again.", "Error", MB_ICONERROR);
		return 0;
	}

	if(!pApp->InitDirectX())
	{
		MessageBox(NULL, "Error Starting up DirectX.\n Check if you have Microsoft DirectX correctly installed on your machine.\n You can download the latest version from http://www.microsoft.com/directx.", "Error", MB_ICONERROR);
		return 0;
	}

	// Call virtual function to tell the derived class that with
	// have setup everything
	pApp->AppInitialized();

	// Start Message Loop
	pApp->RunApplication();

	delete pApp;

	return 0;
}


cApplication::cApplication()
{
	m_pDD          = NULL;
	m_pFrontBuffer = NULL;
	m_pBackBuffer  = NULL;
	
	m_ColorDepth   = 16;
	m_ScreenWidth  = 640;
	m_ScreenHeight = 480;

	m_bDontFlip = false;

	m_bActive = TRUE;
};



cApplication::~cApplication()
{
    // Time for cleanup
	//     
    if( m_pBackBuffer != NULL )
        m_pBackBuffer->Release();

	if( m_pFrontBuffer != NULL )
        m_pFrontBuffer->Release();

    if( m_pDD != NULL )
        m_pDD->Release();

	CoUninitialize();
};

HINSTANCE cApplication::m_hInst = NULL;

void cApplication::DoIdle()
{
	return;
}

BOOL cApplication::InitApplication()
{
	m_bActive = TRUE;
	// First Try to register the window
	if(FAILED(m_pWindow.RegisterWindow(m_lpszwndClassName)))
		return FALSE;

	// Then try to create it
	if(!m_pWindow.Create(m_lpszAppName))
		return FALSE;

	return TRUE;
}

BOOL cApplication::RunApplication()
{
	// MessageLoop implementation
	// The DoIdle function is a virtual function that can be implemented
	// In the derived class

    MSG            msg; 
	BOOL		   bContinue = TRUE;
	HRESULT		   hRet;

    while (bContinue) 
	{
		// Check the message pool
		if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
        {
            if(msg.message == WM_QUIT)
			{
				ExitApp();
			}
			if( !GetMessage( &msg, NULL, 0, 0 ) )
            {
                return msg.wParam;
            }
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
		else
		{
			// Nothing to do... idle;
			DoIdle();

			if(pApp->m_bActive)
			{
				if(m_bDontFlip == false)
				{
					hRet = m_pFrontBuffer->Flip(NULL, 0 );
					if(hRet != DD_OK)
					{
						DXTRACE_MSG("Error Flipping Front Buffer !\n");
					}
				}
				else
					m_bDontFlip = false;
			}
			else
			{
				WaitMessage();
			}
		}
	}

    return TRUE;
}

BOOL cApplication::InitDirectX()
{
	HRESULT			hRet;
	LPDIRECTDRAW	pDD;

    DDSURFACEDESC2		ddsd;
    DDSCAPS2			ddscaps;


	// First of all, create the DirectX object
	hRet = DirectDrawCreate( NULL, &pDD, NULL );
	if(hRet != DD_OK)
	{
		// if failed, quit the app
		return FALSE;
	}

    // Fetch DirectDraw7 interface
    hRet = pDD->QueryInterface(IID_IDirectDraw7, (LPVOID*)&m_pDD);
	if(hRet != DD_OK)
	{
		// if failed, quit the app
		return FALSE;
	}

	// Since we don磘 need this DirectDraw interface anymore, release it
	pDD->Release();
    
	// Set cooperative level to fullscreenn
	hRet = m_pDD->SetCooperativeLevel(m_pWindow.GetHWnd(), DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
	if(hRet != DD_OK)
	{
		// if failed, quit the app
		return FALSE;
	}
    
	
	// Set Display mode
    hRet = m_pDD->SetDisplayMode(m_ScreenWidth, m_ScreenHeight, m_ColorDepth, 0, 0 );
	if(hRet != DD_OK)
	{
		// if failed, quit the app
		return FALSE;
	}

	
    // Create Main Surfaces
	// We磍l not use cSurface here because we only need reference of this
	// two guys
    ZeroMemory( &ddsd, sizeof( ddsd ) );

    ddsd.dwSize = sizeof( ddsd );
    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    
	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
                          DDSCAPS_FLIP |
                          DDSCAPS_COMPLEX;
							
    ddsd.dwBackBufferCount = 1;
    
	hRet = m_pDD->CreateSurface(&ddsd, &m_pFrontBuffer, NULL );
	if(hRet != DD_OK)
	{
		// if failed, quit the app
		return FALSE;
	}

    // get a pointer to the back buffer
    
	ZeroMemory(&ddscaps, sizeof(ddscaps));

	ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
    hRet = m_pFrontBuffer->GetAttachedSurface(
                &ddscaps,
                &m_pBackBuffer);
	if(hRet != DD_OK)
	{
		// if failed, quit the app
		return FALSE;
	}

	// All OK ! :)
	return TRUE;
}

LPDIRECTDRAW7 cApplication::GetDirectDraw()
{
	return m_pDD;
}

void cApplication::AppInitialized()
{

}

void cApplication::ExitApp()
{

}

HWND cApplication::GetMainWnd()
{
	return m_pWindow.GetHWnd();
}

void cApplication::PreventFlip()
{
	m_bDontFlip = true;
}

#ifdef _DEBUG
void Log(char* sFormat, ...)
{
	FILE*  pFile;
	char buffer[1024];
	va_list marker;

	va_start( marker, sFormat );
	pFile = fopen("log.txt", "a+");

	vsprintf(buffer, sFormat, marker);

	fputs(buffer, pFile);
	OutputDebugString(buffer);
	va_end( marker );
	fclose(pFile);
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -