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

📄 gameplay.c

📁 凌阳32位单片机开发的小游戏
💻 C
📖 第 1 页 / 共 3 页
字号:
	//Player
	Hit_Player();

	//fish2_1
	Hit_Fish2();

	//fish3_1 and 3_2
	Hit_Fish3();

	//fish4_1
	Hit_Fish4();
}

/**
 * BW_PlayLoop - game play loop function.
 */
void BW_PlayLoop(void)
{
	U8 i;
	
	if ( g_nPlayerState != ST_HIDE && g_nPlayerState != ST_DEATH )
	{
		//check input device
		Play_ProcessInput();

		//screen movement
		Play_MoveScreen();
		
		//collision detection
		ProcCollision();
	}
	//fish management
	Play_ManageFish();

	//property management

	//score update
	E_ChangeAction(pNormal[COUNTTROUGH], (g_nScore/(SCORE_RATE*g_nPlayerLevel)) );
	
	//Player death
	if ( g_nPlayerState == ST_DEATH
		&& (g_nDeathCnt++) > 10 )
	{
#ifdef AUDIO_ENABLE	
		//TM_StopPCM(AUDIO_NO5);
		TM_PlayPCM((U8 *)RES_WAVESFX_DIE2_DRM, 64, 127);
#endif
		g_nDeathCnt = 0;
		g_nScreenStep_X = abs(g_aTextPos_X[TEXT2]-192);
		g_nScreenStep_Y = (U8)(abs(iTextCount_Y[TEXT2]));
		if ( g_aTextPos_X > 192 )
		{
			g_nPlayerAx = TO_LEFT;
		}
		else
		{
			g_nPlayerAx = TO_RIGHT;
		}
		if ( iTextCount_Y < 0 )
		{
			g_nPlayerAy = TO_DOWN;
		}
		else
		{
			g_nPlayerAy = TO_UP;
		}
		nPlayState = PLAY_RELIVE;
		E_ChangeAction(pNormal[COUNTTROUGH], 0);
		if ( g_nText3Mode )
		{
			FadeOut();
		}
		else
		{
			FadeOut();
			(*P_PPU_TX3_Control)=0x1103;		
		}	
	}

	if ( g_bInvincibleFlag )
	{
		if ( (g_nInvincibleCnt++) > 10 )
		{
			g_bInvincibleFlag = false;
		}
	}
	
	//Motion Process
	E_MotionProc();
	
	g_nScreenStep_X = 0;
	g_nScreenStep_Y = 0;

	//show sprite
	PPU_ShowSprite(true);

	//wait blanking
	WaitBlanking();

	//pause
	if (g_stEvent.Ev_Key == VK_START )
	{
		nPlayState = PLAY_MENU;
		g_nMenuID = 0;
		//g_bMenuColor = true;
		pMenu = E_AllocMotion(&Menu_Action[0], 0, 128, 48, SP_PRIO_14);
		pSelectBox = E_AllocMotion(&Select_Action[0], 0, 192, 160, SP_PRIO_15);
#ifdef AUDIO_ENABLE	
		//TM_StopPCM(AUDIO_NO0);
		TM_PlayPCM((U8 *)RES_WAVESFX_SELECT_DRM, 64, 127);
#endif
	}

	//player update
	if ( (g_nScore/(SCORE_RATE*g_nPlayerLevel)) >= 10 )
	{
		if (g_nPlayerLevel == LEVEL2)
		{
			nPlayState = PLAY_COMPLETE;
			g_bCompleteColor = true;//change palette
			g_nTrackCnt = 0;
			pMenu = E_AllocMotion(&Complete_Action[0], 0, 160, -128, SP_PRIO_14);
			pSelectBox = E_AllocMotion(&Thanks_Action[0], 0, -384, 200, SP_PRIO_15);
#ifdef AUDIO_ENABLE	
			//TM_StopPCM(AUDIO_NO1);
			TM_PlayPCM((U8 *)RES_WAVESFX_BECOME2_DRM, 64, 127);
#endif
		}
		if (g_nPlayerLevel == LEVEL1)
		{	
			g_nPlayerLevel = LEVEL2;
			E_ChangeAction(pPlayer, ((g_nPlayerLevel-1)*12 + g_nPlayerAx + 1));
			g_nPlayerState = g_nPlayerAx + 1;
			g_bScoreColor = true;
			g_nScore = 0;
#ifdef AUDIO_ENABLE	
			//TM_StopPCM(AUDIO_NO1);
			TM_PlayPCM((U8 *)RES_WAVESFX_BECOME1_DRM, 64, 127);
#endif
#ifdef MIDI_ENABLE			
			StopMidi();
			//SetMidiVolume(0);
			//SetMidiChannelMask(0x0000, 0xFFFF);
			//InitSPU();	// tested by Bruce
			PlayMidi(MIDI_LEV2, SS_PLAYMIDI_INFINITY);
			//SetMidiVolume(127);
#endif
		}
	}
}
/*
void Play_Crazy(void)
{
	//shake texture
	if ( g_nShakeTime > 0 )//&& g_nShakeCnt < 9 )
	{
		//if (aShakeValue[g_nShakeCnt*2]<0)
		//{
		//	E_HScroll(TEXT3)
		//}
		g_aTextPos_X[TEXT1] += aShakeValue[g_nShakeCnt*2];
		g_aTextPos_Y[TEXT1] += aShakeValue[g_nShakeCnt*2+1];
		(*P_PPU_TX1_X) = g_aTextPos_X[TEXT1];
		(*P_PPU_TX1_Y) = g_aTextPos_Y[TEXT1];
		if ( (g_nShakeCnt++) == 8 )
		{
			g_nShakeTime --;
			g_nPlayerState = ST_LEFTMOVE;
		}
	}

	PPU_ShowSprite(true);
	WaitBlanking();
}
*/
/**
 * BW_Play - game play main loop.
 */
GAMESTATE BW_Play(void)
{
	U16 aSelectPos[3] = {160, 224, 288};
	GAMESTATE tempState;
	U8 i;

	nPlayState = PLAY_INIT;
	//g_nText3Mode = 0;	//use text1 for PPU, not for Sensor
	
	while (1)
	{
		switch(nPlayState)
		{
		case PLAY_INIT:
			if ( g_nText3Mode )
			{
				InitTV();
			}
			Sys_Load_SDCard(&LoadPlayInfo, ASZ(LoadPlayInfo));
			InitSystem();
			LCD_InitBG();
			Play_InitVariable();
			g_nKeyCnt = 0;
			nHMovementCnt = 0;//HMovement clear
			g_bHMovementFlag = false;

			//Init Sensor
			if ( !g_nText3Mode )
			{
				*(U32*)0x8809004C = 1;// BUF Control Interrupt Mask
				InitSensor(OV7648, VGA_Data,PPUFB, TEXT3, TEXT3_PGT_ADDR, TEXT3_PGT_ADDR+0x96000, TEXT3_PGT_ADDR+0x12C000);
//				CSI_MDInit();				
				(*P_PPU_TX3_Control)=0x1103;
				//test Motion Detect by xjliu 2005-12-27
			/*	*P_CSI_MD_CR = MD_DIFF|SAMP_16|FRAME_1|(0x10<<9);
				*P_CSI_MD_SADDR = CSI_MD_DIFFBUF;				
				*P_CSI_IRQEN = *P_CSI_IRQEN|MD_FRAME;
				*P_CSI_MD_TH = 12;*/
			}
			WaitBlanking();
			//Init Motion and Sprite
			E_InitMotion();
			pPlayer = E_AllocMotion(&Actor_Action[0], 1, 256, 176, SP_PRIO_2);
			g_nPlayerLevel = LEVEL1;
			g_nPlayerState = ST_LEFTMOVE;
			g_nOldPlayerState = g_nPlayerState;
			//Init foeman fish
			Play_InitFish();			

			E_MotionProc();
			PPU_ShowSprite(true);
			WaitBlanking();
#ifdef MIDI_ENABLE
			//InitSPU();
			StopMidi();
			//SetMidiChannelMask(0x0000, 0xFFFF);
			//SetMidiVolume(127);
			//InitSPU();	// tested by Bruce
			PlayMidi(MIDI_LEV1, SS_PLAYMIDI_INFINITY);
#endif	
			if ( g_nText3Mode )
			{
				FadeIn();
			}
			else
			{
				(*P_PPU_TX3_Control)=0x110b;
				FadeIn();
			}
			nPlayState = PLAY_LOOP;
			break;
		case PLAY_LOOP:
			//play loop
			/*if ( g_nPlayerState == ST_LEFTCRAZY || g_nPlayerState == ST_RIGHTCRAZY )
			{
				Play_Crazy();
			}*/
			//if ( g_nPlayerState < ST_LEFTCRAZY || g_nPlayerState == ST_DEATH )
			{
				BW_PlayLoop();
			}			
			if ( g_nText3Mode )
			{//scroll text
				(*P_PPU_TX3_X) = (*P_PPU_TX3_X) + 1;
				g_aTextPos_X[TEXT3] = g_aTextPos_X[TEXT3] + 1;
				g_bHMovementFlag = true;
			}
			break;
		case PLAY_RELIVE:
			PPU_InitTexture();
			Play_InitVariable();
			//change player state and action
			g_nPlayerState = ST_LEFTMOVE;
			E_ChangeAction(pPlayer, ((g_nPlayerLevel-1)*12+g_nPlayerState));
			E_MotionProc();
			pPlayer->pSprite->stPos.x = (SCREEN_WIDTH - pPlayer->pSprite->pFrame->stSize.width)/2;
			pPlayer->pSprite->stPos.y = (SCREEN_HEIGHT - pPlayer->pSprite->pFrame->stSize.height)/2;
			PPU_ShowSprite(true);
			//WaitBlanking();
			WaitBlanking();
			if ( g_nText3Mode )
			{
				FadeIn();
			}
			else
			{
				(*P_PPU_TX3_Control)=0x110b;
				//WaitBlanking();
				FadeIn();
			}
			nPlayState = PLAY_LOOP;
			break;
		case PLAY_MENU:
			g_stEvent.Ev_Key = VK_MAX_NUM;
			g_nKeyCnt ++;
			if ( g_nKeyCnt > 3)//IGNOREKEY
			{
				Play_ProcessInput();
				g_nKeyCnt = 0;
			}
			if ( g_stEvent.Ev_Key == VK_UP )
			{
				if ( g_nMenuID > 0)
					g_nMenuID --;
				else
					g_nMenuID = 2;
#ifdef AUDIO_ENABLE
				//TM_StopPCM(AUDIO_NO0);
				TM_PlayPCM((U8 *)RES_WAVEBUTTON_DRM, 64, 127);
#endif
			}
			if ( g_stEvent.Ev_Key == VK_DOWN )
			{
				if ( g_nMenuID < 2)
					g_nMenuID ++;
				else
					g_nMenuID = 0;
#ifdef AUDIO_ENABLE
				//TM_StopPCM(AUDIO_NO0);
				TM_PlayPCM((U8 *)RES_WAVEBUTTON_DRM, 64, 127);
#endif
			}
			if ( g_stEvent.Ev_Key == VK_START )
			{
#ifdef AUDIO_ENABLE	
				//TM_StopPCM(AUDIO_NO0);
				TM_PlayPCM((U8 *)RES_WAVESFX_SELECT_DRM, 64, 127);
#endif
				switch( g_nMenuID )
				{
				case 0:
					nPlayState = PLAY_LOOP;
					E_FreeMotion(pMenu);
					E_FreeMotion(pSelectBox);
					break;
				case 1:
					nPlayState = PLAY_END;
					//tempState = BW_COMPLETE;
					tempState = BW_PRELUDE;//test bug by xjliu
					break;
				case 2:
					nPlayState = PLAY_END;
					tempState = BW_PRELUDE;
					break;
				}
			}
			pSelectBox->pSprite->stPos.y = aSelectPos[g_nMenuID];
			PPU_ShowSprite(true);
			WaitBlanking();
			break;
		case PLAY_COMPLETE:
			if ( pSelectBox->pSprite->stPos.x + 384 >= 160)
			{
				pMenu->pSprite->stPos.x += 128;
			}
			if (g_nTrackCnt < ASZ(aTrack))
			{
				pMenu->pSprite->stPos.y += aTrack[g_nTrackCnt++];
			}
			else
			{
				if ( pSelectBox->pSprite->stPos.x < 128 )
					pSelectBox->pSprite->stPos.x += 128;
				else
				{//complete game
					if ( pMenu->pSprite->stPos.x > SCREEN_WIDTH + 640 )
					{
						nPlayState = PLAY_END;
						//tempState = BW_COMPLETE;
						tempState = BW_PRELUDE;	
					}
				}
			}
			PPU_ShowSprite(true);
			WaitBlanking();
			break;
		case PLAY_END:
			FadeOut();
#ifdef MIDI_ENABLE
			StopMidi();
			//SetMidiVolume(0);
			//InitSPU();
#endif
#ifdef AUDIO_ENABLE
/* 			TM_StopPCM(AUDIO_NO0);		// tested by Bruce
			TM_StopPCM(AUDIO_NO1);
			TM_StopPCM(AUDIO_NO2);
			TM_StopPCM(AUDIO_NO3);
			TM_StopPCM(AUDIO_NO4);
			TM_StopPCM(AUDIO_NO5);
			TM_StopPCM(AUDIO_NO6);
			TM_StopPCM(AUDIO_NO7); */
#endif
			Key_Index = LCD_KEYMIDDLE;
			if ( !g_nText3Mode )
			{//disable CSI
				*P_CSI_TG_CR &= 0xFFFFFFFE;
			}
			//free motion
			E_FreeMotion(pPlayer);
			E_FreeMotion(pMenu);
			E_FreeMotion(pSelectBox);

			for (i = 0; i < g_nCurrentFish1; i ++)
			{
				if ( pFish1[i] == NULL )
				{
					continue;
				}
				E_FreeMotion(pFish1[i]);
			}

			for (i = 0; i < g_nCurrentFish2; i ++)
			{
				if ( pFish2[i] == NULL )
				{
					continue;
				}
				E_FreeMotion(pFish2[i]);
			}

			for (i = 0; i < g_nCurrentFish3; i ++)
			{
				if ( pFish3[i] == NULL )
				{
					continue;
				}
				E_FreeMotion(pFish3[i]);
			}
			
			if ( pFish4 != NULL)
			{
				E_FreeMotion(pFish4);
			}

			for (i = 0; i < NORMAL_NUM; i ++)
			{
				if ( pNormal[i] == NULL )
				{
					continue;
				}
				E_FreeMotion(pNormal[i]);
			}
			PPU_ShowSprite(true);//clear all sprite
			WaitBlanking();		
			return tempState;
			break;
		}
	}
	
	return BW_GAMESTATE_MAXNUM;
}

⌨️ 快捷键说明

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