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

📄 gamedemo.c

📁 brew的一个Demo 供大家参考和学习之用 很不错
💻 C
📖 第 1 页 / 共 4 页
字号:
	if(pMe->m_Game.m_MidMap.m_nY<0)
	{
		pMe->m_Game.m_MainSprite.m_sprite[0].y += -pMe->m_Game.m_MidMap.m_nY;
		pMe->m_Game.bgdy = pMe->m_Game.bgdy+pMe->m_Game.m_MidMap.m_nY;
		pMe->m_Game.m_MidMap.m_nY = 0;
		pMe->m_Game.m_Maps[0].y = 0;				
	}
	if(pMe->m_Game.m_MainSprite.m_bIsLeft)
	{
		//pMe->m_Game.m_MainSprite.offset = 5;
		pMe->m_Game.m_MainSprite.offset = 0;
		pMe->m_Game.m_MainSprite.m_sprite[0].unTransform = SPRITE_FLIP_Y;
	}
	else
	{
		pMe->m_Game.m_MainSprite.offset = 0;
		pMe->m_Game.m_MainSprite.m_sprite[0].unTransform = 0;
	}

	if (pMe->m_Game.m_MainSprite.m_sprite[0].x < 0)
	{
		pMe->m_Game.m_MainSprite.m_sprite[0].x = 0;
	}
	if (pMe->m_Game.m_MainSprite.m_sprite[0].x >= pMe->DeviceInfo.cxScreen - 32)
	{
		pMe->m_Game.m_MainSprite.m_sprite[0].x = pMe->DeviceInfo.cxScreen - 32;
	}
	
	if(pMe->m_Game.m_MainSprite.m_iKeyState&KEY_OK_MASK)
	{
		pMe->m_Game.m_MainSprite.m_iKeyState&=~KEY_OK_MASK;
		pMe->m_Game.m_MainSprite.m_sprite[0].unSpriteIndex = pMe->m_Game.m_MainSprite.offset+1;
	}
	else if(pMe->m_Game.m_MainSprite.dy!=0)
	{
		pMe->m_Game.m_MainSprite.m_sprite[0].unSpriteIndex = 4+pMe->m_Game.m_MainSprite.offset;
	}
	else if(pMe->m_Game.m_MainSprite.m_iKeyState&KEY_LEFT
		||pMe->m_Game.m_MainSprite.m_iKeyState&KEY_RIGHT)
	{
		pMe->m_Game.m_MainSprite.m_sprite[0].unSpriteIndex++;
		if (pMe->m_Game.m_MainSprite.m_sprite[0].unSpriteIndex > 3 + pMe->m_Game.m_MainSprite.offset
			|| pMe->m_Game.m_MainSprite.m_sprite[0].unSpriteIndex < 1 + pMe->m_Game.m_MainSprite.offset)
		{
			pMe->m_Game.m_MainSprite.m_sprite[0].unSpriteIndex = 1 +  pMe->m_Game.m_MainSprite.offset;
		}
	}
	else
	{
		pMe->m_Game.m_MainSprite.m_sprite[0].unSpriteIndex = pMe->m_Game.m_MainSprite.offset;
	}
	if(pMe->m_bIsSave)
	{
		pMe->m_bIsSave = FALSE;
		SaveCurrentData(pMe);
	}
}

void MainMenuInit(GameDemo *pMe)
{
	pMe->m_Menu.m_iKeyState = 0;
	pMe->m_Menu.m_bUpdate = TRUE;
	pMe->m_Menu.m_State = enMenuMain;
}
void MainMenuUpdate(GameDemo *pMe)
{
	if(pMe->m_Menu.m_bUpdate)
	{
		int offset = (pMe->DeviceInfo.cyScreen-4*pMe->m_nFontHeight)/2;
		int dx = (pMe->DeviceInfo.cxScreen-6*pMe->m_nFontHeight)/2;
		AEERect rect;
		rect.x = 0;
		rect.y = 0;
		rect.dx = pMe->DeviceInfo.cxScreen;
		rect.dy = pMe->DeviceInfo.cyScreen;
		IDISPLAY_FillRect(pMe->pIDisplay,&rect,MAKE_RGB(255,255,255));
		pMe->m_Menu.m_bUpdate = FALSE;
		DrawTextCenterById(pMe,IDS_MENU_BEGIN,offset,MAKE_RGB(0,0,0));
		DrawTextCenterById(pMe,IDS_MENU_LOAD,offset+1*pMe->m_nFontHeight,MAKE_RGB(0,0,0));
		DrawTextCenterById(pMe,IDS_MENU_HELP,offset+2*pMe->m_nFontHeight,MAKE_RGB(0,0,0));
		if(pMe->m_bVolOn)
		{
			DrawTextCenterById(pMe,IDS_MENU_VOL_ON,offset+3*pMe->m_nFontHeight,MAKE_RGB(0,0,0));
		}
		else
		{
			DrawTextCenterById(pMe,IDS_MENU_VOL_OFF,offset+3*pMe->m_nFontHeight,MAKE_RGB(0,0,0));
		}
		DrawTextCenterById(pMe,IDS_MENU_EXIT,offset+4*pMe->m_nFontHeight,MAKE_RGB(0,0,0));
		DrawTextById(pMe,IDS_MENU_SELECT,dx,offset+pMe->m_Menu.m_nWhichActive*pMe->m_nFontHeight,MAKE_RGB(0,0,0));
	}
}
void MainGameLoadResource(GameDemo *pMe)
{
	IBitmap *pbmScreen = NULL;
	IBitmap *pbmDdb;
	IBitmap *pbmDib = NULL;
	NativeColor color;
	AEEBitmapInfo bi;
	pbmScreen = IDISPLAY_GetDestination(pMe->pIDisplay);
	ISHELL_CreateInstance(pMe->pIShell,AEECLSID_SPRITE,(void**)&pMe->m_Game.m_pISprite);

	pbmDib = ISHELL_LoadBitmap(pMe->pIShell,"map1.bmp");
	IBITMAP_GetInfo(pbmDib, &bi, sizeof(bi));
	IBITMAP_CreateCompatibleBitmap(pbmScreen, &pbmDdb, (uint16)bi.cx, (uint16)bi.cy);
	IBITMAP_BltIn(pbmDdb, 0, 0, (uint16)bi.cx, (uint16)bi.cy, pbmDib, 0, 0, AEE_RO_COPY);
	IBITMAP_Release(pbmDib);
	IBITMAP_GetPixel(pbmDdb, 0, 0, &color);
	IBITMAP_SetTransparencyColor(pbmDdb, color);
	ISPRITE_SetTileBuffer(pMe->m_Game.m_pISprite,TILE_SIZE_32X32,pbmDdb);
	IBITMAP_Release(pbmDdb);

	pbmDib = ISHELL_LoadBitmap(pMe->pIShell,"sprite8.bmp");
	IBITMAP_GetInfo(pbmDib, &bi, sizeof(bi));
	IBITMAP_CreateCompatibleBitmap(pbmScreen, &pbmDdb, (uint16)bi.cx, (uint16)bi.cy);
	IBITMAP_BltIn(pbmDdb, 0, 0, (uint16)bi.cx, (uint16)bi.cy, pbmDib, 0, 0, AEE_RO_COPY);
	IBITMAP_Release(pbmDib);
	IBITMAP_GetPixel(pbmDdb, 0, 0, &color);
	IBITMAP_SetTransparencyColor(pbmDdb, color);
	ISPRITE_SetSpriteBuffer(pMe->m_Game.m_pISprite,SPRITE_SIZE_8X8,pbmDdb);
	IBITMAP_Release(pbmDdb);

	pbmDib = ISHELL_LoadBitmap(pMe->pIShell,"sprite32.bmp");
	IBITMAP_GetInfo(pbmDib, &bi, sizeof(bi));
	IBITMAP_CreateCompatibleBitmap(pbmScreen, &pbmDdb, (uint16)bi.cx, (uint16)bi.cy);
	IBITMAP_BltIn(pbmDdb, 0, 0, (uint16)bi.cx, (uint16)bi.cy, pbmDib, 0, 0, AEE_RO_COPY);
	IBITMAP_Release(pbmDib);
	IBITMAP_GetPixel(pbmDdb, 0, 0, &color);
	IBITMAP_SetTransparencyColor(pbmDdb, color);
	ISPRITE_SetSpriteBuffer(pMe->m_Game.m_pISprite,SPRITE_SIZE_32X32,pbmDdb);
	IBITMAP_Release(pbmDdb);

	ISPRITE_SetDestination(pMe->m_Game.m_pISprite,pbmScreen);


	ISHELL_CreateInstance(pMe->pIShell,AEECLSID_SPRITE,(void**)&(pMe->m_Game.m_MainSprite.m_pISprite));
	pbmDib = ISHELL_LoadBitmap(pMe->pIShell,"main32.bmp");
	IBITMAP_GetInfo(pbmDib, &bi, sizeof(bi));
	IBITMAP_CreateCompatibleBitmap(pbmScreen, &pbmDdb, (uint16)bi.cx, (uint16)bi.cy);
	IBITMAP_BltIn(pbmDdb, 0, 0, (uint16)bi.cx, (uint16)bi.cy, pbmDib, 0, 0, AEE_RO_COPY);
	IBITMAP_Release(pbmDib);
	pbmDib = NULL;
	IBITMAP_GetPixel(pbmDdb, 0, 0, &color);
	IBITMAP_SetTransparencyColor(pbmDdb, color);
	ISPRITE_SetSpriteBuffer(pMe->m_Game.m_MainSprite.m_pISprite,SPRITE_SIZE_32X32,pbmDdb);
	IBITMAP_Release(pbmDdb);
	ISPRITE_SetDestination(pMe->m_Game.m_MainSprite.m_pISprite,pbmScreen);

	pbmDib = ISHELL_LoadBitmap(pMe->pIShell,"map2.bmp");
	IBITMAP_GetInfo(pbmDib, &bi, sizeof(bi));
	IBITMAP_CreateCompatibleBitmap(pbmScreen, &pMe->m_Game.m_MidMap.m_pIBmp, (uint16)bi.cx, (uint16)bi.cy);
	IBITMAP_BltIn(pMe->m_Game.m_MidMap.m_pIBmp, 0, 0, (uint16)bi.cx, (uint16)bi.cy, pbmDib, 0, 0, AEE_RO_COPY);
	IBITMAP_Release(pbmDib);
	IBITMAP_GetPixel(pMe->m_Game.m_MidMap.m_pIBmp, 0, 0, &color);
	IBITMAP_SetTransparencyColor(pMe->m_Game.m_MidMap.m_pIBmp, color);


	IBITMAP_Release(pbmScreen);
}

void SpriteInit8(AEESpriteCmd *pSprites,int index,int16 x,int16 y,int spriteIndex,uint8 unLayer)
{
	pSprites[index].unSpriteIndex = spriteIndex;
	pSprites[index].unSpriteSize = SPRITE_SIZE_8X8;
	pSprites[index].unComposite = COMPOSITE_KEYCOLOR;
	pSprites[index].unLayer = unLayer;
	pSprites[index].x = x;
	pSprites[index].y = y;
}
void SpriteInit16(AEESpriteCmd *pSprites,int index,int16 x,int16 y,int spriteIndex,uint8 unLayer)
{
	pSprites[index].unSpriteIndex = spriteIndex;
	pSprites[index].unSpriteSize = SPRITE_SIZE_16X16;
	pSprites[index].unComposite = COMPOSITE_KEYCOLOR;
	pSprites[index].unLayer = unLayer;
	pSprites[index].x = x;
	pSprites[index].y = y;
}
void SpriteInit32(AEESpriteCmd *pSprites,int index,int16 x,int16 y,int spriteIndex,uint8 unLayer)
{
	pSprites[index].unSpriteIndex = spriteIndex;
	pSprites[index].unSpriteSize = SPRITE_SIZE_32X32;
	pSprites[index].unComposite = COMPOSITE_KEYCOLOR;
	pSprites[index].unLayer = unLayer;
	pSprites[index].x = x;
	pSprites[index].y = y;
}

void InitGameOffset(GameDemo *pMe)
{
	int i;
	for(i=0;i<sizeof(pMe->m_Game.m_MoveSprites)/sizeof(AEESpriteCmd);i++)
	{
		pMe->m_Game.m_MoveSprites[i].x -= pMe->m_Game.m_MidMap.m_nX;
		pMe->m_Game.m_MoveSprites[i].y -= pMe->m_Game.m_MidMap.m_nY;
	}
}
void MainGameDataInit(GameDemo *pMe)
{
	pMe->m_Game.m_Maps[0].pMapArray = (uint16*)game_map_1;
	pMe->m_Game.m_Maps[0].unTileSize = TILE_SIZE_32X32;
	pMe->m_Game.m_Maps[0].unFlags= MAP_FLAG_WRAP;
	pMe->m_Game.m_Maps[0].x = 0;
	pMe->m_Game.m_Maps[0].y= pMe->DeviceInfo.cyScreen-256;
	pMe->m_Game.m_Maps[0].w = MAP_SIZE_8;
	pMe->m_Game.m_Maps[0].h = MAP_SIZE_8;
	pMe->m_Game.m_Maps[1].pMapArray = NULL;

	pMe->m_Game.m_MidMap.m_pMapArray = (uint16*)game_map_2;
	pMe->m_Game.m_MidMap.m_nHeight = 17;
	pMe->m_Game.m_MidMap.m_nWidth = 128;
	pMe->m_Game.m_MidMap.m_nTileSize = 16;
	pMe->m_Game.m_MidMap.m_nX = 0;
	pMe->m_Game.m_MidMap.m_nY = 17*16-pMe->DeviceInfo.cyScreen;

	pMe->m_Game.m_MainSprite.m_sprite[0].unComposite = COMPOSITE_KEYCOLOR;
	pMe->m_Game.m_MainSprite.m_sprite[0].unLayer = SPRITE_LAYER_0;
	pMe->m_Game.m_MainSprite.m_sprite[0].unSpriteSize = SPRITE_SIZE_32X32;
	pMe->m_Game.m_MainSprite.m_sprite[0].unSpriteIndex = 0;
	pMe->m_Game.m_MainSprite.m_sprite[0].x = 0;
	pMe->m_Game.m_MainSprite.m_sprite[0].y = 0;

	pMe->m_Game.m_MainSprite.m_sprite[1].unSpriteSize = SPRITE_SIZE_END;

	//金币
	SpriteInit8(pMe->m_Game.m_MoveSprites,0,16*5,16*11,0,SPRITE_LAYER_0);
	SpriteInit8(pMe->m_Game.m_MoveSprites,1,16*20,16*9,0,SPRITE_LAYER_0);
	SpriteInit8(pMe->m_Game.m_MoveSprites,2,16*15,16*10,0,SPRITE_LAYER_0);

	//血
	SpriteInit8(pMe->m_Game.m_MoveSprites,3,16*10,16*11,5,SPRITE_LAYER_0);
	SpriteInit8(pMe->m_Game.m_MoveSprites,4,16*25,16*9,5,SPRITE_LAYER_0);

	//敌人
	SpriteInit32(pMe->m_Game.m_MoveSprites,6,16*3,16*12,0,SPRITE_LAYER_0);
	pMe->m_Game.m_MoveSpriteProp[6].originX = 16*3;
	pMe->m_Game.m_MoveSpriteProp[6].interval = 40;
	pMe->m_Game.m_MoveSpriteProp[6].isLeft = TRUE;
	pMe->m_Game.m_MoveSpriteProp[6].offset = 0;

	SpriteInit32(pMe->m_Game.m_MoveSprites,7,16*23,16*12,0,SPRITE_LAYER_0);
	pMe->m_Game.m_MoveSpriteProp[7].originX = 16*23;
	pMe->m_Game.m_MoveSpriteProp[7].interval = 80;
	pMe->m_Game.m_MoveSpriteProp[7].isLeft = TRUE;
	pMe->m_Game.m_MoveSpriteProp[7].offset = 0;

	pMe->m_Game.m_MoveSprites[8].unSpriteSize = SPRITE_SIZE_END;

	//子弹
	SpriteInit8(pMe->m_Game.m_StaticSprites,0,16*5,16*11,4,SPRITE_LAYER_HIDDEN);
	SpriteInit8(pMe->m_Game.m_StaticSprites,1,16*20,16*9,4,SPRITE_LAYER_HIDDEN);
	SpriteInit8(pMe->m_Game.m_StaticSprites,2,16*15,16*10,4,SPRITE_LAYER_HIDDEN);

	//血图标
	SpriteInit8(pMe->m_Game.m_StaticSprites,3,0,0,5,SPRITE_LAYER_1);
	SpriteInit8(pMe->m_Game.m_StaticSprites,4,8,0,5,SPRITE_LAYER_1);
	SpriteInit8(pMe->m_Game.m_StaticSprites,5,8*2,0,5,SPRITE_LAYER_1);
	pMe->m_Game.m_StaticSprites[6].unSpriteSize = SPRITE_SIZE_END;

	


	InitGameOffset(pMe);
}
void MainGameInit(GameDemo *pMe)
{
	MainGameLoadResource(pMe);
	MainGameDataInit(pMe);
}

void MainGameFree(GameDemo *pMe)
{
	if(pMe->m_Game.m_pISprite)
	{
		ISPRITE_Release(pMe->m_Game.m_pISprite);
		pMe->m_Game.m_pISprite = NULL;
	}
	if(pMe->m_Game.m_MainSprite.m_pISprite)
	{
		ISPRITE_Release(pMe->m_Game.m_MainSprite.m_pISprite);
		pMe->m_Game.m_MainSprite.m_pISprite = NULL;
	}
	if(pMe->m_Game.m_MidMap.m_pIBmp)
	{
		IBITMAP_Release(pMe->m_Game.m_MidMap.m_pIBmp);
		pMe->m_Game.m_MidMap.m_pIBmp = NULL;
	}
}

void MainGameUpdate(GameDemo *pMe)
{
	ISPRITE_DrawTiles(pMe->m_Game.m_pISprite,pMe->m_Game.m_Maps);
	MainAppDrawMidMap(pMe,&pMe->m_Game.m_MidMap,TRUE);
	ISPRITE_DrawSprites(pMe->m_Game.m_pISprite,pMe->m_Game.m_MoveSprites);
	ISPRITE_DrawSprites(pMe->m_Game.m_pISprite,pMe->m_Game.m_StaticSprites);
	ISPRITE_DrawSprites(pMe->m_Game.m_MainSprite.m_pISprite,pMe->m_Game.m_MainSprite.m_sprite);
}

static void MainAppDrawMidMap(GameDemo *pMe,Map *pMidMap,boolean isTransparent)
{
	int beginX = 0;
	int beginY = 0;
	int nX;
	int nY;
	int tempY;
	int tempX;
	int arrayNum;

	nX=pMidMap->m_nX%pMidMap->m_nTileSize;
	nY=pMidMap->m_nY%pMidMap->m_nTileSize;

	while(TRUE)
	{
		while(TRUE)
		{
			tempY=((beginY+pMidMap->m_nY)/pMidMap->m_nTileSize)%pMidMap->m_nHeight;
			tempX=((beginX+pMidMap->m_nX)/pMidMap->m_nTileSize)%pMidMap->m_nWidth;
			arrayNum=	pMidMap->m_pMapArray[tempX+tempY*pMidMap->m_nWidth]&(0x00FF);
			if(arrayNum!=0xff)
			{
				if(isTransparent)
				{
					IDISPLAY_BitBlt(pMe->pIDisplay,
						beginX-nX,beginY-nY,
						pMidMap->m_nTileSize,pMidMap->m_nTileSize,
						pMidMap->m_pIBmp,
						0,pMidMap->m_nTileSize*arrayNum,
						AEE_RO_TRANSPARENT);
				}
				else
				{
					IDISPLAY_BitBlt(pMe->pIDisplay,
						beginX-nX,beginY-nY,
						pMidMap->m_nTileSize,pMidMap->m_nTileSize,
						pMidMap->m_pIBmp,
						0,pMidMap->m_nTileSize*arrayNum,
						AEE_RO_COPY);
				}

			}
			if(beginX<pMe->DeviceInfo.cxScreen)
			{
				beginX+=pMidMap->m_nTileSize;
			}
			else
			{
				break;
			}
		}
		if(beginY<pMe->DeviceInfo.cyScreen)
		{
			beginY+=pMidMap->m_nTileSize;
			beginX=0;
		}
		else
		{
			break;
		}
	}
}

void CheckTileCollisionVertical(GameDemo *pMe)
{
	int x = pMe->m_Game.m_MainSprite.m_sprite[0].x;
	int y = pMe->m_Game.m_MainSprite.m_sprite[0].y;
	int dy = pMe->m_Game.m_MainSprite.dy;
	int i;
	int xTile1;
	int xTile2;
	Map *pMap = &pMe->m_Game.m_MidMap;
	if (dy > 0)
	{
		for ( i = (y + pMap->m_nY+15) /
			pMap->m_nTileSize + 2;
			i <= (y + pMap->m_nY + dy) / pMap->m_nTileSize + 2; i++)
		{
			xTile1 = (x + pMap->m_nX + 12) / pMap->m_nTileSize;
			xTile2 = (x + pMap->m_nX + 20) /pMap->m_nTileSize;
			if (i < 0 || i > pMap->m_nHeight - 1)
			{
				continue;
			}
			if (xTile2 > pMap->m_nWidth - 1 || xTile1 < 0)
			{
				return ;
			}
			if(((pMap->m_pMapArray[xTile1+i*pMap->m_nWidth]>>8)&0x02)==0x02)
			{
				pMe->m_Game.m_MainSprite.dy=(i-2)*pMap->m_nTileSize-(y+pMap->m_nY);	
				pMe->m_Game.m_MainSprite.m_iKeyState &=~KEY_UP_MASK;
				break;
			}
			if(((pMap->m_pMapArray[xTile2+i*pMap->m_nWidth]>>8)&0x02)==0x02)
			{
				pMe->m_Game.m_MainSprite.dy=(i-2)*pMap->m_nTileSize-(y+pMap->m_nY);	
				pMe->m_Game.m_MainSprite.m_iKeyState &=~KEY_UP_MASK;
				break;
			}
		}
	}
	else if (pMe->m_Game.m_MainSprite.dy < 0)
	{
		for ( i = (y + pMap->m_nY+dy) /pMap->m_nTileSize;
			i <= (y + pMap->m_nY) / pMap->m_nTileSize; i++)
		{
			xTile1 = (x + pMap->m_nX + 12) / pMap->m_nTileSize;
			xTile2 = (x + pMap->m_nX + 20) /pMap->m_nTileSize;
			if (i < 0 || i > pMap->m_nHeight - 1)
			{
				continue;
			}
			if (xTile2 > pMap->m_nWidth - 1 || xTile1 < 0)
			{
				return ;

⌨️ 快捷键说明

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