📄 flarbopt.c
字号:
#include "flarbopt.h"
#include "flarbopt_res.h"
#include "flarbopt.bid"int AEEClsCreateInstance(AEECLSID ClsId, IShell * pIShell, IModule * po, void ** ppObj){ *ppObj = NULL; if(ClsId == AEECLSID_FLARBOPT_BID )
{ if(AEEApplet_New(sizeof(myapp_t), ClsId, pIShell, po, (IApplet**)ppObj, (AEEHANDLER)FlarbOpt_HandleEvent, (PFNFREEAPPDATA)FlarbOpt_Cleanup) == TRUE) { return(AEE_SUCCESS); } }
return(EFAILED);}static boolean FlarbOpt_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam){
FileInfo fileInfo;
IFileMgr * pIFileMgr = NULL;
IFile * pIFile = NULL; myapp_t * pApp = (myapp_t*)pi; AEEApplet * pMe = &pApp->a;
switch (eCode) { case EVT_APP_START:
//initialize variables
pApp->bPaused = FALSE;
pApp->bSuspended = FALSE;
pApp->pIMenu = NULL;
pApp->pIStatic = NULL;
pApp->nGameMode = GAME_MODE_NONE;
pApp->pIMenu = NULL;
pApp->pIStatic = NULL;
//create the graphics interface
ISHELL_CreateInstance(pApp->a.m_pIShell, AEECLSID_GRAPHICS, (void **)&pApp->pIGraphics);
//turn the fill mode on for clearing
IGRAPHICS_SetFillMode(pApp->pIGraphics, TRUE);
//set clearing rectangle colors
IGRAPHICS_SetFillColor(pApp->pIGraphics, 255, 255, 255, 255);
IGRAPHICS_SetColor(pApp->pIGraphics, 255, 255, 255, 255);
//open our high score file
ISHELL_CreateInstance(pApp->a.m_pIShell, AEECLSID_FILEMGR,(void **)&pIFileMgr);
pIFile = IFILEMGR_OpenFile(pIFileMgr, "highscore.txt", _OFM_READ);
//if we can't find the file, create it
if (!pIFile)
{
int nZero = 0;
pIFile = IFILEMGR_OpenFile(pIFileMgr, "highscore.txt", _OFM_CREATE);
//write a zero score entry, and rewind
IFILE_Write(pIFile, &nZero, sizeof(int));
IFILE_Seek(pIFile, _SEEK_START, 0);
}
//read in our high score if we have one. If not, make the high score 0
IFILE_GetInfo(pIFile, &fileInfo);
if (fileInfo.dwSize == sizeof(int))
{
IFILE_Read(pIFile, &pApp->nHighScore, sizeof(int));
}
else
{
int nTemp = 0;
IFILE_Write(pIFile, &nTemp, sizeof(int));
pApp->nHighScore = 0;
}
//release our file resources
IFILE_Release(pIFile);
IFILEMGR_Release(pIFileMgr);
//get the device info (screen resolution, etc.)
ISHELL_GetDeviceInfo (pMe->m_pIShell, &pApp->di);
//set background color to white
IDISPLAY_SetColor(pApp->a.m_pIDisplay, CLR_USER_BACKGROUND, MAKE_RGB(0xFF, 0xFF, 0xFF));
//clear out our data arrays
MEMSET(pApp->pAllocFlags, 0, sizeof(char) * MAX_IMAGES);
MEMSET(pApp->pBMPImagePtrs, 0, sizeof(int) * MAX_IMAGES);
MEMSET(pApp->pRawImagePtrs, 0, sizeof(int) * MAX_IMAGES);
FlarbOpt_LoadResources(pApp);
FlarbOpt_SetGameMode(pApp, GAME_MODE_MENU);
return(TRUE); break; case EVT_APP_SUSPEND:
FlarbOpt_SuspendGame(pApp);
return(TRUE); break; case EVT_APP_RESUME:
FlarbOpt_ResumeGame(pApp);
return(TRUE); break;
case EVT_KEY_PRESS: //input from keypad
if (pApp->pIMenu != NULL)
{
IMENUCTL_HandleEvent(pApp->pIMenu, EVT_KEY, wParam, 0);
return(TRUE);
}
else if (pApp->pIStatic != NULL)
{
FlarbOpt_SetGameMode(pApp, GAME_MODE_MENU); //go back to the main menu
return(TRUE);
}
else if (pApp->nGameMode == GAME_MODE_PLAY)
FlarbOpt_GameInput(pApp, wParam);
break;
case EVT_COMMAND: //Menu GUI commands
switch(wParam)
{
case MENUID_START:
FlarbOpt_SetGameMode(pApp, GAME_MODE_PLAY);
return(TRUE);
break;
case MENUID_SCORES:
FlarbOpt_SetGameMode(pApp, GAME_MODE_SCORES);
return(TRUE);
break;
case MENUID_QUIT:
ISHELL_CloseApplet(pApp->a.m_pIShell, FALSE);
return(TRUE);
break;
}
break; } return(FALSE);}void FlarbOpt_MoveEnemy(myapp_t* pApp)
{
pApp->sprAlien.nFlags |= SPRITEFLAG_DIRTY;
pApp->sprAlien.nOldX = pApp->sprAlien.nX;
pApp->sprAlien.nOldY = pApp->sprAlien.nY;
pApp->sprAlien.nX += pApp->nSpeed;
//If we've gone off the edge, move the alien down a notch
if (pApp->sprAlien.nX >= (pApp->sprAlien.nWidth + pApp->di.cxScreen))
{
pApp->sprAlien.nX = 0;
pApp->sprAlien.nY += pApp->sprAlien.nHeight;
}
//If the alien has hit the 'bottom' of the screen,then the game is over
if (pApp->sprAlien.nY >= (pApp->di.cyScreen - pApp->sprAlien.nHeight - 10))
{
pApp->bGameOver = TRUE;
if (pApp->nScore > pApp->nHighScore)
{
IFileMgr * pIFileMgr = NULL;
IFile * pIFile = NULL;
//if we have achieved a high score, write it out to the file
ISHELL_CreateInstance(pApp->a.m_pIShell, AEECLSID_FILEMGR,(void **)&pIFileMgr);
pIFile = IFILEMGR_OpenFile(pIFileMgr, "highscore.txt", _OFM_READ);
if (!pIFile)
{
int nErr = IFILEMGR_GetLastError(pIFileMgr);
IFILEMGR_Release(pIFileMgr);
ISHELL_CloseApplet(pApp->a.m_pIShell, FALSE);
}
pApp->nHighScore = pApp->nScore;
IFILE_Write(pIFile, &pApp->nHighScore, sizeof(int));
//release our file resources
IFILEMGR_Release(pIFileMgr);
IFILE_Release(pIFile);
}
}
}
void FlarbOpt_MoveBullet(myapp_t* pApp)
{
pApp->sprBullet.nFlags |= SPRITEFLAG_DIRTY;
pApp->sprBullet.nOldX = pApp->sprBullet.nX;
pApp->sprBullet.nOldY = pApp->sprBullet.nY;
pApp->sprBullet.nY -= 2;
//If the bullet has passed the top of the screen, remove it from play
if (pApp->sprBullet.nY <= 5)
{
FlarbOpt_HideBullet(pApp);
}
}
void FlarbOpt_DoCollision(myapp_t* pApp)
{
//check to see if bullet rectangle intersects space ship
//rectangle
//this is based off of a handy algorithm found at:
//http://www.gamedev.net/reference/articles/article735.asp
short left1, left2;
short right1, right2;
short top1, top2;
short bottom1, bottom2;
left1 = pApp->sprBullet.nX;
left2 = pApp->sprAlien.nX;
right1 = pApp->sprBullet.nX + pApp->sprBullet.nWidth;
right2 = pApp->sprAlien.nX + pApp->sprAlien.nWidth;
top1 = pApp->sprBullet.nY;
top2 = pApp->sprAlien.nY;
bottom1 = pApp->sprBullet.nY + pApp->sprBullet.nHeight;
bottom2 = pApp->sprAlien.nY + pApp->sprAlien.nHeight;
//do we not have a collision?
if (bottom1 < top2)
return;
if (top1 > bottom2)
return;
if (right1 < left2)
return;
if (left1 > right2)
return;
//otherwise, we have a collision!
//incrase our score
pApp->nScore += 100;
//hide the bullet
FlarbOpt_HideBullet(pApp);
//place alien back at the top
pApp->sprAlien.nX = 0;
pApp->sprAlien.nY = pApp->sprAlien.nHeight;
//increase the alien's movement speed
pApp->nSpeed += 2;
if (pApp->nSpeed > MAX_SPEED)
pApp->nSpeed = MAX_SPEED;
}
void FlarbOpt_BuildMainMenu(myapp_t* pApp)
{
//create the menu
ISHELL_CreateInstance(pApp->a.m_pIShell, AEECLSID_MENUCTL, (void **)&pApp->pIMenu);
//set up the menu
IMENUCTL_SetTitle(pApp->pIMenu, RES_FILE, STR_MENUTITLE, NULL);
IMENUCTL_SetRect(pApp->pIMenu, NULL); //full-screen
//Add in our menu items
IMENUCTL_AddItem(pApp->pIMenu, RES_FILE, STR_MENUSTART, MENUID_START, NULL, 0);
IMENUCTL_AddItem(pApp->pIMenu, RES_FILE, STR_MENUSCORES, MENUID_SCORES, NULL, 0);
IMENUCTL_AddItem(pApp->pIMenu, RES_FILE, STR_MENUQUIT, MENUID_QUIT, NULL, 0);
IMENUCTL_SetActive(pApp->pIMenu,TRUE);
}
void FlarbOpt_BuildScoreScreen(myapp_t* pApp)
{
AEERect qrc;
AECHAR szTitle[32];
AECHAR szTempBuf[] = {'%','d','\0'};
FlarbOpt_ClearGUI(pApp);
qrc.x = qrc.y = 0;
qrc.dx = pApp->di.cxScreen;
qrc.dy = pApp->di.cyScreen;
ISHELL_CreateInstance(pApp->a.m_pIShell, AEECLSID_STATIC , (void **)&pApp->pIStatic);
//load title text
ISHELL_LoadResString(pApp->a.m_pIShell, RES_FILE, STR_SCORETITLE, szTitle, sizeof(szTitle));
//convert high score to text
WSPRINTF(pApp->szBuf, (MAX_STRING_LENGTH * sizeof(AECHAR)), szTempBuf, pApp->nHighScore);
ISTATIC_SetRect(pApp->pIStatic, &qrc);
ISTATIC_SetText(pApp->pIStatic, szTitle, pApp->szBuf, AEE_FONT_BOLD, AEE_FONT_NORMAL);
ISTATIC_Redraw(pApp->pIStatic);
IDISPLAY_Update(pApp->a.m_pIDisplay);
}
void FlarbOpt_SuspendGame(myapp_t* pApp)
{
if (pApp->pIMenu)
{
IMENUCTL_SetActive(pApp->pIMenu,FALSE);
}
else if (pApp->pIStatic)
{
ISTATIC_Release(pApp->pIStatic);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -