📄 magicshot.c
字号:
ISHELL_CreateInstance(pMe->pIShell,AEECLSID_SPRITE,(void **)&pMe->pISprite);//创建ISprite借口的实例
//精灵部分
pScreen = IDISPLAY_GetDestination(pMe->pIDisplay); //得到屏幕信息
pbmDib = ISHELL_LoadBitmap(pMe->pIShell,"role.bmp"); //读取图片到 临时存储器 上
IBITMAP_GetInfo(pbmDib,&bi,sizeof(bi)); //得到 临时存储器 上图片的信息
IBITMAP_CreateCompatibleBitmap(pScreen,&pbmDdb,(uint16)bi.cx,(uint16)bi.cy); //得到与屏幕兼容的硬件相关区域 and 它和临时存储器上的图片规格相同
IBITMAP_BltIn(pbmDdb,0,0,(uint16)bi.cx,(uint16)bi.cy,pbmDib,0,0,AEE_RO_COPY);//把 临时存储器 上的信息 copy 到 兼容区域内
IBITMAP_Release(pbmDib);
pbmDib = NULL;
IBITMAP_GetPixel(pbmDdb,0,0,&color); //得到图片0,0位置的颜色
IBITMAP_SetTransparencyColor(pbmDdb,color);//将图片所有与0,0位置颜色相同的区域镂空
ISPRITE_SetSpriteBuffer(pMe->pISprite,SPRITE_SIZE_32X32,pbmDdb); //将镂空好的兼容区域 放在ISPRITE缓冲区中 待画
//地图部分
IBITMAP_Release(pbmDdb);
pbmDib = ISHELL_LoadBitmap(pMe->pIShell,"map.bmp");
IBITMAP_GetInfo(pbmDib,&bi,sizeof(bi));
IBITMAP_CreateCompatibleBitmap(pScreen,&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,1,211,&color);
IBITMAP_SetTransparencyColor(pbmDdb,color);
ISPRITE_SetTileBuffer(pMe->pISprite,TILE_SIZE_16X16,pbmDdb);
ISPRITE_SetSpriteBuffer(pMe->pISprite, SPRITE_SIZE_16X16, pbmDdb);
IBITMAP_Release(pbmDdb);
ISPRITE_SetDestination(pMe->pISprite,pScreen); //设置ISPRITE接口上的东西 将 画到屏幕上
IBITMAP_Release(pScreen);
}
//--------------------------------------------------------------------------------------------------------------------------------
//初始化 “精灵” 的函数
//--------------------------------------------------------------------------------------------------------------------------------
void SpriteInit(MagicShot *pMe)
{
int i = 0;
pMe->gameTime = 0;
pMe->gameState = 0;
pMe->gameTimeAcount = 0;
//造型中人物(不动的时候)
pMe->role[0].unComposite = COMPOSITE_KEYCOLOR;
pMe->role[0].unLayer = SPRITE_LAYER_0;
pMe->role[0].unSpriteIndex = 0;
pMe->role[0].unSpriteSize = SPRITE_SIZE_32X32;
pMe->role[0].unTransform = SPRITE_FLIP_Y;
pMe->role[0].x = 0;
pMe->role[0].y = pMe->DeviceInfo.cyScreen - 64; //这里是16+16(地图的两个1,来表示地面)+32(人物的高)
pMe->role[1].unSpriteSize = SPRITE_SIZE_END;//结束标志位
pMe->roleway = 0;
pMe->roleX = 0;
pMe->roleY = pMe->DeviceInfo.cyScreen - 64;
pMe->roleState = 0;
pMe->roleIndex = 0;
pMe->roleScore = 1;
//魔法部分
pMe->magic[0].unComposite = COMPOSITE_KEYCOLOR;
pMe->magic[0].unLayer = SPRITE_LAYER_HIDDEN;
pMe->magic[0].unSpriteIndex = 10;
pMe->magic[0].unSpriteSize = SPRITE_SIZE_32X32;
pMe->magic[0].unTransform = SPRITE_FLIP_Y;
pMe->magic[0].x = 0;
pMe->magic[0].y = pMe->DeviceInfo.cyScreen - 96;
pMe->magic[1].unSpriteSize = SPRITE_SIZE_END;
pMe->roleIndex = 0;
//力量巢
pMe->power[0].unComposite = COMPOSITE_KEYCOLOR;
pMe->power[0].unLayer = SPRITE_LAYER_0;
pMe->power[0].unSpriteIndex = 15;
pMe->power[0].unSpriteSize = SPRITE_SIZE_32X32;
pMe->power[0].unTransform = SPRITE_FLIP_Y;
pMe->power[0].x = 0;
pMe->power[0].y = 0;
pMe->power[1].unSpriteSize = SPRITE_SIZE_END;
pMe->powerState = 0;
pMe->powerTimer = 0;
pMe->powerMaxTimer = 5;
//敌人部分
for(i = 0;i < 3;i++)
{
pMe->enemy[i].unComposite = COMPOSITE_KEYCOLOR;
pMe->enemy[i].unLayer = SPRITE_LAYER_HIDDEN;
pMe->enemy[i].unSpriteIndex = 20;
pMe->enemy[i].unSpriteSize = SPRITE_SIZE_32X32;
pMe->enemy[i].unTransform = SPRITE_FLIP_Y;
pMe->enemy[i].x = 0;
pMe->enemy[i].y = 0;
pMe->enemySpeed[i] = 2;
pMe->enemyCount[i] = 0;
}
pMe->enemySpeedBase = 2;
pMe->enemy[3].unSpriteSize = SPRITE_SIZE_END;
//分数部分
for(i = 0;i < 2;i++)
{
pMe->showScore[i].unComposite = COMPOSITE_KEYCOLOR;
pMe->showScore[i].unLayer = SPRITE_LAYER_HIDDEN;
pMe->showScore[i].unSpriteIndex = 12;
pMe->showScore[i].unSpriteSize = SPRITE_SIZE_16X16;
pMe->showScore[i].unTransform = SPRITE_FLIP_Y;
pMe->showScore[i].x = pMe->DeviceInfo.cxScreen / 2 + 32 + i*8;
pMe->showScore[i].y = 0;
}
pMe->showScore[2].unSpriteSize = SPRITE_SIZE_END;
//时间巢
pMe->showTime[0].unComposite = COMPOSITE_KEYCOLOR;
pMe->showTime[0].unLayer = SPRITE_LAYER_0;
pMe->showTime[0].unSpriteIndex = 15;
pMe->showTime[0].unSpriteSize = SPRITE_SIZE_32X32;
pMe->showTime[0].unTransform = SPRITE_FLIP_Y;
pMe->showTime[0].x = pMe->DeviceInfo.cxScreen / 2 + 30;
pMe->showTime[0].y = 0;
pMe->showTime[1].unSpriteSize = SPRITE_SIZE_END;
//地图部分
pMe->map[0].pMapArray = (uint16*)amap;
pMe->map[0].unFlags = MAP_FLAG_WRAP;
pMe->map[0].unTileSize = TILE_SIZE_16X16;
pMe->map[0].h = MAP_SIZE_16;
pMe->map[0].w = MAP_SIZE_16;
pMe->map[0].x = 0;
pMe->map[0].y = 0;
}
//--------------------------------------------------------------------------------------------------------------------------------
//将资源文件绘制的函数
//--------------------------------------------------------------------------------------------------------------------------------
void DrawResource(MagicShot *pMe,int index)
{
pMe->role[0].unSpriteIndex = index;
IDISPLAY_ClearScreen(pMe->pIDisplay);
ISPRITE_DrawTiles(pMe->pISprite,pMe->map);
ISPRITE_DrawSprites(pMe->pISprite,pMe->role);
ISPRITE_DrawSprites(pMe->pISprite,pMe->power);
ISPRITE_DrawSprites(pMe->pISprite,pMe->enemy);
ISPRITE_DrawSprites(pMe->pISprite,pMe->showScore);
ISPRITE_DrawSprites(pMe->pISprite,pMe->showTime);
IDISPLAY_Update(pMe->pIDisplay);
}
void DrawISprite(MagicShot *pMe)
{
IDISPLAY_ClearScreen(pMe->pIDisplay);
ISPRITE_DrawTiles(pMe->pISprite,pMe->map);
ISPRITE_DrawSprites(pMe->pISprite,pMe->role);
ISPRITE_DrawSprites(pMe->pISprite,pMe->magic);
ISPRITE_DrawSprites(pMe->pISprite,pMe->power);
ISPRITE_DrawSprites(pMe->pISprite,pMe->enemy);
ISPRITE_DrawSprites(pMe->pISprite,pMe->showScore);
ISPRITE_DrawSprites(pMe->pISprite,pMe->showTime);
IDISPLAY_Update(pMe->pIDisplay);
}
//--------------------------------------------------------------------------------------------------------------------------------
//按键状态
//--------------------------------------------------------------------------------------------------------------------------------
static void MyHandleKeyEvent(MagicShot *pMe, AEEEvent eCode, uint16 wParam)
{
switch (eCode)
{
case EVT_KEY_PRESS:
switch (wParam)
{
case AVK_RIGHT:
pMe->keyState = 1;
//释放魔法时 其他按键失效
if(pMe->roleState == 3)
pMe->keyState = 0;
break;
case AVK_LEFT:
pMe->keyState = 2;
if(pMe->roleState == 3)
pMe->keyState = 0;
break;
case AVK_SELECT:
pMe->keyState = 3;
if(pMe->roleState == 3)
pMe->keyState = 0;
}
break;
case EVT_KEY_RELEASE:
switch (wParam)
{
case AVK_RIGHT:
pMe->keyState = 0;
break;
case AVK_LEFT:
pMe->keyState = 0;
break;
case AVK_SELECT:
pMe->keyState = 0;
break;
}
}
}
//--------------------------------------------------------------------------------------------------------------------------------
//游戏时间
//--------------------------------------------------------------------------------------------------------------------------------
void ontime(MagicShot *pMe)
{
pMe->gameTime += 1;
//根据键盘作出判断
switch(pMe->keyState)
{
case 0:
pMe->role[0].x = pMe->roleX;
if(pMe->roleState == 0 || pMe->roleState == 1)
{
if(pMe->roleway == 0)
pMe->role[0].unSpriteIndex = 0;
else
pMe->role[0].unSpriteIndex = 5;
pMe->roleState = 0;
pMe->powerState = 0;
pMe->power[0].unSpriteIndex = 15;
pMe->magic[0].unLayer = SPRITE_LAYER_HIDDEN;
DrawResource(pMe,pMe->role[0].unSpriteIndex);
}
//魔法被释放
if(pMe->roleState == 2 || pMe->roleState == 3)
{
pMe->roleState = 3;//魔法被释放状态
magicCastd(pMe);
}
break;
case 1:
if(pMe->roleState == 0)
{
if(pMe->roleX <= (pMe->DeviceInfo.cxScreen)/2)
pMe->roleX += 2;
else
pMe->map[0].x -= 2;
pMe->role[0].x = pMe->roleX;
pMe->roleIndex += 1;
pMe->roleIndex %= 2;
pMe->roleway = 0;
pMe->role[0].unSpriteIndex = pMe->roleIndex+1;
DrawISprite(pMe);
}
break;
case 2:
if(pMe->roleState == 0)
{
if(pMe->roleX >2)
pMe->roleX -= 2;
pMe->role[0].x = pMe->roleX;
pMe->roleIndex += 1;
pMe->roleIndex %= 2;
pMe->roleway = 1;
pMe->role[0].unSpriteIndex = pMe->roleIndex+5;
DrawISprite(pMe);
}
break;
case 3:
if(pMe->roleState == 0)
pMe->roleState = 1;//设置为 吟唱魔法状态
if(pMe->roleState != 3)//释放魔法时不能 续力
castmagic(pMe);
break;
}
//出现敌人
enemyShow(pMe);
//算时间
ShowGameTime(pMe);
//如果游戏没有结束,继续游戏主循环
if(pMe->gameState != 2)
ISHELL_SetTimerEx(pMe->pIShell,80,&pMe->gameTimer);
else
GameOver(pMe);
}
//--------------------------------------------------------------------------------------------------------------------------------
//吟唱魔法
//--------------------------------------------------------------------------------------------------------------------------------
void castmagic(MagicShot* pMe)
{
pMe->magic[0].x = pMe->roleX;
pMe->magic[0].y = pMe->roleY - 32;
pMe->magic[0].unLayer = SPRITE_LAYER_0;
pMe->magicIndex += 1;
pMe->magicIndex %= 4;
pMe->magic[0].unSpriteIndex = pMe->magicIndex + 10;
if(pMe->roleway == 0)
pMe->role[0].unSpriteIndex = 3;
else
pMe->role[0].unSpriteIndex = 8;
//描述power巢
if(pMe->powerTimer < pMe->powerMaxTimer && pMe->powerState <= 3)
{
pMe->powerTimer++;
}
else if(pMe->powerState <= 3)
{
pMe->powerTimer = 0;
pMe->powerState += 1;
pMe->power[0].unSpriteIndex += 1;
}
if(pMe->powerState == 4)
pMe->roleState = 2;//设置精灵为 魔法就绪状态
DrawISprite(pMe);
}
//--------------------------------------------------------------------------------------------------------------------------------
//释放魔法
//--------------------------------------------------------------------------------------------------------------------------------
void magicCastd(MagicShot* pMe)
{
if(pMe->roleway == 0)
pMe->role[0].unSpriteIndex =4;
if(pMe->roleway == 1)
pMe->role[0].unSpriteIndex =9;
pMe->magicIndex += 1;
pMe->magicIndex %= 4;
pMe->magic[0].unSpriteIndex = pMe->magicIndex + 10;
//魔法移动轨迹
if(pMe->roleway == 0)
{
pMe->magic[0].x += 4;
pMe->magic[0].y -= 4;
}
else
{
pMe->magic[0].x -= 4;
pMe->magic[0].y -= 4;
}
if(pMe->magic[0].y < 0 || pMe->magic[0].x > pMe->DeviceInfo.cxScreen ||
pMe->magic[0].y < 0 || pMe->magic[0].x < 0)
{
pMe->powerState = 0;
pMe->roleState = 0;
pMe->power[0].unSpriteIndex = 15;
pMe->magic[0].unLayer = SPRITE_LAYER_HIDDEN;
}
DrawISprite(pMe);
}
//--------------------------------------------------------------------------------------------------------------------------------
//出现敌人
//--------------------------------------------------------------------------------------------------------------------------------
void enemyShow(MagicShot* pMe)
{
int ran;
int i;
//飞机出现算法
ran = Random(30);
if(ran == 0 && pMe->enemyCount[0] == 0)
{
pMe->enemyCount[0] = 1;
pMe->enemy[0].unLayer = SPRITE_LAYER_0;
pMe->enemy[0].x = pMe->DeviceInfo.cxScreen-32;
pMe->enemy[0].y = Random(32);
pMe->enemySpeed[0] = Random(3)+pMe->enemySpeedBase;
}
if(ran == 1 && pMe->enemyCount[1] == 0)
{
pMe->enemyCount[1] = 1;
pMe->enemy[1].unLayer = SPRITE_LAYER_0;
pMe->enemy[1].x = pMe->DeviceInfo.cxScreen-32;
pMe->enemy[1].y = Random(32);
pMe->enemySpeed[1] = Random(3)+pMe->enemySpeedBase;
}
if(ran == 2 && pMe->enemyCount[2] == 0)
{
pMe->enemyCount[2] = 1;
pMe->enemy[2].unLayer = SPRITE_LAYER_0;
pMe->enemy[2].x = pMe->DeviceInfo.cxScreen-32;
pMe->enemy[2].y = Random(32);
pMe->enemySpeed[2] = Random(3)+pMe->enemySpeedBase;
}
//飞机移动算法
if(pMe->enemyCount[0] == 1)
{
pMe->enemy[0].x -= pMe->enemySpeed[0];
if(pMe->enemy[0].x <= -32)
{
pMe->enemyCount[0] = 0;
pMe->enemy[0].unLayer = SPRITE_LAYER_HIDDEN;
}
}
if(pMe->enemyCount[1] == 1)
{
pMe->enemy[1].x -= pMe->enemySpeed[1];
if(pMe->enemy[1].x <= -32)
{
pMe->enemyCount[1] = 0;
pMe->enemy[1].unLayer = SPRITE_LAYER_HIDDEN;
}
}
if(pMe->enemyCount[2] == 1)
{
pMe->enemy[2].x -= pMe->enemySpeed[2];
if(pMe->enemy[2].x <= -32)
{
pMe->enemyCount[2] = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -