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

📄 magicshot.c

📁 Brewgame大家来看看啊 呵呵
💻 C
📖 第 1 页 / 共 3 页
字号:

	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 + -