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

📄 flarbopt.c

📁 BREW Shot Game of Flarbs Source Code.
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -