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

📄 cfruitmgr.cpp

📁 fruitwar and engine
💻 CPP
字号:
#include "stdafx.h"

CFruitMgr::CFruitMgr( void )
{
	//获取接口
	m_pResMgr	= (IResManage*)FOXRENDERSYSTEM::GetInstance( CLD_IRESMANAGE );
	m_pSoundMgr	= (ISoundManage*) FOXMEDIASYSTEM::GetInstance( CLD_ISOUNDMANAGE );
	//创建资源
	m_pFruit	= m_pResMgr->CreateSprite( "fruit.spr","SprRes/SprRes.pack" );
	//读取音乐
	m_pSoundMgr->LoadAudio( "SoundRes/bomb.wav",SOUND_BOMB );
	m_pSoundMgr->LoadAudio( "SoundRes/viny.wav",SOUND_ADD );
	m_pSoundMgr->LoadAudio( "SoundRes/hurry.wav",SOUND_HURRY );
}

CFruitMgr::~CFruitMgr( void )
{
	//释放资源
	SafeRelease( m_pFruit );
	m_pSoundMgr->ReleaseAudio( SOUND_BOMB );
	m_pSoundMgr->ReleaseAudio( SOUND_ADD );

	//释放接口
	SafeRelease( m_pResMgr );
	SafeRelease( m_pSoundMgr );
}

void CFruitMgr::Init( void )
{
	m_dwScore	= 0;//分数为0
	//初始化
	srand( timeGetTime() );
	for( int x=0;x<8;x++ )
	{
		for( int y=0;y<13;y++ )
		{
			m_dwFruitState[y][x].m_dwFruitID	= -1;
			m_dwFruitState[y][x].m_dwState		= FRUIT_STATE_NULL;
			m_dwFruitState[y][x].m_dwX			= 0;
			m_dwFruitState[y][x].m_dwY			= 0;
			m_dwFruitState[y][x].m_dwDestY		= 0;
			m_dwFruitState[y][x].m_dwAlpha		= 255;
		}
	}
	for( x=0;x<8;x++ )
	{
		for( int y=0;y<5;y++ )
		{
			m_dwFruitState[y][x].m_dwFruitID	= rand() % 5;
			m_dwFruitState[y][x].m_dwState		= FRUIT_STATE_NEW;
			m_dwFruitState[y][x].m_dwX			= 45 + x*36;
			m_dwFruitState[y][x].m_dwY			= 80 + y*24;
			m_dwFruitState[y][x].m_dwDestY		= 80 + y*24;
			m_dwFruitState[y][x].m_dwAlpha		= 0;
		}
	}
}

bool CFruitMgr::Updata( void )
{
	//检测状态
	if( this->Test() == false )
	{
		return false;//GAME OVER
	}

	//水果状态变化
	for( int x=0;x<8;x++ )
	{
		for( int y=0;y<13;y++ )
		{
			//新的水果
			if( m_dwFruitState[y][x].m_dwState == FRUIT_STATE_NEW )
			{
				m_dwFruitState[y][x].m_dwAlpha += 5;
				if( m_dwFruitState[y][x].m_dwAlpha > 254 )
				{
					m_dwFruitState[y][x].m_dwAlpha = 255;
					//状态改成常态
					m_dwFruitState[y][x].m_dwState = FRUIT_STATE_OLD;
				}
			}
			//向上
			if( m_dwFruitState[y][x].m_dwState == FRUIT_STATE_UP )
			{
				m_dwFruitState[y][x].m_dwY	-= 400;
				if( m_dwFruitState[y][x].m_dwY <= m_dwFruitState[y][x].m_dwDestY ||
					m_dwFruitState[y][x].m_dwY > 1000 )
				{
					m_dwFruitState[y][x].m_dwY = m_dwFruitState[y][x].m_dwDestY;
					//状态改成需要检测的状态
					m_dwFruitState[y][x].m_dwState = FRUIT_STATE_TEST;
				}
			}
			//向下
			if( m_dwFruitState[y][x].m_dwState == FRUIT_STATE_DOWN )
			{
				m_dwFruitState[y][x].m_dwY	+= 250;
				if( m_dwFruitState[y][x].m_dwY >= m_dwFruitState[y][x].m_dwDestY )
				{
					m_dwFruitState[y][x].m_dwY = m_dwFruitState[y][x].m_dwDestY;
					//状态改成空
					m_dwFruitState[y][x].m_dwState = FRUIT_STATE_NULL;
				}
			}
			//死亡状态
			if( m_dwFruitState[y][x].m_dwState == FRUIT_STATE_END )
			{
				m_dwFruitState[y][x].m_dwAlpha -= 5;
				if( m_dwFruitState[y][x].m_dwAlpha > 255 )
				{
					m_dwFruitState[y][x].m_dwAlpha = 0;
					//状态改成空
					m_dwFruitState[y][x].m_dwState = FRUIT_STATE_NULL;
				}
			}
		}
	}
	return true;
}

void CFruitMgr::Draw( void )
{
	//渲染
	for( int x=0;x<8;x++ )
	{
		for( int y=0;y<13;y++ )
		{
			if( m_dwFruitState[y][x].m_dwState != FRUIT_STATE_NULL )
			{
				m_pFruit->SetCurrentNum( m_dwFruitState[y][x].m_dwFruitID );
				m_pFruit->SetAlpha( m_dwFruitState[y][x].m_dwAlpha );
				m_pFruit->SetPostion( m_dwFruitState[y][x].m_dwX,m_dwFruitState[y][x].m_dwY );
				m_pFruit->Draw( true );
			}
		}
	}
}

FruitState* CFruitMgr::GetState( DWORD a_dwX,DWORD a_dwY )
{
	return &m_dwFruitState[a_dwY][a_dwX];
}

bool CFruitMgr::Test( void )
{
	//销毁处理
	int		x,y,yy;
	DWORD	dwNum;//连续的数量

	for( x=0;x<8;x++ )
	{
		dwNum = 0;
		DWORD dwFruitID = -1;
		for( y=12;y>=0;y-- )
		{
			if( (m_dwFruitState[y][x].m_dwState != FRUIT_STATE_TEST) &&
				(m_dwFruitState[y][x].m_dwState != FRUIT_STATE_NULL) )
			{
				break;
			}
			if( m_dwFruitState[y][x].m_dwState == FRUIT_STATE_TEST )
			{
				dwNum++;
				dwFruitID = m_dwFruitState[y][x].m_dwFruitID;
				for( yy=y-1;yy>=0;yy-- )
				{
					if( (m_dwFruitState[yy][x].m_dwState != FRUIT_STATE_END) && 
						(m_dwFruitState[yy][x].m_dwState != FRUIT_STATE_NULL) &&
						(m_dwFruitState[yy][x].m_dwFruitID == dwFruitID) )
					{
						dwNum++;
					}
					else
					{
						break;
					}
				}
				if( dwNum > 2 )
				{
					this->DealWith( dwNum,x,y-dwNum+1 );
				}
				break;
			}
		}
	}
	
	//把仍旧是test标签的,改成old
	for( x=0;x<8;x++ )
	{
		for( y=12;y>=0;y-- )
		{
			if( m_dwFruitState[y][x].m_dwState == FRUIT_STATE_TEST )
			{
				m_dwFruitState[y][x].m_dwState = FRUIT_STATE_OLD;
			}
		}
	}
	
	//检验是否GAME OVER,条件为13楼是否已经占有
	for( x=0;x<8;x++ )
	{
		if( (m_dwFruitState[12][x].m_dwState == FRUIT_STATE_OLD || 
			m_dwFruitState[12][x].m_dwState == FRUIT_STATE_NEW) &&
			m_dwFruitState[0][x].m_dwState  != FRUIT_STATE_NEW )
		{
			m_pSoundMgr->StopAudio( SOUND_HURRY );
			return false;//宣布GAME OVER		
		}
	}
	//检验是否处于危险阶段,条件为11楼时候为危险状态
	for( x=0;x<8;x++ )
	{
		if( m_dwFruitState[10][x].m_dwState == FRUIT_STATE_OLD || 
			m_dwFruitState[10][x].m_dwState == FRUIT_STATE_NEW )
		{
			if( !m_pSoundMgr->GetIsPlay( SOUND_HURRY ) )
			{
				m_pSoundMgr->PlayAudio( SOUND_HURRY );
			}
			break;//宣布危险状态		
		}
	}
	return true;
}

bool CFruitMgr::DealWith( DWORD a_dwNum,DWORD a_dwX,DWORD a_dwY )
{
	DWORD dwFruitID = m_dwFruitState[a_dwY][a_dwX].m_dwFruitID;
	for( int y=a_dwY;y<a_dwNum + a_dwY;y++ )
	{
		//销毁水果
		m_dwFruitState[y][a_dwX].m_dwState = FRUIT_STATE_END;
		m_dwFruitState[y][a_dwX].m_dwAlpha = 255;
		
		//计算分数
		m_dwScore ++ ;

		//声音播放
		m_pSoundMgr->PlayAudio( SOUND_BOMB );
		
		//检测左边
		if( a_dwX > 0 )
		{
			for( int x=a_dwX-1;x>=0;x-- )
			{
				//寻找到点
				if( (m_dwFruitState[y][x].m_dwFruitID == dwFruitID) && 
					(m_dwFruitState[y][x].m_dwState != FRUIT_STATE_NULL ) )
				{
					for( int yy=y;yy<13;yy++ )
					{
						//消除
						if( m_dwFruitState[yy][x].m_dwState != FRUIT_STATE_NULL )
						{
							m_dwFruitState[yy][x].m_dwState = FRUIT_STATE_END;
							m_dwFruitState[yy][x].m_dwAlpha = 255;
							//计算分数
							m_dwScore ++;
						}
					}
				}
				//碰到不相同点
				else
				{
					//退出
					break;
				}
			}
		}
		//检测右边
		if( a_dwX < 8 )
		{
			for( int x=a_dwX+1;x<8;x++ )
			{
				//寻找到点
				if( m_dwFruitState[y][x].m_dwFruitID == dwFruitID && 
				  ( m_dwFruitState[y][x].m_dwState != FRUIT_STATE_NULL) )
				{
					for( int yy=y;yy<13;yy++ )
					{
						//消除
						if( m_dwFruitState[yy][x].m_dwState != FRUIT_STATE_NULL )
						{
							m_dwFruitState[yy][x].m_dwState = FRUIT_STATE_END;
							m_dwFruitState[yy][x].m_dwAlpha = 255;
							//计算分数
							m_dwScore ++;
						}
					}
				}
				//碰到不相同点
				else
				{
					//退出
					break;
				}
			}
		}
	}
	return true;
}

void CFruitMgr::AddStageFruit( void )
{
	for( int x=0;x<8;x++ )
	{
		for( int y=12;y>0;y-- )
		{
			m_dwFruitState[y][x].m_dwFruitID	= m_dwFruitState[y-1][x].m_dwFruitID;
			m_dwFruitState[y][x].m_dwState		= m_dwFruitState[y-1][x].m_dwState;
			m_dwFruitState[y][x].m_dwX			= 45 + x*36;
			m_dwFruitState[y][x].m_dwY			= 80 + y*24;
			m_dwFruitState[y][x].m_dwDestY		= 80 + y*24;
			m_dwFruitState[y][x].m_dwAlpha		= m_dwFruitState[y-1][x].m_dwAlpha;
		}
	}
	for( x=0;x<8;x++ )
	{
		m_dwFruitState[0][x].m_dwFruitID	= rand() % 5;
		m_dwFruitState[0][x].m_dwState		= FRUIT_STATE_NEW;
		m_dwFruitState[0][x].m_dwX			= 45 + x*36;
		m_dwFruitState[0][x].m_dwY			= 80;
		m_dwFruitState[0][x].m_dwDestY		= 80;
		m_dwFruitState[0][x].m_dwAlpha		= 0;
	}
	//播放声音
	m_pSoundMgr->PlayAudio( SOUND_ADD );
}

DWORD CFruitMgr::GetScore( void )
{
	return m_dwScore;
}

⌨️ 快捷键说明

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