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

📄 game.cpp

📁 一个CDMA手机BREW的3D游戏的源代码
💻 CPP
字号:
// ==========================================================================================================
//
// BREW v2.0+ OPENGLES MICROENGINE
// Basic Q3 BSP Viewer
//
// Written by Vander Nunes
//
// ==========================================================================================================

#include "game.h"


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
int AEEClsCreateInstance(AEECLSID ClsId, IShell *pIShell, IModule *po, void **ppObj)
{
	*ppObj = NULL;

	if (ClsId == AEECLSID_GAME)
		if (AEEApplet_New(sizeof(CGame), ClsId, pIShell, po, (IApplet**)ppObj, (AEEHANDLER)CGame::HandleInitEvent,(PFNFREEAPPDATA)CGame::Destroy) == TRUE)
			return AEE_SUCCESS;

	return EFAILED;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
CGame::CGame()
{
	m_key_state = 0;
	m_kSELECT = m_kLEFT = m_kRIGHT = m_kUP = m_kDOWN = m_kCLEAR = FALSE;
	m_klastUP = m_klastDOWN = FALSE;
	// --------------------------------------------
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
CGame::~CGame()
{
	CleanUp();
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::Destroy(CGame* pGame)
{
	pGame->CleanUp();
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CGame::Init()
{
	// initialize the 3D engine
	m_pEngine = new CEngine(&m_applet);
	if (!m_pEngine) return FALSE;
	if (!m_pEngine->Init()) return FALSE;

	// instanciate the camera
	m_pCam = new CCamera(m_pEngine);
	m_pCam->Setup(1.0f, 10.0f, 1.0f);

	// instanciate bsp
	m_pBSP = new CQ3BSP(m_pEngine);

	m_jGameStatus = STATUS_START;
	m_jMenuOption = 0;

	m_dwFrame = 0;
	NextFrame(this);

	return TRUE;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CGame::LoadResources()
{
	if (m_jMenuOption == 0)
	{
		if (!m_pBSP->Load("box.bsp")) return FALSE;
	}
	else if (m_jMenuOption == 1)
	{
		if (!m_pBSP->Load("galeria.bsp")) return FALSE;
	}

	m_pBSP->GetInfoPlayerStart(m_pCam->Position());
	m_pCam->RotateTo(0, m_pBSP->InfoPlayerStartAngle(), 0);

	return TRUE;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::CleanUp()
{
	// release font sprite
	DeletePtr(m_pSpr8x13);

	// release bsp
	DeletePtr(m_pBSP);

	// release camera
	DeletePtr(m_pCam);

	// release engine
	DeletePtr(m_pEngine);
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CGame::HandleInitEvent(CGame* pGame, AEEEvent event, uint16 wParam, uint32 dwParam)
{
	switch (event)
	{
		case EVT_APP_START:
		{
			return pGame->Init();
		}

		case EVT_APP_STOP:
		{
			return TRUE;
		}
	}

	return pGame->HandleEvent(event, wParam, dwParam);
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CGame::HandleEvent(AEEEvent event, uint16 wParam, uint32 dwParam)
{
	switch (event)
	{
		case EVT_APP_SUSPEND:
		{
			ISHELL_CancelTimer(m_applet.m_pIShell, NULL, (void *)this);
			return TRUE;
		}

		case EVT_APP_RESUME:
		{
			NextFrame(this);
			return TRUE;
		}

		case EVT_APP_NO_SLEEP:
		{
			return TRUE;
		}

		case EVT_KEY_PRESS:
		{
			m_key_state = 1;
			m_key_wParam = wParam;
			KeyPressEvent(wParam);
			return TRUE;
		}

		case EVT_KEY_RELEASE:
		{
			m_key_state = 0;
			m_key_wParam = wParam;
			KeyReleaseEvent(wParam);
			return TRUE;
		}

		case EVT_KEY:
		{
			return TRUE;
		}
	}

	return TRUE;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CGame::KeyPressEvent(uint16 wParam)
{
	switch(wParam)
	{
		case AVK_SELECT:
			m_kSELECT = true;
			return TRUE;

		case AVK_LEFT:
			m_kLEFT = true;
			return TRUE;

		case AVK_RIGHT:
			m_kRIGHT = true;
			return TRUE;

		case AVK_UP:
			m_kUP = true;
			return TRUE;

		case AVK_DOWN:
			m_kDOWN = true;
			return TRUE;

		case AVK_1:
			return TRUE;
		case AVK_2:
			return TRUE;
		case AVK_3:
			return TRUE;
		case AVK_4:
			return TRUE;
		case AVK_5:
			return TRUE;
		case AVK_6:
			return TRUE;
		case AVK_7:
			return TRUE;
		case AVK_8:
			return TRUE;
		case AVK_9:
			return TRUE;
		case AVK_STAR:
			return TRUE;
		case AVK_0:
			return TRUE;

		case AVK_POUND:
			return TRUE;

		case AVK_CLR:
			m_kCLEAR = true;
			return TRUE;
	}

	return TRUE;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CGame::KeyReleaseEvent(uint16 wParam)
{
	switch(wParam)
	{
		case AVK_SELECT:
			m_kSELECT = false;
			return TRUE;

		case AVK_LEFT:
			m_kLEFT = false;
			return TRUE;

		case AVK_RIGHT:
			m_kRIGHT = false;
			return TRUE;

		case AVK_UP:
			m_kUP = false;
			return TRUE;

		case AVK_DOWN:
			m_kDOWN = false;
			return TRUE;

		case AVK_1:
			return TRUE;
		case AVK_2:
			return TRUE;
		case AVK_3:
			return TRUE;
		case AVK_4:
			return TRUE;
		case AVK_5:
			return TRUE;
		case AVK_6:
			return TRUE;
		case AVK_7:
			return TRUE;
		case AVK_8:
			return TRUE;
		case AVK_9:
			return TRUE;
		case AVK_STAR:
			return TRUE;
		case AVK_0:
			return TRUE;

		case AVK_POUND:
			return TRUE;

		case AVK_CLR:
			m_kCLEAR = false;
			return TRUE;
	}

	return TRUE;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::NextFrame(CGame* pGame)
{
	IDISPLAY_Backlight(pGame->m_applet.m_pIDisplay, TRUE);
	// ----------------------------------------------------------------------------------

	pGame->RenderFrame();

	// ----------------------------------------------------------------------------------
	ISHELL_SetTimer(pGame->m_applet.m_pIShell, 33, (PFNNOTIFY)NextFrame, (void *)pGame);
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderFrame()
{
	// -----------------------------------------------------------------------------------------
	// clear everything
	// -----------------------------------------------------------------------------------------
	#if 1
		glClearColorx(0,0,0,0);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	#else
		glClear(GL_DEPTH_BUFFER_BIT);
	#endif
	// -----------------------------------------------------------------------------------------

	switch(m_jGameStatus)
	{
		case STATUS_START:
		{
			RenderStart();
			break;
		}

		case STATUS_MENU:
		{
			RenderMenu();
			break;
		}

		case STATUS_LOADING:
		{
			if (!LoadResources()) ISHELL_CloseApplet(m_applet.m_pIShell, 0);
			m_dwFrame = 0;
			m_jGameStatus = STATUS_PLAYING;
			break;
		}

		case STATUS_PLAYING:
		{
			RenderPlaying();
			break;
		}
	}

	// -----------------------------------------------------------------------------------------
	//
	// swap buffers and update screen
	m_pEngine->SwapBuffers();
	IDISPLAY_Update(m_applet.m_pIDisplay);
	//
	// -----------------------------------------------------------------------------------------
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderStart()
{
	if (m_dwFrame == 0)
	{
		if (m_kCLEAR || m_kSELECT) return;
		// load 8x13 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ font sprite
		m_pSpr8x13 = new CSprite(m_pEngine);
		m_pSpr8x13->LoadFromVfs("game.dat", "font_8x13.bmp");
		int16 jFrm8x13[58*6];
		int yy, pp=0, f8x13offx=0;
		for (yy=0; yy<58; yy++)
		{
			jFrm8x13[pp++] = f8x13offx;
			jFrm8x13[pp++] = 0;
			jFrm8x13[pp++] = 0;
			jFrm8x13[pp++] = 0;
			jFrm8x13[pp++] = 8;
			jFrm8x13[pp++] = 13;
			f8x13offx += 8;
		}
		m_pSpr8x13->Config(58, jFrm8x13);
	}

	if (m_dwFrame)
	{
		m_pSpr8x13->DrawText32To90((m_pEngine->ScreenWidth()-88)>>1, (m_pEngine->ScreenHeight()-13)>>1, "- LOADING -");
		m_jGameStatus = STATUS_MENU;
	}

	m_dwFrame++;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderMenu()
{
	char* szOptions[] =
	{
		"LITTLE BOX",
		"BIG GALLERY"
	};

	if (m_dwFrame == 0)
	{
		if (m_kCLEAR || m_kSELECT) return;
	}

	if (m_dwFrame && !m_kSELECT)
	{
		m_pSpr8x13->DrawText32To90((m_pEngine->ScreenWidth()-56)>>1, 8, "SELECT:");
		m_pSpr8x13->DrawText32To90((m_pEngine->ScreenWidth()-STRLEN(szOptions[0])*8)>>1, (m_pEngine->ScreenHeight()>>1) - 7, szOptions[0]);
		m_pSpr8x13->DrawText32To90((m_pEngine->ScreenWidth()-STRLEN(szOptions[1])*8)>>1, (m_pEngine->ScreenHeight()>>1) + 7, szOptions[1]);
		m_pSpr8x13->DrawText32To90(4, (m_pEngine->ScreenHeight()>>1) - 7 + 13 * m_jMenuOption, ">");

		if (m_kUP)
		{
			if (!m_klastUP)
			{
				m_jMenuOption ^=1;
				m_klastUP = TRUE;
			}
		} else m_klastUP = FALSE;

		if (m_kDOWN)
		{
			if (!m_klastDOWN)
			{
				m_jMenuOption ^=1;
				m_klastDOWN = TRUE;
			}
		} else m_klastDOWN = FALSE;
	}

	if (m_kCLEAR) ISHELL_CloseApplet(m_applet.m_pIShell, 0);

	if (m_kSELECT)
	{
		m_pSpr8x13->DrawText32To90((m_pEngine->ScreenWidth()-88)>>1, (m_pEngine->ScreenHeight()-13)>>1, "- LOADING -");
		m_dwFrame = 0;
		m_jGameStatus = STATUS_LOADING;
	}

	m_dwFrame++;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderPlaying()
{
	if (m_kCLEAR)
	{
		m_dwFrame = 0;
		m_jGameStatus = STATUS_MENU;
		m_pBSP->Unload();
		return;
	}

	// -----------------------------------------------------------------------------------------
	// process keyboard
	// -----------------------------------------------------------------------------------------
	if (m_kLEFT) m_pCam->AddRotation(0, ITOX(6), 0);
	if (m_kRIGHT) m_pCam->AddRotation(0, ITOX(-6), 0);
	m_pCam->UpdateDirection();
	#define SPEED 5
	#if 0
		//
		// camera look around and move
		//
		if (m_kUP) m_pCam->AddTranslation(m_pCam->m_Direction[0]*SPEED, -m_pCam->m_Direction[1]*SPEED, -m_pCam->m_Direction[2]*SPEED);
		if (m_kDOWN) m_pCam->AddTranslation(-m_pCam->m_Direction[0], m_pCam->m_Direction[1], m_pCam->m_Direction[2]);
	#else
		//
		// camera look around only
		//
		if (m_kSELECT) m_pCam->AddTranslation(m_pCam->Direction()[0]*SPEED, -m_pCam->Direction()[1]*SPEED, -m_pCam->Direction()[2]*SPEED);
		if (m_kUP) m_pCam->AddRotation(ITOX(3), 0, 0);
		if (m_kDOWN) m_pCam->AddRotation(-ITOX(3), 0, 0);
	#endif

	// -----------------------------------------------------------------------------------------
	// render BSP
	// -----------------------------------------------------------------------------------------
	m_pBSP->Render(m_pCam);
}

⌨️ 快捷键说明

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