µ±Ç°Î»ÖãºÊ×Ò³ > 03FunCodeÓÎÏ·Éè¼Æ+C++¿Î³ÌÉè¼Æ - ƴͼÓÎÏ·
µô¡°¿Õ¸ñ¿ªÊ¼¡±¾«Áé¡£ÔÚ²½Öè2µÄº¯ÊýÀïÃæÌí¼ÓÏÂÃæµÄ´úÂ룺
if( KEY_SPACE == iKey && 0 == m_iGameState ) {
}
m_iGameState =
1;
// Òþ²ØÌáʾ¿ªÊ¼ÎÄ×Ö
m_spGameBegin->SetSpriteVisible(0);
4¡¢ ½øÈëMain.cppº¯ÊýÀïÃæ£¬½«ÏµÍ³²¶»ñµ½µÄ¼üÅ̰´ÏÂÏûÏ¢µÄ²ÎÊý´«¸øÎÒÃÇ×Ô¶¨ÒåµÄº¯
Êý£¬ÐèÒªÔÚOnKeyDownº¯ÊýÀïÃæÌí¼ÓÏÂÃæÒ»ÐдúÂ룺
g_GameMain.OnKeyDown(iKey,bAltPress,bShiftPress,bCtrlPress);
ÖÁ´Ë£¬±¾ÊµÑé½áÊø¡£
ʵÑéÈý ³õʼ»¯Ëæ»úÏÔʾ·½¿é
¡¾ÊµÑéÄÚÈÝ¡¿
²½ÖèÒ»¡¢Ìí¼ÓÒ»¸ö4x4µÄ¶þάÊý×飬½«Í¼°¸·Ö³É15·Ý£¬Ëæ»ú°Ú·Å£¬Ê£ÏÂÒ»¸öλÖÃÁô¿Õ£¬ÓÃÓÚÒÆ¶¯·½¿é¡£
¡¾ÊµÑé˼·¡¿
ÓÎÏ·µÄÔÀíÊÇÔÚÒ»¸ö4 * 4µÄ·½¿é¾ØÕó(¶þάÊý×é)£¬Ç°15¸öµÄÖµ°´Ë³Ðò´Ó1-15ÒÀ´ÎµÝÔö£¬µÚ16¸öÁô¿Õ£¬ÎÒÃÇÉèÖÃΪһ¸öÃû³ÆÎª¡°NULL¡±µÄ¾«Áé¡£°´ÕÕÕâ¸ö˳ÐòÅÅÁеľØÕóÖµ´ú±íÓÎϷʤÀû¡£
¾«ÁéÃû³ÆÒÀ´ÎÊÇPictureBlock1£¬PictureBlock2¡PictureBlock15¡£Òò´Ë£¬³õʼ»¯µÄʱºò£¬ÓÃÒ»¸öÊý×éiRandData˳Ðò±£´æ1µ½15£¬¶ÔÓ¦±íʾ15¸ö·½¿é¾«Áé¡£ÔÙÓÃÒ»¸ö¶þάÊý×ém_iBlockState[4][4]±íʾÕâ16¸öλÖá£
ÿ´ÎËæ»ú´ÓiRandDataÖÐȡһ¸öÖµ£¬¸³¸øm_iBlockState£¬±íʾij¸öλÖ÷ÅÖÃÄÄÕÅ·½¿éͼƬ¡£
ΪÁ˱£Ö¤Í¬Ò»ÕÅ·½¿éͼƬ²»»á±»Öظ´Ê¹Óã¬Ã¿´Î´ÓiRandDataËæ»úȡһ¸öÖµÒԺ󣬽«¸ÃËæ»úÊýºóÃæµÄÊý×éÖµÍùÇ°ÒÆÒ»Î»£¬²¢ÇÒÊý×é´óС¼õ1¡£
¡¾ÊµÑéÖ¸µ¼¡¿
1¡¢ ½øÈëLessonX.hÀïÃæ£¬Ìí¼ÓÈçϵıäÁ¿ÉùÃ÷£º
1£© Ìí¼Ó³ÉÔ±±äÁ¿ÉùÃ÷£º
static const float µÄÆðÊ¼×ø±ê static const float static const float int
m_fBlockStartY m_fBlockSize ;
;
// ÆÁÄ»¸ß¶È75 / 4¿é = 18.75ÿ¿éµÄ´óС.
//
¶þάÊý×飬´æ´¢N*NµÄ
m_fBlockStartX;// °´·½¿é´óС£¬ÔÚ±à¼Æ÷Àï°Ú·ÅµÄµÚÒ»¿é·½¿é
±à¼Æ÷ÀïÔ¤ÏȰڷźõķ½¿é¿íºÍ¸ß±ØÐëÓë´ËÖµÒ»ÖÂ
m_iBlockState[BLOCK_COUNT][BLOCK_COUNT]; ¾ØÕ󷽿éÐÅÏ¢
CSprite* m_spBlock[BLOCK_COUNT*BLOCK_COUNT];//·½¿é¾«Áé
×¢Ò⣬m_fBlockStartX£¬m_fBlockStartY£¬m_fBlockSizeÈý¸ö±äÁ¿ÊDz»ÄܸıäµÄ£¬
Òò´ËÎÒÃÇÐèÒª½«ËüÃÇÉèÖÃΪconstÀàÐÍ£¬constÔÚc++ÀïÃæ±íʾֻ¶Á£¬¼´ºóÃæ³Ì
ÐòÖ»ÄܶÁȡʹÓÃËüµÄÖµ¶ø²»ÄÜ¶ÔÆä½øÐи³Öµ¸Ä±ä¡£C++ÀàÖеijÉÔ±±äÁ¿Èç¹ûÊÇconstÀàÐÍ£¬ÔòÐèÒªÔÚÆäÇ°Ãæ¼ÓÉÏÒ»¸östaticµÄÉùÃ÷£¬¼´¾²Ì¬±äÁ¿µÄÉùÃ÷£¬ÕâÑù£¬ÎÒÃDzÅÄÜÔÚcppÎļþÀïÃæÊ¹ÓÃÕâ¸ö±äÁ¿¡£ 2£© Ìí¼ÓBLOCK_COUNTµÄ#defineÉùÃ÷£º
ÔÚLessonX.hµÄ#includeºóÃæÌí¼ÓÏÂÃæÒ»ÐУº
#define BLOCK_COUNT
4
// N * N µÄ¾ØÕ󷽿é,Ò»¸öNµÄ´óС
#defineÏ൱ÓÚ¸æËß±àÒëÆ÷£¬Èç¹ûÓöµ½BLOCK_COUNTÔòËüÏ൱ÓëÒ»¸öintÀàÐ͵ıäÁ¿£¬ÇÒֵΪ4¡£Ê¹ÓÃ#define¿ÉÒÔ·½±ã¸Ä±äÎÒÃÇÐèÒªµÄÖµ¡£
2¡¢ ½øÈëLessonX.cppÖÐÔÚ×îºóÃæÌí¼ÓÏÂÃæµÄ³ÉÔ±±äÁ¿µÄÉùÃ÷£º
const float CGameMain::m_fBlockSize=18.75f; const float CGameMain::m_fBlockStartX=-40.625f; const float CGameMain::m_fBlockStartY=-28.125f;
ÒòΪÕâÈý¸ö±äÁ¿µÄÀàÐÍÊÇconstÀàÐÍ£¬Òò´ËÎÒÃDz»ÄÜÔÚ¹¹Ô캯ÊýÀïÃæ¶¨ÒåËü£¬ÐèÒªµ¥¶ÀÄóöÀ´½øÐж¨Òå¡£Ï൱ÓÚcÀïÃæµÄÈ«¾Ö±äÁ¿µÄ¶¨Òå¡£
3¡¢ ½øÈëLessonX.cppÖеÄGameInitº¯ÊýÀïÃæÌîд³õʼ»¯´úÂë¡£
1£© ÌîдÏÂÃæ¼¸ÐбäÁ¿µÄ¶¨Ò壺
int int
iLoopX
= 0, iLoopY
= 0, iLoop = 0;
iOneIndex = 0, iRandIndex = 0;
// ÓÃ×öËæ»úµÄÊý×飬µ±Ëæ»ú³éÈ¡µ½´ËÊý×éÖеÄÒ»¸öʱ£¬±ÈÈçËæ»úµ½µÚÎå¸ö£¬Ôò½«µÚÎå¸öÈ¡³öÀ´ÓÃ
// µÚÎå¸öºóÃæµÄÊý×é¶¼ÍùÇ°ÒÆ¶¯Ò»Î»,½«µÚÎå¸ö¸²¸Çµô£¬Êý×é×ÜÊý¼õÒ»£¬Ï´ÎÔÙÔÚÕâÊ£ÓàµÄ14¸öÊýÖµÀïËæ»ú³éÈ¡
int iDataCount 12, 13, 14, 15};
=
BLOCK_COUNT * BLOCK_COUNT - 1;
int iRandData[BLOCK_COUNT * BLOCK_COUNT - 1] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
iDataCountÓÃÓڼǼ·½¿éµÄÊýÄ¿£¬iRandDataÊÇÒ»¸ö¶þάÊý×飬ÀïÃæ´æ·ÅÁË1ÖÁ15µÄintÖµ£¬¶ÔÓ¦±íʾ1-15¸ö·½¿é¾«Á飬ÓÃÓÚºóÃæ¶Ô·½¿é½øÐÐËæ»úÉú³É¡£Ã¿´ÎËæ»ú´Ó´ËÊý×éÖгéȡһ¸öÖµ£¬±ÈÈçËæ»úµ½µÚÎå¸ö£¬Ôò½«µÚÎå¸öÈ¡³öÀ´Ó㬵ÚÎå¸öºóÃæµÄÊý×é¶¼ÍùÇ°ÒÆ¶¯Ò»Î»,½«µÚÎå¸ö¸²¸Çµô£¬Êý×é×ÜÊý¼õÒ»£¬Ï´ÎÔÙÔÚÕâÊ£ÓàµÄ14¸öÊýÖµÀïËæ»ú³éÈ¡¡£ÕâÑù×öµÄºÃ´¦ÊÇÈ·±£²»»áÖØ¸´Á½´ÎÒÔÉÏʹÓÃͬһ¸ö·½¿é¡£
2£© ÓÉÓÚÎÒÃÇÓÃÓڼǼ·½¿éλÖõijÉÔ±±äÁ¿ÊÇÒ»¸ö¶þάÊý×ém_iBlockState£¬¶øÎÒÃÇ
ÓÃÓÚ±£´æËùÓз½¿é¾«ÁéµÄÊý×éÊÇÒ»¸öһάÊý×飬ËùÒÔÏÂÃæÎÒÃÇÐèÒªÓõ½Ò»Ð©×Ô¶¨ÒåµÄº¯ÊýÓÃÓÚ´Ó¶þάÊý×éת»»µ½Ò»Î¬Êý×é¡£Æäʵ¶þάÊý×éµÄ´æ·ÅÔÚÄÚ´æÀïÃæÒ²ÊÇÁ¬Ðø´æ·ÅµÄ£¬ÎÒÃÇÔÚ¶ÁÈ¡ËûÃǵÄÖµµÃʱºòµ±È»¿ÉÒÔʹÓÃһάÊý×éµÄ·½·¨À´¶ÁÈ¡Ëü£¬Ö»²»¹ýÕâÀïÐèÒª½øÐÐÊý×éϱêÊýÖµµÄÏàÓ¦¸Ä±ä¡£Àý£º¶þάÊý×éa[x][y]ת»»ÎªÒ»Î¬Êý×éµÄ¼ÆËã·½·¨ÊÇ£ºx* ¶þάÊý×éÖÐÿÐеÄÔªËØÊý+y¡£
½øÈëLessonX.hÖÐÌí¼ÓÎÒÃÇ×Ô¶¨ÒåµÄ¶þάÊý×éË÷Òýת»»³ÉһάÊý×éË÷ÒýµÄº¯ÊýXYToOneIndexÉùÃ÷£º
int XYToOneIndex( const int iIndexX, const int iIndexY );
½øÈëLessonX.cppÖÐÌí¼ÓÉÏÃæº¯ÊýµÄ¶¨Ò壺
int CGameMain::XYToOneIndex( const int iIndexX, const int iIndexY ) {
return (iIndexY * BLOCK_COUNT + iIndexX);
}
4¡¢ ÎÒÃÇʹÓÃÁ½¸öforÑ»·À´±éÀú¶þάÊý×飬µÚÒ»¸öforÑ»·±éÀú¶þάÊý×ém_iBlockState
µÄµÚ¶þ¸öϱ꣬µÚ¶þ¸öforÑ»·±éÀú¶þάÊý×ém_iBlockStateµÄµÚÒ»¸öϱꡣÔÚGameIintº¯ÊýÀïÃæÌí¼ÓÏÂÃæµÄ´úÂ룺
for( iLoopY = 0; iLoopY < BLOCK_COUNT; iLoopY++ )
{
}
for( iLoopX = 0; iLoopX < BLOCK_COUNT; iLoopX++ ) { }
5¡¢ ÎÒÃÇÊ×ÏÈÓøոÕÎÒÃÇ×Ô¶¨ÒåµÄÊý×éϱêת»»º¯ÊýXYToOneIndex½«¶þάÊý×éϱêת
»»³ÉһάÊý×éµÄϱꡣÔÚfor( iLoopX = 0; iLoopX < BLOCK_COUNT; iLoopX++ )ÀïÃæÌîдÏÂÃæµÄ´úÂ룺
iOneIndex =
XYToOneIndex( iLoopX, iLoopY );
iOneIndex¼´ÊǶþάÊý×éÔÚһάÊý×éÀïÃæµÄϱêÖµ¡£
1£© Èç¹û±éÀúµ½Êý×éµÄ×îºóÒ»¸ö£¬ÎÒÃǾͽ«ÆäÉ趨Ϊ¿Õλ¾«Á飬ËüµÄÃû³ÆÎªNULL¡±£¬
ºóÃæÎÒÃÇÖ»ÒªÅжÏÒ»¸ö¾«ÁéµÄÖÜΧÓÐûÓÐÃû³ÆÎª¡±NULL¡±µÄ¾«Áé¾Í¿ÉÒÔÖªµÀËûÖÜΧÊÇ·ñÓпÕ룬ËüÔÚ¶þάÊý×éÖеÄÖµÒÔ0À´´úÌæ¡£Ìí¼ÓÏÂÃæµÄ´úÂ룺 // Êý×éµÄ×îºóÒ»¸ö if( BLOCK_COUNT - 1 == iLoopX && BLOCK_COUNT - 1 == iLoopY )
{ }
m_iBlockState[iLoopY][iLoopX] = 0;
m_spBlock[iOneIndex] = new CSprite(\
2£© Èç¹ûûÓбéÀúµ½×îºóÒ»¸öλÖã¬ÎÒÃÇËæ»ú´ÓiRandDataȡһ¸öÖµ¸³¸ø
m_iBlockState£¬²¢ÇÒ¸ø¶ÔÓ¦Ãû×ֵľ«ÁéÊý×ém_spBlock³õʼ»¯£¬Í¬Ê±½«¸Ã¾«ÁéÒÆ¶¯µ½¶ÔÓ¦µÄλÖá£Ìí¼ÓÏÂÃæ´úÂ룺
else
{
// ÔÚµ±Ç°Ê£ÓàδʹÓõ½µÄÊýÖµÀïËæ»úÒ»¸ö³öÀ´,¸³Öµ¸ø¶þάÊý×é iRandIndex
=
CSystem::RandomRange( 0, iDataCount - 1 );
m_iBlockState[iLoopY][iLoopX] = iRandData[iRandIndex]; }
m_spBlock[iOneIndex]=new CSprite(tmpName); // ½«¸Ã¾«ÁéÒÆ¶¯µ½¶ÔÓ¦µÄλÖÃ
MoveSpriteToBlock( m_spBlock[iOneIndex], iLoopX, iLoopY );
char* tmpName=CSystem::MakeSpriteName(\
ÔÚÕâÀïÎÒÃÇÐèÒªÌí¼ÓÒ»¸öÒÆ¶¯¾«Áéµ½ÌØ¶¨Î»Öõĺ¯ÊýMoveSpriteToBlock¡£½øÈëLessonX.hÖÐÌí¼Óº¯ÊýµÄÉùÃ÷£º
void MoveSpriteToBlock( CSprite *tmpSprite, const int iIndexX, const int iIndexY ); ½øÈëLessonX.cppÖÐÌí¼Ó¸Ãº¯ÊýµÄ¶¨Ò壺
void CGameMain::MoveSpriteToBlock( CSprite *tmpSprite, const int iIndexX, const int iIndexY )
{
float fPosX float fPosY }
= =
m_fBlockStartX + iIndexX * m_fBlockSize; m_fBlockStartY + iIndexY * m_fBlockSize;
tmpSprite->SetSpritePosition(fPosX, fPosY );
3£© ÓÉÓÚÊÇËæ»ú´ÓiRandDataÊý×éÀïÃæÈ¡Ò»¸öÊý¸³¸øm_iBlockState£¬ËùÒÔÎÒÃÇÿ´Î
¸³Ò»¸öÐèÒª½«iRandDataÊý×éºóÃæµÄÖµÍùÇ°ÃæÒÆ¶¯¸²¸Çµô¸ÄÖµ¡£Òò´ËÎÒÃÇÐèÒªÓÃforÑ»·£¬½«³éÈ¡µ½µÄË÷ÒýiRandIndexºóÃæµÄÊý×éÖµÒÀ´ÎÍùÇ°ÒÆ¶¯Ò»Î»£¬Í¬Ê±·½¿é×ÜÊýÄ¿¼õÒ»¡£´úÂëÈçÏ£º
for( iLoop = iRandIndex; iLoop < iDataCount - 1; iLoop++ )
{ }
// Ê£ÓàÓÐЧֵ×ÜÊý¼õÒ» iDataCount--;
iRandData[iLoop] = iRandData[iLoop + 1];
ÖÁ´Ë£¬±¾ÊµÑé½áÊø¡£
ʵÑéËÄ ÒÆ¶¯·½¿é
¡¾ÊµÑéÄÚÈÝ¡¿
²½ÖèÒ»¡¢»ñÈ¡Êó±êµ¥»÷ÏûÏ¢ ²½Öè¶þ¡¢ÅжÏÊó±êµã»÷µÄ·½¿é
²½ÖèÈý¡¢ÅжÏÖÜΧÊÇ·ñÓпÕ룬Òƶ¯·½¿é ¡¾ÊµÑé˼·¡¿
±éÀúһάÊý×ém_spBlock£¬Ê¹ÓÃIsPointInSprite º¯ÊýÅжϵ±Ç°Êó±ê×ø±êÊÇ·ñλÓÚij¸öÃû×ֵľ«ÁéÄÚ²¿¡£Èç¹ûÕÒµ½Ä³¸öÃû×ֵľ«Áé±»µã»÷ÖУ¬Ç뽫µ±Ç°Ñ»·±äÁ¿iLoop¸³Öµ¸øiClickIndex¡£ÔÙÅжϸ÷½¿é¾«ÁéÖÜΧÓÐûÓÐÃû³ÆÎª¡°NULL¡±µÄ¾«Á飬ÓеÄÓеϰÒƶ¯µ½¸ÃλÖᣠ¡¾ÊµÑéÖ¸µ¼¡¿
1¡¢ ½øÈëLessonX.hÖÐÌí¼ÓÎÒÃÇ×Ô¶¨ÒåµÄ´¦ÀíÊó±êµ¥»÷µÄº¯ÊýÉùÃ÷£º
void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY ); 2¡¢ ½øÈëLessonX.cppÖÐÌí¼Ó¸Ãº¯ÊýµÄ¶¨Òå:
void CGameMain::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY ) { }
3¡¢ ÅжÏÓÎÏ·ÊÇ·ñÕýÔÚ½øÐУ¬ÔÚÉÏÃæµÄº¯ÊýÀïÃæÌí¼ÓÏÂÃæµÄ´úÂ룺
// Ö»´¦ÀíÓÎÏ·½øÐÐÖеÄÊó±êÏìÓ¦ if( 2 != m_iGameState )
return;
4¡¢ »ñÈ¡Êó±êµã»÷µÄ×ø±ê£¬Ê¹ÓÃÒ»¸öforÑ»·±éÀú´æ´¢ËùÒÔ·½¿é¾«ÁéµÄһάÊý×é
m_spBlock£¬ÅжϸÃ×ø±êÊÇ·ñÔÚijһ¸ö·½¿é¾«ÁéÖУ¬ÊǵϰµÃµ½¸Ã¾«ÁéµÄϱêÖµ¡£
Ìí¼ÓÏÂÃæµÄ´úÂ룺
int iClickIndex int iLoop
= =
-1; 0;
for( iLoop = 0; iLoop < BLOCK_COUNT * BLOCK_COUNT; iLoop++ )
¹²·ÖÏí92ƪÏà¹ØÎĵµ