📄 cgamearea.cpp
字号:
{
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 + -