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

📄 play_managefish.c

📁 凌阳32位单片机开发的小游戏
💻 C
📖 第 1 页 / 共 3 页
字号:
			pFish3[g_nCurrentFish3++] = E_AllocMotion(&Fish_3_2_Action[0], temp, startX, Sys_Random(480), Sys_Random(16));
			SETFISH_KIND(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, 1);
		}
		//set fish control flag
		SETFISH_VX(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, Sys_Random(MAXSPEED_LEV3+1));
		SETFISH_VY(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, Sys_Random(MAXSPEED_LEV3>>1));
		SETFISH_AX(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, temp);
		SETFISH_AY(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, Sys_Random(2));
		SETFISH_ST(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, STATE_NORMAL);
		SETFISH_LEV(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, FOEMAN_LEV3);
		SETFISH_OBJID(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, 0x1F);
		SETFISH_SELFID(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, (g_nCurrentFish3 - 1));
	}
}

/**
 * FoemanLevel_4 - manage level4 foeman fish.
 * @PlayerLevel: player's level
 */
void FoemanLevel_4(void)
{
#ifdef AUDIO_ENABLE	
	//TM_StopPCM(AUDIO_NO2);
	TM_PlayPCM((U8 *)RES_WAVESFX_ALERT_DRM, 64, 127);
#endif
	//shark move into screen
	E_ChangeAction(pFish4, SHARK_WARNING);

	//select left or right
	if ( Sys_Random(2) )
	{//to right
		g_iSharkStartX = -384;
		pFish4->pSprite->stPos.x = 0;
	}
	else
	{//to left
		g_iSharkStartX = SCREEN_WIDTH;
		pFish4->pSprite->stPos.x = SCREEN_WIDTH - pFish4->pSprite->pFrame->stSize.width;
	}

	//select height
	g_iSharkStartY = -128 + Sys_Random(480);
	if ( g_iSharkStartY + 128 > 416 )
	{
		pFish4->pSprite->stPos.y = 416;
	}
	else
	{
		pFish4->pSprite->stPos.y = g_iSharkStartY + 128;
	}
//debug code
/*	pFish4->pSprite->stPos.x = g_iSharkStartX;
	pFish4->pSprite->stPos.y = g_iSharkStartY;
	if ( g_iSharkStartX < 0 )
	{//left to right
		E_ChangeAction(pFish4, SHARK_RIGHTMOVE);
	}
	else
	{//right to left
		E_ChangeAction(pFish4, SHARK_LEFTMOVE);
	}*/
}

/**
 * Play_ManageFish - .
 */
void Play_ManageFish(void)
{
	if (g_nManageFishTimer < game_time)
	{
		g_nManageFishTimer = game_time + 10;
		//foeman level1
		FoemanLevel_1(g_nPlayerLevel-1);

		//foeman level2
		FoemanLevel_2(g_nPlayerLevel-1);

		//foeman level3
		FoemanLevel_3(g_nPlayerLevel-1);
	}

	//foeman level4
	if (g_nSharkTimer < game_time && pFish4->nMtnInfo.B.MTN_ActionID == SHARK_HIDE && g_nPlayerLevel > LEVEL1)
	{
		FoemanLevel_4();
	}
}

/**
 * ProcPoPo - control popo's action.
 */
void ProcPoPo(MOTION *pMotion)
{
	//move fish by screen step
	pMotion->pSprite->stPos.x = (pMotion->pSprite->nCtrlFlag & 0x0000FFFF) - g_aTextPos_X[TEXT1];
	pMotion->pSprite->stPos.y = (pMotion->pSprite->nCtrlFlag >> 16) - (160 + iTextCount_Y[TEXT1]);

	//change action
	if ( pMotion->nMtnInfo.B.MTN_ActionID == 0 && 
		Sys_Random(20) > 17 )
	{
#ifdef AUDIO_ENABLE
		if ( IsChannelStop(AUDIO_NO3) )
		{
			//TM_StopPCM(AUDIO_NO3);
			TM_PlayPCM((U8 *)RES_WAVESFX_BLEB1_DRM, 64, 127);
		}
		else
		{
			if ( IsChannelStop(AUDIO_NO4) )
			{
				//TM_StopPCM(AUDIO_NO4);
				TM_PlayPCM((U8 *)RES_WAVESFX_BLEB2_DRM, 64, 127);
			}
		}
#endif
		E_ChangeAction(pMotion, (Sys_Random(2)+1) );
	}
}

/**
 * ProcOctopus - control octopus's action.
 */
void ProcOctopus(MOTION *pMotion)
{
	U8 i;
	U8 flag;
	S16 top,bottom,left,right;
	S16 top1,bottom1,left1,right1;
	
	//update octopus's coordinate
	pMotion->pSprite->stPos.x = 771 - g_aTextPos_X[TEXT2];
	pMotion->pSprite->stPos.y = 672 - (160 + iTextCount_Y[TEXT2]);
	
	flag = 0;
	//get octopus's block
	top = pMotion->pSprite->stPos.y - 32;
	bottom = pMotion->pSprite->stPos.y + pMotion->pSprite->pFrame->stSize.height/2;
	left = pMotion->pSprite->stPos.x - 16;
	right = pMotion->pSprite->stPos.x + 128;

	for (i = 0; i < g_nCurrentFish3; i ++)
	{
		if ( pFish3[i] == NULL )
		{
			continue;
		}
		//get object's block
		top1 = pFish3[i]->pSprite->stPos.y + 36;
		bottom1 = pFish3[i]->pSprite->stPos.y + pFish3[i]->pSprite->pFrame->stSize.height - 36;
		left1 = pFish3[i]->pSprite->stPos.x + 36;
		right1 = pFish3[i]->pSprite->stPos.x + pFish3[i]->pSprite->pFrame->stSize.width - 36;

		if ( CHECK_OVERLAP(left,top,right,bottom,
			left1,top1,right1,bottom1) )
		{//collision
			flag = 1;
			break;
		}
	}

	if ( !flag && 
		(pFish4->nMtnInfo.B.MTN_ActionID != SHARK_WARNING 
		&& pFish4->nMtnInfo.B.MTN_ActionID != SHARK_HIDE)
		)
	{//shark block
		top1 = pFish4->pSprite->stPos.y + 128;
		bottom1 = pFish4->pSprite->stPos.y + 224;
		left1 = pFish4->pSprite->stPos.x + 48;
		right1 = pFish4->pSprite->stPos.x + 288;
		if ( CHECK_OVERLAP(left,top,right,bottom,
			left1,top1,right1,bottom1) )
		{
			flag = 1;
		}
	}

	if ( !flag )
	{//Player block
		top1 = pPlayer->pSprite->stPos.y + (pPlayer->pSprite->pFrame->stSize.height - ACTOR0_HEIGHT)/2;
		bottom1 = pPlayer->pSprite->stPos.y + pPlayer->pSprite->pFrame->stSize.height - (pPlayer->pSprite->pFrame->stSize.height - ACTOR0_HEIGHT)/2;
		left1 = pPlayer->pSprite->stPos.x + (pPlayer->pSprite->pFrame->stSize.width - ACTOR0_WIDTH)/2;
		right1 = pPlayer->pSprite->stPos.x + pPlayer->pSprite->pFrame->stSize.width - (pPlayer->pSprite->pFrame->stSize.width - ACTOR0_WIDTH)/2;
		if ( CHECK_OVERLAP(left,top,right,bottom,
			left1,top1,right1,bottom1) )
		{
			flag = 1;
		}
	}

	if ( flag && pMotion->nMtnInfo.B.MTN_ActionID > 2)//== 4
	{//affright
		E_ChangeAction(pMotion, 2);
		return;
	}
	
	//change action
	if ( pMotion->nMtnInfo.B.MTN_ActionID == 0 )
	{
		switch( Sys_Random(3) )
		{
		case 1:
			E_ChangeAction(pMotion, 1);//blink
			break;
		case 2:
			E_ChangeAction(pMotion, 2);//goggle
			break;
		case 0:
			E_ChangeAction(pMotion, 3);//out->turn head->in
			break;
		}
	}
}

/**
 * ProcCowry - control cowry's action.
 */
void ProcCowry(MOTION *pMotion)
{
	S16 top,bottom,left,right;
	S16 iCenterX,iCenterY;
	
	//update cowry's coordinate
	pMotion->pSprite->stPos.x = 192 - g_aTextPos_X[TEXT2];
	pMotion->pSprite->stPos.y = 653 - (160 + iTextCount_Y[TEXT2]);

	if ( pMotion->nMtnInfo.B.MTN_ActionID == COWRY_STATICCLOSE )
	{
		if ( Sys_Random(20) == 9 )
		{//open
			E_ChangeAction(pMotion, COWRY_ACTOPEN);
		}
	}

	//release player
	if ( g_nPlayerState == ST_HIDE//pPlayer->nMtnInfo.B.MTN_ActionID == 0
		&& pMotion->nMtnInfo.B.MTN_ActionID == COWRY_ACTOPEN
		&& pMotion->nMtnInfo.B.MTN_FrameID == 9)
	{
		E_ChangeAction(pPlayer, (g_nPlayerLevel-1)*12+g_nOldPlayerState);
		g_nPlayerState = g_nOldPlayerState;
	}

	//close player
	if ( pMotion->nMtnInfo.B.MTN_ActionID == COWRY_STATICOPEN 
		&& g_nPlayerState != ST_DEATH )
	{
		//get cowry's block
		top = pMotion->pSprite->stPos.y + 48;
		bottom = pMotion->pSprite->stPos.y + 96;
		left = pMotion->pSprite->stPos.x + 32;
		right = pMotion->pSprite->stPos.x + 96;

		//get Player's coordinate
		iCenterX = pPlayer->pSprite->stPos.x + pPlayer->pSprite->pFrame->stSize.width/2;
		iCenterY = pPlayer->pSprite->stPos.y + pPlayer->pSprite->pFrame->stSize.height/2;

		if ( (iCenterX > left && iCenterX < right)
			&& (iCenterY > top && iCenterY < bottom) )
		{//close player
			E_ChangeAction(pMotion, COWRY_CLOSEPLAYER);//cowry close
			E_ChangeAction(pPlayer, ST_HIDE);//hide player
			g_nPlayerVx = 0;
			g_nPlayerVy = 0;
			g_nOldPlayerState = g_nPlayerState;
			g_nPlayerState = ST_HIDE;
			Fish_Index = LCD_4_1;
		}
	}
}

/**
 * ProcSeajelly - .
 *@pMotion: 
 */
void ProcSeajelly(MOTION *pMotion)
{
	U8 temp;

	//move seajelly by screen step
	_SpFollowScreen(pMotion);

	//flap down
	if ( pMotion->nMtnInfo.B.MTN_ActionID < SEAJELLY_PRESSDOWN )
	{
		pMotion->pSprite->stPos.y += Sys_Random(2)+1;
	}

	//flap up
	if ( pMotion->nMtnInfo.B.MTN_ActionID == SEAJELLY_UP )
	{
		if ( GETFISH_AX(pMotion->pSprite->nCtrlFlag) )
		{//right
			pMotion->pSprite->stPos.x += GETFISH_VX(pMotion->pSprite->nCtrlFlag);
		}
		else
		{//left
			pMotion->pSprite->stPos.x -= GETFISH_VX(pMotion->pSprite->nCtrlFlag);
		}
		pMotion->pSprite->stPos.y -= FishStep[GETFISH_VY(pMotion->pSprite->nCtrlFlag)];
		//Vy sub
		if ( GETFISH_VY(pMotion->pSprite->nCtrlFlag) > 0 )
		{
			SETFISH_VY(pMotion->pSprite->nCtrlFlag, (GETFISH_VY(pMotion->pSprite->nCtrlFlag) - 1));
		}
		return;
	}

	//change action
	if ( pMotion->pSprite->stPos.y + 96 < 0 )
	{
		temp = 13;
	}
	else
	{
		if ( pMotion->pSprite->stPos.y > 480 )
		{
			temp = 1;
		}
		else
		{
			temp = 8;
		}
	}
	if ( pMotion->nMtnInfo.B.MTN_ActionID == SEAJELLY_FLAPEND &&
		Sys_Random(temp) == 0)
	{
		E_ChangeAction(pMotion, SEAJELLY_INITPRESS);
		SETFISH_VY(pMotion->pSprite->nCtrlFlag, (Sys_Random(5)+16));
		SETFISH_VX(pMotion->pSprite->nCtrlFlag, Sys_Random(5));
		SETFISH_AX(pMotion->pSprite->nCtrlFlag, Sys_Random(2) );
		if ( pMotion->pSprite->stPos.x + 48 + 256 < pPlayer->pSprite->stPos.x )
		{
			SETFISH_AX(pMotion->pSprite->nCtrlFlag, TO_RIGHT);
		}
		if ( pMotion->pSprite->stPos.x + 48 - 256 > pPlayer->pSprite->stPos.x + pPlayer->pSprite->pFrame->stSize.width )
		{
			SETFISH_AX(pMotion->pSprite->nCtrlFlag, TO_LEFT);
		}
	}
}

/**
 * ProcShark - .
 *@pMotion: 
 */
void ProcShark(MOTION *pMotion)
{
	if ( pFish4->nMtnInfo.B.MTN_ActionID != SHARK_WARNING )
	{
		/*if (pMotion->nMtnInfo.B.MTN_ActionID < 3
			&& Sys_Random(10) < 3)
		{
			E_ChangeAction(pMotion, pMotion->nMtnInfo.B.MTN_ActionID + 2);
		}*/
		//move fish by screen step
		_SpFollowScreen(pMotion);

		//move shark by speed
		if ( pMotion->nMtnInfo.B.MTN_ActionID == SHARK_RIGHTMOVE
			|| pMotion->nMtnInfo.B.MTN_ActionID == SHARK_RIGHTEAT )
		{
			pMotion->pSprite->stPos.x += FishStep[MAXSPEED_LEV4];
		}
		else
		{
			pMotion->pSprite->stPos.x -= FishStep[MAXSPEED_LEV4];
		}

		//check shark move out to screen
		if ( pMotion->pSprite->stPos.x < -384 - 20
			|| pMotion->pSprite->stPos.x > SCREEN_WIDTH + 20 )
		{//out to screen
			E_ChangeAction(pMotion, SHARK_HIDE);
			g_nSharkTimer = game_time + aFishNum_4[g_nPlayerLevel-1];
		}
	}
	else
	{//check play sprite to warning ending
		if ( pFish4->nMtnInfo.B.MTN_FrameID	== 5 )
		{//warning end
			if ( g_iSharkStartX < 0 )
			{//left to right
				E_ChangeAction(pFish4, SHARK_RIGHTMOVE);
			}
			else
			{//right to left
				E_ChangeAction(pFish4, SHARK_LEFTMOVE);
			}
			pFish4->pSprite->stPos.x = g_iSharkStartX;
			pFish4->pSprite->stPos.y = g_iSharkStartY;	
		}
	}
}

/**
 * ProcActor - .
 *@pMotion: 
 */
void ProcActor(MOTION *pMotion)
{
	U8 level;
	S16 temp;

	level = g_nPlayerLevel-1;

	//change direction
	if ( g_nPlayerState == ST_LEFTMOVE || g_nPlayerState == ST_RIGHTMOVE )
	{
		if ( (g_nPlayerAx ^ (g_nPlayerState - 1)) )
		{//need change
			E_ChangeAction(pMotion, (level*12 + g_nPlayerState + 2) );
			g_nPlayerState = g_nPlayerAx + 1;
		}		
	}
}

⌨️ 快捷键说明

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