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

📄 cgamearea.cpp

📁 我在资源网上发布的一个brickshorterjr的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include  "CGameArea.h"
#include  <memory.h>


//=========================================================================
//	Name:CGameArea
//	Desc:Constructors, here is the maingame'logic
//
//=========================================================================
CGameArea::CGameArea( HGE *hgeEngine , hgeResourceManager	*resMgr )
{
	m_hgeEngine  =  hgeEngine;
	m_resMgr     =  resMgr;	
	
	m_render     =  new  CRender( m_hgeEngine , m_resMgr );
	m_render->Init();

	m_sound   =  new  CSound( m_hgeEngine , m_resMgr );
	m_sound->Init();

	m_gui	=	new	CGUIManager( m_resMgr , m_sound );
	m_gui->Init();

	m_mouseX = 0;
	m_mouseY = 0;
	m_arrayX = 0;
	m_arrayY = 0;

	m_level = 1;
	m_score = 0;
	m_bRotate = false;
	m_bRotateSmall = false;
	m_RotateDir = 0;

	for(int  i = 0; i < AREA_HEIGHT; ++ i )
	{
		for(int j = 0; j < AREA_WIDTH; ++ j )
		{ 
			m_area[i][j]  =  NULL;
			m_save[i][j]  =  NULL;
			m_turn[i][j]  =  NULL;
		}
	}

	m_LinkedBrick.clear();
	s_lastTime = 0;
}


//=========================================================================
//	Name:Init
//	Desc:Init the maingame,this fuuction will be called only once,if need to Init the gamedate, I will make anthor function
//
//=========================================================================
bool    CGameArea::Init()
{	
	int i,j;
	for( i = 0; i < AREA_HEIGHT; ++ i )
	{
		for( j = 0; j < AREA_WIDTH; ++ j )
		{
			SAFE_DELETE( m_area[i][j] );

			if( i < 3 && j < 3		||
				i < 3 && j > 10		||
				i > 10 && j < 3		||
				i > 10 && j > 10	||
				i > 2 && i < 11 && j > 2 && j < 11 )
			{
				//the four corners and the game area should be NOBRICK
				m_area[i][j] = NULL;
			}
			else
			{
				CBrick *brick  =  new  CBrick( m_hgeEngine , m_resMgr );
				//( int arrayX, int arrayY, e_BrickDirection direction, int type, int state,bool visible );			
				brick->Init( j, i, BRICK_UP, (e_BrickType)(rand()%( 11 + (m_level*10) ) ), STATE_SLEEP, true );
				m_area[i][j] = brick;
			}		
		}//for
	}//for

	//then , i should put some random bricks in the game area
	for( i = 5; i <= 8; ++ i )
	{
		for( j = 5; j <= 8; ++ j )
		{
			if( ( i == 6 || i == 7 ) &&
				( j == 5 || j == 8 ) ||
				( i == 5 || i == 8 ) &&
				( j == 6 || j == 7 ) )
			{
				CBrick *brick  =  new  CBrick( m_hgeEngine , m_resMgr );
				//( int arrayX, int arrayY, e_BrickDirection direction, int type, int state,bool visible );			
				brick->Init( j, i, BRICK_NODIR1, (e_BrickType)(rand()%8), (e_BrickState)(rand()%5), true );
				m_area[i][j] = brick;
			}
		}
	}
	return true;
}

//=========================================================================
//	Name:Release
//	Desc:When exit , call this 
//
//=========================================================================
void    CGameArea::Release()
{
	if( m_render != NULL )
		m_render->Release();
	SAFE_DELETE( m_render );

	if( m_sound != NULL )
		m_sound->Release();
	SAFE_DELETE( m_sound );

	if( m_gui != NULL )
		m_gui->Release();
	SAFE_DELETE( m_gui );
}


//=========================================================================
//	Name:Update
//	Desc:Update the maingame, all the Input are detect here, and the CheckHit() was called here,
//
//=========================================================================
m_MainGameResult    CGameArea::Update()
{
	//it's a bad way
	static bool music = false;
	if( !music )
	{
		m_sound->SoundGame( SOUND_GAME_BACKGROUND );
		music = true;
	}

	m_hgeEngine->Input_GetMousePos( &m_mouseX, &m_mouseY );
	
	int x,y;

	if( m_hgeEngine->Input_GetKeyState( HGEK_LBUTTON ) && m_hgeEngine->Timer_GetTime() - s_lastTime > 0.5f && !m_bRotate && !m_bRotateSmall )
	{
		s_lastTime	=	m_hgeEngine->Timer_GetTime();
		this->SrcToArray();//Save the mouse to array

		//Check the brick is can be move or not
		if( this->CanMove( m_arrayX, m_arrayY ) )
		{
			m_sound->SoundGame(SOUND_GAME_SHORT);
		}
		
	}
	
	//Update the brick
	for( y = 0; y < AREA_HEIGHT; y ++ )
	{
		for( x = 0; x < AREA_WIDTH; x ++ )
		{
			if( m_area[y][x] )
			{
				m_area[y][x]->Update();	
				
				if( x > 2 && x < 11 && y > 2 && y < 11  )
				{
					m_area[y][x]->RandSetState();
				}

				//do the linked search
				if( !m_area[y][x]->IsMoving() && m_area[y][x]->IsBeCheckLinked() )
				{
					m_area[y][x]->SetBeNotCheckLinked();
					
					//this function will kill the brick ( make the point to brick be NULL)
					this->CheckBrick( x, y );
					//DEBUG;				
				}
				
				//So need to detect the NULL first
				if( m_area[y][x] != NULL )
				{
					if( !m_area[y][x]->IsMoving() )
					{
						this->MoveBack( x, y );
					}
				}
			}
			
		}
	}

	//Check win
	if( this->IsWin() )
	{
		m_level++;
		this->Init();
		m_render->AddGamePar( GAME_LEVELUP, AREA_BEGIN_X + 7*TILE_SIZE,  AREA_BEGIN_Y + 7*TILE_SIZE );
		m_sound->SoundGame(SOUND_GAME_LEVELUP);
	}

	//Update all the gui
	e_GUIId result = m_gui->Update( m_hgeEngine->Timer_GetDelta() );
	switch( result )
	{
	case GUI_NEWGAME:
		m_level = 1;
		this->Init();
		break;
	case GUI_EXITGAME:
		return GAME_OVER;
		
	case GUI_OPTION:
		break;
		
	case GUI_UNDO:
		this->RenewArea();
		break;

	case GUI_ROTATE1:
		m_RotateDir = 1;
		m_bRotate = true;
		this->SaveScreen();
		this->SaveArea();
		this->TurnRight();
		m_sound->SoundGame(SOUND_GAME_ROTATE);
		break;
	
	case GUI_ROTATE2:
		m_RotateDir = -1;
		m_bRotate = true;
		this->SaveScreen();
		this->SaveArea();
		this->TurnLeft();
		m_sound->SoundGame(SOUND_GAME_ROTATE);
		break;
	}

	//debug , test the repeat brick point
	/*for( int i = 0; i < 14; i++ )
	{
		for( int j = 0; j < 14; j++ )
		{
			for( y = 0; y < 14; y++ )
			{
				for( x = 0; x < 14; x++ )
				{
					if( y == i && x == j )
						continue;
					else if( m_area[i][j] == m_area[y][x] && m_area[i][j] != NULL )
						DEBUG;
				}
			}
		}
	} */
	
	return GAME_NOTHING;
}

//move the brick back
bool    CGameArea::MoveBack( int arrayX, int arrayY )
{
	if( arrayX <= 2 || arrayX >= 11 || arrayY <= 2 || arrayY >= 11 )//the brick is not in the Core
		return false;
	
	int x,y;

	switch( m_area[arrayY][arrayX]->GetDirection() )
	{
	case BRICK_RIGHT:
		for( x = arrayX+1; x<= 10; x++ )
		{
			if( m_area[ arrayY ][ x ] != NULL )
			{
				if( x == arrayX+1 )
					return false;

				break;
			}
		}
		
		if( x == 11 )
		{
			SAFE_DELETE( m_area[ arrayY  ][ x+2 ] );
			m_area[ arrayY ][ x+2 ]  =  m_area[ arrayY ][ x+1 ];	
			m_area[ arrayY ][ x+1 ]  =  m_area[ arrayY ][ x+0 ];
			m_area[ arrayY ][ x+0 ]  =  m_area[ arrayY ][ arrayX ];
			m_area[ arrayY ][ arrayX ]->SetState( STATE_SLEEP );
			m_area[ arrayY ][ arrayX ] = NULL;

			m_area[ arrayY ][ x+0 ]->MoveTo( BRICK_RIGHT  ,x+0 , arrayY , 350 , 0 );
			m_area[ arrayY ][ x+1 ]->MoveTo( BRICK_RIGHT  ,x+1 , arrayY , 350  , 0 );
			m_area[ arrayY ][ x+2 ]->MoveTo( BRICK_RIGHT  ,x+2 , arrayY , 350  , 0 );			
		}
		else if( x < 11 )
		{		
			m_area[ arrayY ][ arrayX ]->MoveTo( BRICK_RIGHT  ,x-1 , arrayY , 350 , 0 );
			m_area[ arrayY ][ x-1 ] = m_area[ arrayY ][ arrayX ];
			m_area[ arrayY ][ x-1 ]->SetBeCheckLinked();		
			m_area[ arrayY ][ arrayX ] = NULL;

		}
		
		break;
		
	case BRICK_LEFT:
		for( x = arrayX-1; x>= 3; x-- )
		{
			if( m_area[ arrayY ][ x ] != NULL )
			{
				if( x == arrayX-1 )
					return false;
				
				break;
			}
		}
		
		if( x == 2 )
		{
			SAFE_DELETE( m_area[ arrayY  ][ x-2 ] );

			m_area[ arrayY ][ x-2 ]  =  m_area[ arrayY ][ x-1 ];	
			m_area[ arrayY ][ x-1 ]  =  m_area[ arrayY ][ x-0 ];
			m_area[ arrayY ][ x-0 ]  =  m_area[ arrayY ][ arrayX ];
			m_area[ arrayY ][ arrayX ]->SetState( STATE_SLEEP );
			m_area[ arrayY ][ arrayX ] = NULL;
			
			m_area[ arrayY ][ x-0 ]->MoveTo( BRICK_LEFT  ,x-0 , arrayY , -350 , 0 );
			m_area[ arrayY ][ x-1 ]->MoveTo( BRICK_LEFT  ,x-1 , arrayY , -350  , 0 );
			m_area[ arrayY ][ x-2 ]->MoveTo( BRICK_LEFT  ,x-2 , arrayY , -350  , 0 );					
		}
		else if( x > 2 )
		{		
			m_area[ arrayY ][ arrayX ]->MoveTo( BRICK_LEFT  ,x+1 , arrayY , -350 , 0 );
			m_area[ arrayY ][ x+1 ] = m_area[ arrayY ][ arrayX ];
			m_area[ arrayY ][ x+1 ]->SetBeCheckLinked();			
			m_area[ arrayY ][ arrayX ] = NULL;
		}
		
		break;

	case BRICK_DOWN:
		for( y = arrayY+1; y <= 10; y ++ )
		{
			if( m_area[ y ][ arrayX ] != NULL )
			{
				if( y == arrayY+1 )
					return false;
				
				break;
			}
		}
		
		if( y == 11 )
		{
			SAFE_DELETE( m_area[ y+2 ][ arrayX ] );

			m_area[ y+2 ][ arrayX ]  =  m_area[ y+1 ][ arrayX ];	
			m_area[ y+1 ][ arrayX ]  =  m_area[ y+0 ][ arrayX ];
			m_area[ y+0 ][ arrayX ]  =  m_area[ arrayY ][ arrayX ];
			m_area[ arrayY ][ arrayX ]->SetState( STATE_SLEEP );
			m_area[ arrayY ][ arrayX ] = NULL;
			
			m_area[ y+0 ][ arrayX ]->MoveTo( BRICK_DOWN  ,arrayX ,  y+0 , 0 , 350 );
			m_area[ y+1 ][ arrayX ]->MoveTo( BRICK_DOWN  ,arrayX ,  y+1 , 0 , 350 );
			m_area[ y+2 ][ arrayX ]->MoveTo( BRICK_DOWN  ,arrayX ,  y+2 , 0 , 350 );					
		}
		else if( y < 11 )
		{		
			m_area[ arrayY ][ arrayX ]->MoveTo( BRICK_DOWN  ,arrayX , y-1 , 0 , 350 );
			m_area[ y-1 ][ arrayX ] = m_area[ arrayY ][ arrayX ];
			m_area[ y-1 ][ arrayX ]->SetBeCheckLinked();
			m_area[ arrayY ][ arrayX ] = NULL;
		}
		
		break;

	case BRICK_UP:
		for( y = arrayY-1; y >= 3; y -- )
		{
			if( m_area[ y ][ arrayX ] != NULL )
			{
				if( y == arrayY-1 )
					return false;
				
				break;
			}
		}
		
		if( y == 2 )
		{
			SAFE_DELETE( m_area[ y-2 ][ arrayX ] );

			m_area[ y-2 ][ arrayX ]  =  m_area[ y-1 ][ arrayX ];	
			m_area[ y-1 ][ arrayX ]  =  m_area[ y-0 ][ arrayX ];
			m_area[ y-0 ][ arrayX ]  =  m_area[ arrayY ][ arrayX ];
			m_area[ arrayY ][ arrayX ]->SetState( STATE_SLEEP );
			m_area[ arrayY ][ arrayX ] = NULL;
			
			m_area[ y-0 ][ arrayX ]->MoveTo( BRICK_UP  ,arrayX ,  y-0 , 0 , -350 );
			m_area[ y-1 ][ arrayX ]->MoveTo( BRICK_UP  ,arrayX ,  y-1 , 0 , -350 );
			m_area[ y-2 ][ arrayX ]->MoveTo( BRICK_UP  ,arrayX ,  y-2 , 0 , -350 );					
		}
		else if( y > 2 )
		{		
			m_area[ arrayY ][ arrayX ]->MoveTo( BRICK_UP  ,arrayX , y+1 , 0 , -350 );
			m_area[ y+1 ][ arrayX ] = m_area[ arrayY ][ arrayX ];
			m_area[ y+1 ][ arrayX ]->SetBeCheckLinked();
			m_area[ arrayY ][ arrayX ] = NULL;
		}
		
		break;
	}	
	return false;
}

bool    CGameArea::CanMove( int x , int y )
{
	if( x <= 1 || x >= 12 || y <= 1 || y>= 12 )//the brick is not in the edge
		return false;

	//MoveTo( e_BrickDirection direction, int newArrayX , float vx, float vy )
	
	int speed = 400;

	if( x == 2 )
	{
		for( int i = 3 ; i <= 10 ; i++ )
		{
			if( m_area[ y ][ 3 ] != NULL )
				return false;
			
			if( m_area[ y ][ i ] != NULL )
			{
				this->SaveArea();
				m_area[ y ][ x ]->SetNotSleepState();
				m_area[ y ][ x ]->MoveTo( BRICK_RIGHT  ,i-1 , y , speed , 0 );
				m_area[ y ][ i-1 ] = m_area[ y ][ x ];
				m_area[ y ][ i-1 ]->SetBeCheckLinked();
				
				
				m_area[ y ][ x-1 ]->MoveTo( BRICK_RIGHT , x , y ,150,0 );
				m_area[ y ][ x ] = m_area[ y ][ x-1 ];
				
				m_area[ y ][ x-2 ]->MoveTo( BRICK_RIGHT , x-1 , y ,80,0 );
				m_area[ y ][ x-1 ] = m_area[ y ][ x-2 ];
				
				//( int arrayX, int arrayY, e_BrickDirection direction, int type, int state,bool visible );	
				CBrick *brick  =  new  CBrick( m_hgeEngine , m_resMgr ); 
				brick->Init( x-3 , y , BRICK_RIGHT , (e_BrickType)(rand()%11) , STATE_SLEEP , true );				
				brick->MoveTo( BRICK_RIGHT , x-2 , y , 60 , 0 );
				m_area[ y ][ x-2 ] = brick;
				
				
				return true;
			}	
		}
	}
	else if( x == 11 )
	{
		for( int i = 10 ; i >=3 ; i-- )
		{
			if( m_area[ y ][ 10 ] != NULL )
				return false;			
			
			if( m_area[ y ][ i ] != NULL )
			{
				this->SaveArea();
				m_area[ y ][ x ]->SetNotSleepState();
				m_area[ y ][ x ]->MoveTo( BRICK_LEFT , i+1 , y  , -speed  , 0 );
				m_area[ y ][ i+1 ] = m_area[ y ][ x ];
				m_area[ y ][ i+1 ]->SetBeCheckLinked();

				m_area[ y ][ x+1 ]->MoveTo( BRICK_LEFT , x , y , -150 , 0 );
				m_area[ y ][ x ] = m_area[ y ][ x+1 ];

				m_area[ y ][ x+2 ]->MoveTo( BRICK_LEFT , x+1 , y , -80 , 0 );
				m_area[ y ][ x+1 ] = m_area[ y ][ x+2 ];
				
				CBrick *brick  =  new  CBrick( m_hgeEngine , m_resMgr ); 
				brick->Init( x+3 , y , BRICK_RIGHT , (e_BrickType)(rand()%11) , STATE_SLEEP , true );				
				
				brick->MoveTo( BRICK_LEFT , x+2 , y , -60 , 0 );
				m_area[ y ][ x+2 ] = brick;

				return true;
			}
			
		}	
	}	
	else if( y == 2 )
	{
		for( int i = 3 ; i <= 10 ; i++ )
		{
			if( m_area[ 3 ][ x ] != NULL )
				return false;	

			if( m_area[ i ][ x ] != NULL )
			{
				this->SaveArea();
				m_area[ y ][ x ]->SetNotSleepState();
				m_area[ y ][ x ]->MoveTo( BRICK_DOWN , x , i-1 , 0 , speed );
				m_area[ i-1 ][ x ] = m_area[ y ][ x ];
				m_area[ i-1 ][ x ]->SetBeCheckLinked();

				m_area[ y-1 ][ x ]->MoveTo( BRICK_DOWN , x , y , 0 ,150 );
				m_area[ y ][ x ] = m_area[ y-1 ][ x ];

				m_area[ y-2 ][ x ]->MoveTo( BRICK_DOWN , x , y-1 , 0 ,80  );
				m_area[ y-1 ][ x ] = m_area[ y-2 ][ x ];
				
				CBrick *brick  =  new  CBrick( m_hgeEngine , m_resMgr ); 
				brick->Init( x , y-3 , BRICK_DOWN , (e_BrickType)(rand()%11) , STATE_SLEEP , true );				
				brick->MoveTo( BRICK_DOWN , x , y-2 , 0 , 60 );
				m_area[ y-2 ][ x ] = brick;
				
				return true;
			}			
		}
	}
	else if( y == 11 )

⌨️ 快捷键说明

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