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