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

📄 gamedemo.c

📁 brew的一个Demo 供大家参考和学习之用 很不错
💻 C
📖 第 1 页 / 共 4 页
字号:
	}
	IDISPLAY_Update(pMe->pIDisplay);
}

boolean GameDemo_InitAppData(GameDemo* pMe)
{
	int nAscent;       
	int nDescent; 
	pMe->DeviceInfo.wStructSize = sizeof(pMe->DeviceInfo);
	ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->DeviceInfo);
	pMe->pIDisplay = pMe->a.m_pIDisplay;
	pMe->pIShell   = pMe->a.m_pIShell;
	pMe->m_nFontHeight = IDISPLAY_GetFontMetrics(pMe->pIDisplay,AEE_FONT_NORMAL,&nAscent,&nDescent);
	CALLBACK_Init(&pMe->m_cbMainTimer,MainLoop,pMe);
	pMe->m_bVolOn = TRUE;
	PlayBgMedia(pMe);
	return TRUE;
}
void GameDemo_FreeAppData(GameDemo* pMe)
{
	if(pMe->m_pIMedia)
	{
		IMEDIA_Stop(pMe->m_pIMedia);
		IMEDIA_RegisterNotify(pMe->m_pIMedia,NULL,NULL);
		IMEDIA_Release(pMe->m_pIMedia);
	}
	MainGameFree(pMe);
}

void DrawTextById(GameDemo *pMe,int16 nResID,int x,int y,RGBVAL rgb)
{
	uint32 bufferSize; 
	AECHAR *pText;
	ISHELL_GetResSize(pMe->pIShell,RES_FILE,nResID,RESTYPE_STRING,&bufferSize);
	pText =(AECHAR*)MALLOC(bufferSize);
	ISHELL_LoadResString(pMe->pIShell,RES_FILE,nResID,pText,bufferSize);
	DrawTextByBuffer(pMe,pText,x,y,rgb);
	FREE(pText);
}

void DrawTextByBuffer(GameDemo *pMe,const AECHAR *pText,int x,int y,RGBVAL rgb)
{
	IDISPLAY_SetColor(pMe->pIDisplay,CLR_USER_TEXT,rgb);
	IDISPLAY_DrawText(pMe->pIDisplay,
		AEE_FONT_NORMAL,
		pText,
		-1,
		x,
		y,
		NULL,
		IDF_TEXT_TRANSPARENT);
}
void DrawTextCenterById(GameDemo *pMe,int16 nResID,int y,RGBVAL rgb)
{
	uint32 bufferSize; 
	AECHAR *pText;
	ISHELL_GetResSize(pMe->pIShell,RES_FILE,nResID,RESTYPE_STRING,&bufferSize);
	pText =(AECHAR*)MALLOC(bufferSize);
	ISHELL_LoadResString(pMe->pIShell,RES_FILE,nResID,pText,bufferSize);
	DrawTextCenterByBuffer(pMe,pText,y,rgb);
	FREE(pText);
}
void DrawTextCenterByBuffer(GameDemo *pMe,const AECHAR *pText,int y,RGBVAL rgb)
{
	int width = IDISPLAY_MeasureText(pMe->pIDisplay,AEE_FONT_NORMAL,pText);
	DrawTextByBuffer(pMe,pText,(pMe->DeviceInfo.cxScreen-width)/2,y,rgb);
}

boolean MainMenuHandleEvent(GameDemo* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
	switch(eCode)
	{
	case EVT_KEY:
		if(wParam==AVK_CLR)
		{
			return FALSE;
		}
		break;
	case EVT_KEY_PRESS:
		switch(wParam)
		{
		case AVK_UP:
		case AVK_2:
			if(!(pMe->m_Menu.m_iKeyState&KEY_UP)&&!(pMe->m_Menu.m_iKeyState&KEY_UP_MASK))
			{
				pMe->m_Menu.m_iKeyState |= (KEY_UP|KEY_UP_MASK);
			}
			return TRUE;
		case AVK_DOWN:
		case AVK_8:
			if(!(pMe->m_Menu.m_iKeyState&KEY_DOWN)&&!(pMe->m_Menu.m_iKeyState&KEY_DOWN_MASK))
			{
				pMe->m_Menu.m_iKeyState |= (KEY_DOWN|KEY_DOWN_MASK);
			}
			return TRUE;
		case AVK_SELECT:
		case AVK_5:
			if(!(pMe->m_Menu.m_iKeyState&KEY_OK)&&!(pMe->m_Menu.m_iKeyState&KEY_OK_MASK))
			{
				pMe->m_Menu.m_iKeyState |= (KEY_OK|KEY_OK_MASK);
			}
			return TRUE;
		}
		break;
	case EVT_KEY_RELEASE:
		switch(wParam)
		{
		case AVK_UP:
		case AVK_2:
			pMe->m_Menu.m_iKeyState &=~KEY_UP;
			return TRUE;
		case AVK_DOWN:
		case AVK_8:
			pMe->m_Menu.m_iKeyState &=~KEY_DOWN;
			return TRUE;
		case AVK_SELECT:
		case AVK_5:
			pMe->m_Menu.m_iKeyState &=~KEY_OK;
			return TRUE;
		}
		break;
	}
	return FALSE;
}
boolean MainGameHandleEvent(GameDemo* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
	switch(eCode)
	{
	case EVT_KEY:
		switch(wParam)
		{
		case AVK_CLR:
			pMe->m_State = enMainMenu;
			MainGameFree(pMe);
			MainMenuInit(pMe);
			return TRUE;
		case AVK_POUND:
			pMe->m_bIsSave = TRUE;
			break;
		}
		break;
	case EVT_KEY_PRESS:
		switch(wParam)
		{
		case AVK_UP:
		case AVK_2:
			if(!(pMe->m_Game.m_MainSprite.m_iKeyState&KEY_UP)&&!(pMe->m_Game.m_MainSprite.m_iKeyState&KEY_UP_MASK))
			{
				pMe->m_Game.m_MainSprite.m_iKeyState |= (KEY_UP|KEY_UP_MASK);
				pMe->m_Game.m_MainSprite.dy -= 15;
			}
			return TRUE;
		case AVK_DOWN:
		case AVK_8:
			if(!(pMe->m_Game.m_MainSprite.m_iKeyState&KEY_DOWN)&&!(pMe->m_Game.m_MainSprite.m_iKeyState&KEY_DOWN_MASK))
			{
				pMe->m_Game.m_MainSprite.m_iKeyState |= (KEY_DOWN|KEY_DOWN_MASK);
			}
			return TRUE;
		case AVK_SELECT:
		case AVK_5:
			if(!(pMe->m_Game.m_MainSprite.m_iKeyState&KEY_OK)&&!(pMe->m_Game.m_MainSprite.m_iKeyState&KEY_OK_MASK))
			{
				pMe->m_Game.m_MainSprite.m_iKeyState |= (KEY_OK|KEY_OK_MASK);
			}
			return TRUE;
		case AVK_LEFT:
		case AVK_4:
			pMe->m_Game.m_MainSprite.m_iKeyState |= KEY_LEFT;
			return TRUE;
		case AVK_RIGHT:
		case AVK_6:
			pMe->m_Game.m_MainSprite.m_iKeyState |= KEY_RIGHT;
			return TRUE;
		}
		break;
	case EVT_KEY_RELEASE:
		switch(wParam)
		{
		case AVK_UP:
		case AVK_2:
			pMe->m_Game.m_MainSprite.m_iKeyState &=~KEY_UP;
			return TRUE;
		case AVK_DOWN:
		case AVK_8:
			pMe->m_Game.m_MainSprite.m_iKeyState &=~KEY_DOWN;
			return TRUE;
		case AVK_SELECT:
		case AVK_5:
			pMe->m_Game.m_MainSprite.m_iKeyState &=~KEY_OK;
			return TRUE;
		case AVK_LEFT:
		case AVK_4:
			pMe->m_Game.m_MainSprite.m_iKeyState &= ~KEY_LEFT;
			return TRUE;
		case AVK_RIGHT:
		case AVK_6:
			pMe->m_Game.m_MainSprite.m_iKeyState &= ~KEY_RIGHT;
			return TRUE;
		}
		break;
	}
	return FALSE;
}

void MainMenuAction(GameDemo *pMe)
{
	switch(pMe->m_Menu.m_State)
	{
	case enMenuMain:
		{
			if(pMe->m_Menu.m_iKeyState&KEY_UP_MASK)
			{
				pMe->m_Menu.m_iKeyState &=~KEY_UP_MASK;
				pMe->m_Menu.m_bUpdate = TRUE;
				if(pMe->m_Menu.m_nWhichActive>0)
				{
					--pMe->m_Menu.m_nWhichActive;
				}
				else
				{
					pMe->m_Menu.m_nWhichActive = 4;
				}
			}
			else if(pMe->m_Menu.m_iKeyState&KEY_DOWN_MASK)
			{
				pMe->m_Menu.m_iKeyState &=~KEY_DOWN_MASK;
				pMe->m_Menu.m_bUpdate = TRUE;
				if(pMe->m_Menu.m_nWhichActive<4)
				{
					++pMe->m_Menu.m_nWhichActive;
				}
				else
				{
					pMe->m_Menu.m_nWhichActive = 0;
				}
			}
			else if(pMe->m_Menu.m_iKeyState&KEY_OK_MASK)
			{
				pMe->m_Menu.m_iKeyState &=~KEY_OK_MASK;
				pMe->m_Menu.m_bUpdate = TRUE;
				switch(pMe->m_Menu.m_nWhichActive)
				{
				case 0:
					pMe->m_State = enMainGame;
					MainGameInit(pMe);
					if(pMe->m_pIMedia)
					{
						IMEDIA_Stop(pMe->m_pIMedia);
						IMEDIA_RegisterNotify(pMe->m_pIMedia,NULL,NULL);
						IMEDIA_Release(pMe->m_pIMedia);
						pMe->m_pIMedia = NULL;
					}
					break;
				case 1:
					pMe->m_State = enMainGame;
					MainGameInit(pMe);
					LoadSaveData(pMe);
					if(pMe->m_pIMedia)
					{
						IMEDIA_Stop(pMe->m_pIMedia);
						IMEDIA_RegisterNotify(pMe->m_pIMedia,NULL,NULL);
						IMEDIA_Release(pMe->m_pIMedia);
						pMe->m_pIMedia = NULL;
					}
					break;
				case 2:
					break;
				case 3:
					pMe->m_bVolOn = !pMe->m_bVolOn;
					if(pMe->m_bVolOn)
					{
						PlayBgMedia(pMe);
					}
					else
					{
						pMe->m_bIsContinue = FALSE;
						if(pMe->m_pIMedia)
						{
							IMEDIA_Stop(pMe->m_pIMedia);
							IMEDIA_RegisterNotify(pMe->m_pIMedia,NULL,NULL);
							IMEDIA_Release(pMe->m_pIMedia);
							pMe->m_pIMedia = NULL;
						}
					}
					break;
				case 4:
					break;
				}
			}
		}
		break;
	case enMenuHelp:
		break;
	}
}

void MainGameAction(GameDemo *pMe)
{
	int i;
	EnemyAction(pMe,pMe->m_Game.m_MoveSprites,6,2);
	CheckBulletEnemyCollision(pMe);
	CheckMainSpriteEnemyCollision(pMe);
	pMe->m_Game.m_MainSprite.dy += 2;
	CheckTileCollisionVertical(pMe);
	pMe->m_Game.m_MainSprite.m_sprite[0].y += pMe->m_Game.m_MainSprite.dy;

	if(pMe->m_Game.m_MainSprite.m_sprite[0].y + pMe->m_Game.m_MidMap.m_nY < 0)
	{
		pMe->m_Game.m_MainSprite.m_sprite[0].y = 0;
		pMe->m_Game.m_MainSprite.dy = 0;
	}
	if (pMe->m_Game.m_MainSprite.m_sprite[0].y <= pMe->DeviceInfo.cyScreen / 4
		||((pMe->m_Game.m_MidMap.m_nY !=pMe->m_Game.m_MidMap.m_nTileSize * pMe->m_Game.m_MidMap.m_nHeight-pMe->DeviceInfo.cyScreen)
		&& pMe->m_Game.m_MainSprite.m_sprite[0].y >= pMe->DeviceInfo.cyScreen / 4)
		)
	{
		pMe->m_Game.bgdy = (pMe->DeviceInfo.cyScreen / 4 - pMe->m_Game.m_MainSprite.m_sprite[0].y)/4;
		if (pMe->m_Game.bgdy == 0 && pMe->DeviceInfo.cyScreen / 4 - pMe->m_Game.m_MainSprite.m_sprite[0].y > 0)
		{
			pMe->m_Game.bgdy = pMe->DeviceInfo.cyScreen / 4 - pMe->m_Game.m_MainSprite.m_sprite[0].y > 0 ? 1 : -1;
		}
		if (pMe->m_Game.bgdy -pMe->m_Game.m_MidMap.m_nY <
			pMe->DeviceInfo.cyScreen -
			pMe->m_Game.m_MidMap.m_nTileSize * pMe->m_Game.m_MidMap.m_nHeight)
		{
			pMe->m_Game.bgdy = pMe->DeviceInfo.cyScreen -
				pMe->m_Game.m_MidMap.m_nTileSize * pMe->m_Game.m_MidMap.m_nHeight + pMe->m_Game.m_MidMap.m_nY;
		}
		if((pMe->m_Game.m_MidMap.m_nY <= 0) && pMe->m_Game.m_MainSprite.m_sprite[0].y < pMe->DeviceInfo.cyScreen / 4)
		{
			pMe->m_Game.m_MidMap.m_nY = 0;
			pMe->m_Game.bgdy = 0;
		}
	}
	else
	{
		pMe->m_Game.bgdy = 0;
	}

	if(pMe->m_Game.m_MainSprite.m_iKeyState&KEY_LEFT)
	{
		pMe->m_Game.m_MainSprite.m_bIsLeft = TRUE;
		if(!CheckTileCollisionHorizon(pMe))
		{
			pMe->m_Game.m_MainSprite.m_sprite[0].x -= MOVESPEED;	
		}
	}
	else if(pMe->m_Game.m_MainSprite.m_iKeyState&KEY_RIGHT)
	{
		pMe->m_Game.m_MainSprite.m_bIsLeft = FALSE;
		if(!CheckTileCollisionHorizon(pMe))
		{
			pMe->m_Game.m_MainSprite.m_sprite[0].x += MOVESPEED;
		}
	}
	if(pMe->m_Game.m_MainSprite.m_iKeyState&KEY_OK_MASK)
	{
		for(i=0;i<3;i++)
		{
			if(pMe->m_Game.m_StaticSprites[i].unLayer==SPRITE_LAYER_HIDDEN)
			{
				SpriteInit8(pMe->m_Game.m_StaticSprites,i,pMe->m_Game.m_MainSprite.m_sprite[0].x,pMe->m_Game.m_MainSprite.m_sprite[0].y+5,0,SPRITE_LAYER_1);
				break;
			}
		}
	}
	if (pMe->m_Game.m_MainSprite.m_sprite[0].x != pMe->DeviceInfo.cxScreen / 4)
	{
		pMe->m_Game.bgdx =  pMe->DeviceInfo.cxScreen / 4 - pMe->m_Game.m_MainSprite.m_sprite[0].x;
	}
	else
	{
		pMe->m_Game.bgdx = 0;
	}
	if(pMe->m_Game.m_MidMap.m_nX-pMe->m_Game.bgdx<0
		||pMe->m_Game.m_MidMap.m_nX-pMe->m_Game.bgdx>
		pMe->m_Game.m_MidMap.m_nTileSize*pMe->m_Game.m_MidMap.m_nWidth-pMe->DeviceInfo.cxScreen)
	{
		pMe->m_Game.bgdx=0;
	}

	//金币动作
	for(i=0;i<3;i++)
	{
		pMe->m_Game.m_MoveSpriteProp[0].cnt=++pMe->m_Game.m_MoveSpriteProp[0].cnt%4;
		pMe->m_Game.m_MoveSprites[i].unSpriteIndex = pMe->m_Game.m_MoveSpriteProp[0].cnt;
	}
	for(i=0;i<3;i++)
	{
		if(pMe->m_Game.m_StaticSprites[i].unLayer!=SPRITE_LAYER_HIDDEN)
		{
			//运动轨迹
			pMe->m_Game.m_StaticSprites[i].x+=BULLETSPEED;
			if(pMe->m_Game.m_StaticSprites[i].x>pMe->DeviceInfo.cxScreen)
			{
				pMe->m_Game.m_StaticSprites[i].unLayer = SPRITE_LAYER_HIDDEN;
			}
		}
	}

	pMe->m_Game.m_MainSprite.m_sprite[0].x += pMe->m_Game.bgdx;
	pMe->m_Game.m_MainSprite.m_sprite[0].y += pMe->m_Game.bgdy;
	pMe->m_Game.m_MidMap.m_nX -=pMe->m_Game.bgdx;
	pMe->m_Game.m_MidMap.m_nY -=pMe->m_Game.bgdy;
	pMe->m_Game.m_Maps[0].y += pMe->m_Game.bgdy;

	//其它的偏移
	for(i=0;i<sizeof(pMe->m_Game.m_MoveSprites)/sizeof(AEESpriteCmd);i++)
	{
		pMe->m_Game.m_MoveSprites[i].x += pMe->m_Game.bgdx;
		pMe->m_Game.m_MoveSprites[i].y += pMe->m_Game.bgdy;
	}
	//修正坐标

⌨️ 快捷键说明

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