📄 gamedemo.c
字号:
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 + -