📄 game.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 + -