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

📄 cgamearea.cpp

📁 我在资源网上发布的一个brickshorterjr的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		for( int i = 10 ; i >= 3 ; i-- )
		{
			if( m_area[ 10 ][ x ] != NULL )
				return false;
			
			if( m_area[ i ][ x ] != NULL )
			{
				this->SaveArea();
				m_area[ y ][ x ]->SetNotSleepState();
				m_area[ y ][ x ]->MoveTo( BRICK_UP , 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_UP , x , y , 0 ,-150  );
				m_area[ y ][ x ] = m_area[ y+1 ][ x ];

				m_area[ y+2 ][ x ]->MoveTo( BRICK_UP , 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_UP , (e_BrickType)(rand()%11) , STATE_SLEEP , true );				
				brick->MoveTo( BRICK_UP , x , y+2 , 0 , -60 );
				m_area[ y+2 ][ x ] = brick;
				
				return true;
			}			
		}
	}
	return false;
}

void    CGameArea::CheckBrick( int arrayX, int arrayY  )
{
	switch( m_area[ arrayY ][ arrayX ]->GetType() )
	{
	case BRICK_BOMB:
		m_sound->SoundGame( SOUND_GAME_BOMB );
		m_render->AddGamePar( GAME_BOMB , m_area[ arrayY ][ arrayX ]->GetX() + TILE_SIZE/2, m_area[ arrayY ][ arrayX ]->GetY() + TILE_SIZE/2 );		
		DealBombBrick( arrayX, arrayY );
		break;

	case BRICK_LIGHT:
		m_render->AddGamePar( GAME_LIGHT , m_area[ arrayY ][ arrayX ]->GetX() + TILE_SIZE/2, m_area[ arrayY ][ arrayX ]->GetY() + TILE_SIZE/2 );
		DealLightBrick( arrayX, arrayY );
		m_sound->SoundGame( SOUND_GAME_LIGHT );
		break;

	case BRICK_COLOR:
		DealColorBrick( arrayX, arrayY );
		m_sound->SoundGame( SOUND_GAME_COLOR );
		break;	
		
	case BRICK_ARROW_CHANGER:
		m_render->AddGamePar( GAME_DIR , m_area[ arrayY ][ arrayX ]->GetX() + TILE_SIZE/2, m_area[ arrayY ][ arrayX ]->GetY() + TILE_SIZE/2 );		
		DealArrowBrick( arrayX, arrayY );
		m_sound->SoundGame( SOUND_GAME_DIRCHANGE );
		break;
		
	case BRICK_UNIVERSAL:
		{
			for(int type = BRICK_RED; type <= BRICK_PINK; type++ )
			{
				CheckLinked( arrayX , arrayY , (e_BrickType)type , LINK_NODIRECTION );	
				if( m_LinkedBrick.size() >= 3 )
				{
					for( list<CBrick*>::iterator i = m_LinkedBrick.begin();  i != m_LinkedBrick.end(); i++ )
					{
						m_render->AddGamePar( GAME_EXPL, (*i)->GetX() + TILE_SIZE/2, (*i)->GetY() + TILE_SIZE/2, (int)(*i)->GetType() );
						this->KillBrick( (*i)->GetArrayX(), (*i)->GetArrayY() );
					}		
					m_sound->SoundGame( SOUND_GAME_EXPL , m_LinkedBrick.size() );
					m_LinkedBrick.clear();
					break;
				}
				else
				{
					m_LinkedBrick.clear();
				}
			}
			break;
		}
	
	default:			
		CheckLinked( arrayX , arrayY , m_area[ arrayY ][ arrayX ]->GetType() , LINK_NODIRECTION );
		
		if( m_LinkedBrick.size() >= 3 )
		{
			for( list<CBrick*>::iterator i = m_LinkedBrick.begin();  i != m_LinkedBrick.end(); i++ )
			{
				m_render->AddGamePar( GAME_EXPL, (*i)->GetX() + TILE_SIZE/2, (*i)->GetY() + TILE_SIZE/2, (int)(*i)->GetType() );
				this->KillBrick( (*i)->GetArrayX(), (*i)->GetArrayY() );
			}			
			m_sound->SoundGame( SOUND_GAME_EXPL , m_LinkedBrick.size());
			m_LinkedBrick.clear();
		}
		else
		{
			m_LinkedBrick.clear();
		}
		
		break;
	}
}

void    CGameArea::CheckLinked( int arrayX, int arrayY, e_BrickType type , e_LinkDirection direction )
{
	if( arrayX <=2 || arrayX >= 11 || arrayY <= 2 || arrayY >= 11 )
		return;
	
	if( m_area[ arrayY ][ arrayX ] != NULL && ( m_area[ arrayY ][ arrayX ]->GetType() == type || m_area[ arrayY ][ arrayX ]->GetType() == BRICK_UNIVERSAL ) )
	{	
		m_LinkedBrick.push_back( m_area[ arrayY ][ arrayX ] );
	}
	
	if( direction != LINK_LEFT )//turn right
	{	
		if( m_area[ arrayY ][ arrayX +1 ] != NULL )
		{
			if( type == m_area[ arrayY ][ arrayX +1 ]->GetType() || BRICK_UNIVERSAL == m_area[ arrayY ][ arrayX + 1 ]->GetType() )
			{
				CheckLinked( arrayX + 1 , arrayY , type , LINK_RIGHT );	
			}
		}
	}
	
	if( direction != LINK_RIGHT )//turn left
	{	
		if( m_area[ arrayY ][ arrayX - 1 ] != NULL )
		{
			if( type == m_area[ arrayY ][ arrayX - 1 ]->GetType() || BRICK_UNIVERSAL == m_area[ arrayY ][ arrayX - 1 ]->GetType() )
			{
				CheckLinked( arrayX - 1 , arrayY , type , LINK_LEFT );	
			}
		}
	}
	
	if( direction != LINK_DOWN )//turn up
	{
		if( m_area[ arrayY + 1 ][ arrayX ] != NULL )
		{
			if( type == m_area[ arrayY + 1 ][ arrayX ]->GetType() || BRICK_UNIVERSAL == m_area[ arrayY +1 ][ arrayX ]->GetType() )
			{
				CheckLinked( arrayX , arrayY + 1 , type , LINK_UP );	
			}			
		}
	}
	
	if( direction != LINK_UP )//turn down
	{
		if( m_area[ arrayY - 1 ][ arrayX ] != NULL )
		{
			if( type == m_area[ arrayY - 1 ][ arrayX ]->GetType() || BRICK_UNIVERSAL == m_area[ arrayY - 1 ][ arrayX ]->GetType() )
			{
				CheckLinked( arrayX , arrayY - 1 , type , LINK_DOWN );	
			}			
		}
	}
}

void    CGameArea::KillBrick( int arrayX, int arrayY )
{
	SAFE_DELETE( m_area[ arrayY  ][ arrayX ] );
}

//=========================================================================
//	Name:Render
//	Desc:Render all the things
//
//=========================================================================
void    CGameArea::Render( HTARGET target )
{
	if( target == 0 )
	{
		m_hgeEngine->Gfx_BeginScene();
	}
	else
	{
		m_hgeEngine->Gfx_BeginScene( target );
	}

	m_hgeEngine->Gfx_Clear( 0 );
	m_render->RenderGameBackground();


	
	for( int i = 0; i < AREA_HEIGHT; ++ i )
	{
		for( int j = 0; j < AREA_WIDTH; ++ j )
		{
			if( m_area[i][j] )
			{
				if( i <= 2 || j <= 2 || i >= 11 || j >= 11  )					
					m_area[i][j]->Render();
				else if( !m_bRotate && !m_bRotateSmall )
					m_area[i][j]->Render();
			}
		}
	}

	m_render->RenderGameBackgroundUp();

	m_gui->Render();

	m_render->RenderStatus( this->m_score, this->m_level );

	//Play the rotating effect
	if( m_bRotate || m_bRotateSmall )
	{
		if( m_bRotate )
		{
			if( m_render->RenderRotate( m_RotateDir ) )
			{
				m_bRotate = false;
				m_bRotateSmall = true;
			}
		}
		else
		{		
			float dt = m_hgeEngine->Timer_GetDelta();
			float temp_angle;
			if( m_RotateDir == 1)
			{
				static float angle = M_PI/2;
				angle -= dt*2.9;
				if( angle < 0 )
				{
					m_bRotateSmall = false;
					angle = M_PI/2;
				}
				temp_angle = angle;
			}
			else
			{
				static float angle = -M_PI/2;
				angle += dt*2.9;
				if( angle > 0 )
				{
					m_bRotateSmall = false;
					angle = -M_PI/2;
				}
				temp_angle = angle;
			}

			if( m_bRotateSmall )
			for( int i = 3; i <= 10; ++ i )
			{
				for( int j = 3; j <= 10; ++ j )
				{
					if( m_area[i][j] )
					{
						m_area[i][j]->RenderRotate( temp_angle );		
					}
				}
			}	
		}
	}

	m_render->RenderPar();

	m_render->RenderMouse(m_mouseX, m_mouseY);

	m_render->RenderStarAlpah();

	m_hgeEngine->Gfx_EndScene();
}

void    CGameArea::SrcToArray()
{
	m_arrayX = (int)( ( m_mouseX - AREA_BEGIN_X ) / TILE_SIZE ); 
	m_arrayY = (int)( ( m_mouseY - AREA_BEGIN_Y ) / TILE_SIZE ); 
}

void    CGameArea::DealArrowBrick( int arrayX, int arrayY )
{
	SAFE_DELETE( m_area[arrayY][arrayX] );
	
	int record[10];
	memset(record,0,sizeof(record));
	
	for( int y = arrayY-1; y <= arrayY+1; y ++ )
	{
		for( int x = arrayX-1; x <= arrayX+1; x ++ )
		{
			if( x <= 2 || x >= 11 || y <= 2 || y>= 11 )//the brick is not in the edge
				continue;
			
			if( m_area[y][x] )
			{
				while(1)
				{
					int direction = rand()%5;
					if( !record[direction] )
					{
						m_area[y][x]->SetDirection( (e_BrickDirection)direction );
						//m_area[y][x]->SetDirection( BRICK_RIGHT );
						if( direction != 0 )
							record[direction] = 1;
						break;
					}
					else
					{
						continue;
					}
				};//while
			}//if
		}//for
	}//for
}

void    CGameArea::DealBombBrick( int arrayX, int arrayY )
{
	SAFE_DELETE( m_area[arrayY][arrayX] );	
	
	for( int y = arrayY-1; y <= arrayY+1; y ++ )
	{
		for( int x = arrayX-1; x <= arrayX+1; x ++ )
		{
			if( x <= 2 || x >= 11 || y <= 2 || y>= 11 )//the brick is not in the edge
				continue;
			
			if( m_area[y][x] )
				SAFE_DELETE( m_area[y][x] );
		}
	}
}

void    CGameArea::DealColorBrick( int arrayX, int arrayY )
{
	SAFE_DELETE( m_area[arrayY][arrayX] );		
	for( int y = arrayY-1; y <= arrayY+1; y ++ )
	{
		for( int x = arrayX-1; x <= arrayX+1; x ++ )
		{
			if( x <= 2 || x >= 11 || y <= 2 || y>= 11 )//the brick is not in the edge
				continue;
			if( m_area[y][x] )
			{
				m_area[y][x]->RandSetType();
				m_area[y][x]->SetBeCheckLinked();
				m_render->AddGamePar( GAME_CHANGE, m_area[y][x]->GetX() + TILE_SIZE/2, m_area[y][x]->GetY() + TILE_SIZE/2, m_area[y][x]->GetType()  );
				
			}
		}
	}	
}

void    CGameArea::DealLightBrick( int arrayX, int arrayY )
{
	for( int y = 3; y <= 10; y ++ )
	{
		if( m_area[y][arrayX] )
		{
			m_render->AddGamePar( GAME_EXPL, m_area[y][arrayX]->GetX() + TILE_SIZE/2, m_area[y][arrayX]->GetY() + TILE_SIZE/2, (int)m_area[y][arrayX]->GetType() );
			SAFE_DELETE( m_area[y][arrayX] );			
		}
	}
	for( int x = 3; x <= 10; x ++ )
	{
		if( m_area[arrayY][x] )
		{
			m_render->AddGamePar( GAME_EXPL, m_area[arrayY][x]->GetX() + TILE_SIZE/2, m_area[arrayY][x]->GetY() + TILE_SIZE/2, (int)m_area[arrayY][x]->GetType() );
			SAFE_DELETE( m_area[arrayY][x] );
		}
	}
}


void    CGameArea::SaveArea()
{
	for(int i = 0; i < AREA_HEIGHT; ++ i )
	{
		for(int j = 0; j < AREA_WIDTH; ++ j )
		{
			SAFE_DELETE( m_save[i][j] );				
			
			if( m_area[i][j] )
			{
				CBrick *brick  =  new  CBrick( m_hgeEngine , m_resMgr );		
				brick->Init( j, i, m_area[i][j]->GetDirection(), m_area[i][j]->GetType(), m_area[i][j]->GetState(), true );
				m_save[i][j] = brick;
			}
		}
	}
}

void    CGameArea::RenewArea()
{
	for(int i = 0; i < AREA_HEIGHT; ++ i )
	{
		for(int j = 0; j < AREA_WIDTH; ++ j )
		{	
			SAFE_DELETE( m_area[i][j] );
			
			if( m_save[i][j] )
			{
				CBrick *brick  =  new  CBrick( m_hgeEngine , m_resMgr );		
				brick->Init( j, i, m_save[i][j]->GetDirection(), m_save[i][j]->GetType(), m_save[i][j]->GetState(), true );
				m_area[i][j] = brick;
			}
		}
	}
}

bool    CGameArea::IsWin()
{
	for(int i = 3; i <= 10; ++ i )
	{
		for(int j = 3; j <= 10; ++ j )
		{	
			if( m_area[i][j] != NULL )
				return false;
		}
	}
	return true;
}


void    CGameArea::TurnLeft()
{
	int i,j;

	e_BrickDirection direction;

	for( i = 3; i <= 10; i++ )
	{
		for( j = 3; j <= 10; j++ )
		{	
			if( m_area[i][j] )
			{
				CBrick *brick  =  new  CBrick( m_hgeEngine , m_resMgr );

				direction = m_area[i][j]->GetDirection();
				if( direction != BRICK_NODIR1 )
				{
					direction = (e_BrickDirection)(direction+1);
				}
				if( direction >= 5 )
				{
					direction = BRICK_RIGHT;
				}

				brick->Init( i,13-j, direction, m_area[i][j]->GetType(), m_area[i][j]->GetState(), true );
				m_turn[ 13-j ][i] = brick;
				SAFE_DELETE( m_area[i][j] );
			}
		}
	}


	for( i = 3; i <= 10; i++ )
	{
		for( j = 3; j <= 10; j++ )
		{	
			m_area[i][j]  =  m_turn[i][j];
			m_turn[i][j]  =  NULL;
		}
	}
}

void    CGameArea::TurnRight()
{
	int i,j;

	e_BrickDirection direction;

	for( i = 3; i <= 10; i++ )
	{
		for( j = 3; j <= 10; j++ )
		{	
			if( m_area[i][j] )
			{
				CBrick *brick  =  new  CBrick( m_hgeEngine , m_resMgr );
				
				direction = m_area[i][j]->GetDirection();
				
				if( direction != BRICK_NODIR1 )
				{
					direction = (e_BrickDirection)(direction-1);
					
					if( direction <= 0 )
					{
						direction = BRICK_DOWN;
					}					
				}
								
				brick->Init( 13-i,j,direction , m_area[i][j]->GetType(), m_area[i][j]->GetState(), true );
				m_turn[ j ][13-i] = brick;
				SAFE_DELETE( m_area[i][j] );
			}
		}
	}


	for( i = 3; i <= 10; i++ )
	{
		for( j = 3; j <= 10; j++ )
		{	
			m_area[i][j]  =  m_turn[i][j];
			m_turn[i][j]  =  NULL;
		}
	}
}

void    CGameArea::SaveScreen()
{
	m_hgeEngine->Gfx_BeginScene( *m_render->GetSaveTarget() );		
	m_hgeEngine->Gfx_Clear(ARGB(0,0,0,0));
	for(int i = 3; i <= 10; i++ )
	{
		for(int j = 3; j <= 10; j++ )
		{
			if( m_area[i][j] )
			{
				m_area[i][j]->RenderToBuffer();
			}
		}
	}
	m_hgeEngine->Gfx_EndScene();
	m_render->SaveToTexture();
}

⌨️ 快捷键说明

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