{
// Ö´ÐÐÎÒ·½Õ½»úµÄÑ»·Tickº¯Êý if( m_pMyFighter )
m_pMyFighter->OnFire( fDeltaTime );
}
6¡¢µ«ÊÇÎÒÃÇ×Óµ¯Òª·¢Éä×Óµ¯Ö»Óе±¿Õ¸ñ¼ü°´ÏÂÉèÖÃCMyFighterµÄm_bCanFireֵΪ
true¡£ÔÚOnKeyDown·½·¨ÖÐÌí¼ÓÈçÏ´úÂ룻
// ÓÎÏ·½øÐÐÖУ¬°´Ï¿ոñ·¢Éä×Óµ¯
if( KEY_SPACE == iKey && NULL != m_pMyFighter ) m_pMyFighter->SetCanFire( true );
7¡¢Í¬ÀíÔÚOnKeyUpÖÐÉèÖÃm_bCanFireֵΪfalse¡£
ʵÑéÈý µÐ·½Õ½»ú
¡¾ÊµÑéÄÚÈÝ¡¿
1¡¢´´½¨Ò»¸öµÐ·½Õ½»úÀàCEnemyFighter£»
2¡¢Õ½»úÒÔ±à¼Æ÷ÖÐHorizontalSprite_Template¾«ÁéΪģ°å£» 3¡¢Ã¿¸ô5Ãë´´½¨Ò»¼ÜµÐ·½Õ½»ú£» 4¡¢µÐ·½Õ½»úÿ¸ô1Ãë·¢ÉäÒ»·¢×Óµ¯£» 5¡¢µÐ·½Õ½»ú·ÉÐÐÖÐÉÏϸ¡¶¯£»
¡¾ÊµÑé˼·¡¿
ÔËÓÃÃæÏò¶ÔÏó֪ʶ£¬´´½¨CEnemyFighterÀà¡£¸ÃÀà¾ßÓе㷽ս»úµÄÊôÐÔ£¬Õ½»ú¸ôÒ»¶¨µÄʼþ±»¸´ÖƳöÀ´£¬È»ºóÉÏϸ¡¶¯£¬¿ªÊ¼ÏòÎÒ·½Õ½»ú·¢Éä×Óµ¯£¬ÕâÑùÓÐÖúÓÚÔö¼ÓµÐ·½Õ½»úµÄɱÉËÁ¦£¬Ò²Ôö¼ÓÁËÓÎÏ·µÄȤζÐÔ¡£ ¡¾ÊµÑéÖ¸µ¼¡¿
1¡¢·ÂÕÕ·½±ãµÄ·½·¨´´½¨CEnemyFighterÀ࣬Æä¼Ì³ÐÓëCSpriteÀ࣬ÐÞ¸ÄÆä¹¹Ô캯Êý¡£ 2¡¢ÎªÀàÔöÌíÁ½¸ö¾²Ì¬±äÁ¿£¬Ò»¸ö±íʾ±íʾ´´½¨µÐ»úµÄÊýÁ¿£¬Ò»¸ö±íʾ´´½¨µÐ»úµÄʱ¼ä£»
static floatm_fCreateTime;// ´´½¨µÐ»úµÄʱ¼ä¼ä¸ô
static intm_iCreatedSpriteCount;//±íʾ´´½¨Õ½»úÊýÁ¿
²¢ÔÚLessonX.cppÎļþ×îºó½øÐгõʼ»¯£º float CEnemyFighter::m_fCreateTime = 0.f; int CEnemyFighter:: m_iCreatedSpriteCount = 0;
3¡¢ÎªCEnemyFighterÀàÌí¼ÓÒ»¸ö´´½¨µÐ·½Õ½»úµÄ¾²Ì¬·½·¨ClassTick(float fDeltaTime)¡£
1£©ÔÚEnemyFighterÀàÖÐÌí¼Óº¯ÊýµÄÉùÃ÷£º void static ClassTick( float fDeltaTime );
2£©Æä²ÎÊýΪÓÎÏ·µÄʱ¼ä¼ä¸ô¡£µ±´´½¨Õ½»úµÄʱ¼ä¼ä¸ôµÝ¼õΪ0ʱ£¬´´½¨Õ½»ú¡£²¢ÖØÐÂÉèÖÃʱ¼ä¼ä¸ôʱ¼äΪ5µ½10Ãë¡£
void CEnemyFighter::ClassTick( float fDeltaTime ) //´´½¨µÐ·½Õ½»ú {
// ÊÇ·ñµ½Ê±¼ä´´½¨
m_fCreateTime -= fDeltaTime; if( m_fCreateTime <= 0.f ) {
// Ëæ»úÒ»¸öʱ¼ä£¬×÷ΪÏ´γöÉúµÄʱ¼ä
8
ÉϺ£Èñ¸ñÈí¼þÓÐÏÞ¹«Ë¾
m_fCreateTime=(float)CSystem::RandomRange( 1, 3 ); //ÔÚÒÔÏÂÌí¼Ó´´½¨Ò»¼ÜµÐ·½Õ½»úµÄ´úÂë } }
2£©´´½¨Õ½»úʱ£¬Ö»ÐèÒªÕ½»ú²»ÏÔʾÔÚÊÀ½ç±ß½çÖ®Íâ¾Í¿ÉÒÔ£¬¼´YÖá×ø±êÔÚ±ÈÊÀ½ç±ß½çµÄÉÏϱ߽çÉÔ΢´óÒ»µãµÄ·¶Î§Ö®¼ä£¬ÔÚ´ËÎÒÃÇÉèÖñÈÊÀ½ç±ß½ç´ó10¸öÊÀ½ç×ø±êµ¥Î»¡£ÔÚClassTick·½·¨µÄif( m_fCreateTime <= 0.f )ÅжÏÖÐÌí¼ÓÒÔÏ´úÂ룺
IntiPosBase=CSystem::RandomRange((int)CSystem::GetScreenTop()+10,(int)CSystem::GetScreenBottom() - 10);
2£©È»ºóÉùÃ÷Ò»¸öCEnemyFighterÀà¶ÔÏó¡£È»ºóÉèÖõз½·É»úXÖáºÍYÖáµÄ×ø±ê,ÔÙ
´ÎÉèÖÃËÙ¶È£¬ÉèÖÃÊÀ½ç±ß½çÅöײÊôÐÔ£¬×ߺóÉèÖÃÆäÅöײģʽÒÔ¼°³õʼ»¯Æä³ÉÔ±±äÁ¿µÄÖµ¡£
charszName[MAX_NAME_LEN];
sprintf(szName,\¸øÐ½¨µÄµÐ·½Õ½»úÆðÃû m_iCreatedSpriteCount++;
CEnemyFighter *pSprite=new CEnemyFighter( szName );
pSprite->CloneSprite( \ //¿Ë¡ģ°å intiRandom=CSystem::RandomRange( iPosBase - 10, iPosBase + 10 ); floatfPosX=(int)CSystem::GetScreenRight() + 20.f; pSprite->SetSpritePosition( fPosX, (float)iRandom ); pSprite->SetSpriteLinearVelocityX( -10.f ); pSprite->SetSpriteWorldLimit(WORLD_LIMIT_KILL,
CSystem::GetScreenLeft()-10.f,CSystem::GetScreenTop(),CSystem::GetScreenRight() + 200.f, CSystem::GetScreenBottom() );
pSprite->SetSpriteCollisionActive(true,true);
pSprite->SetHp(300); pSprite->SetScore(100); pSprite->SetType(1);
ÕâÀïÓõ½sprintfº¯Êý£¬ËùÒÔÓ¦¸ÃÔÚEnemyFighter.cppÖаüº¬Í·Îļþ£º #include
4¡¢ÔÚÌí¼ÓCEnemyFighterÀàÖÐÌí¼ÓLoopTick·½·¨£¬ÊµÏÖÔÚÓÎÏ·Ñ»·Ê±£¬Õ½»ú·¢Éä×Óµ¯
ºÍÉÏϸ¡¶¯·ÉÐеŦÄÜ¡£Æä²ÎÊýΪ£¬ÓÎÏ·µÄʱ¼ä¼ä¸ô¡£
1£©Ìí¼ÓÒ»¸ö³ÉÔ±±äÁ¿£¬±íʾս»ú´´½¨Ö®ºó£¬¸ô¶à¾Ã²Å¿ÉÒÔ¿ªÊ¼·¢Éä×Óµ¯¡£È·±£·É»úÒѾ±»¿´¼û£¬²Å»á·¢Éä×Óµ¯¡£
float m_fCanFireAfterCreated;
2£©ÔÙÌí¼ÓÈý¸ö³ÉÔ±±äÁ¿£¬·Ö±ð±íʾ×Óµ¯µÄ·¢Éä¼ä¸ô£¬Õ½»ú·ÉÐÐʱÉÏϸ¡¶¯µÄʱ¼ä
¼ä¸ô£¬Õ½»ú·ÉÐÐʱÊÇÉϸ¡»¹ÊÇϸ¡¡£
float m_fBulletCreateTime; float m_fFloatTime; bool m_bFloatUp;
×¢Òâ°ÑÕâÕâЩ±äÁ¿ÔÚ¹¹Ô캯ÊýÖгõʼ»¯¡£
9
3£©È»ºóÔÚEnemyFighter.hÖÐÉùÃ÷º¯Êý£º
void LoopTick( float fDeltaTime );
ÔÚEnemyFighter.cppÖжԺ¯Êý½øÐÐʵÏÖ£º
void CEnemyFighter::LoopTick( float fDeltaTime ) { }
4£©ÔÚº¯ÊýÖÐÌí¼Ó´úÂ룬µ±±íʾս»ú´´½¨Ö®ºó£¬¸ô¶à¾Ã²Å¿ÉÒÔ¿ªÊ¼·¢Éä×Óµ¯µÄ±äÁ¿
µÝ¼õµ½Ð¡ÓÚµÈÓÚ0ʱ£¬¿ªÊ¼¿ÉÒÔ´´½¨×Óµ¯£¬È»ºó¿ªÊ¼µÝ¼õ×Óµ¯µÄ·¢Éä¼ä¸ô±äÁ¿£¬µ±µÝ¼õµ½Ð¡ÓÚµÈÓÚ0ʱ£¬Õ½»ú·¢Éä×Óµ¯¡£
m_fCanFireAfterCreated -= fDeltaTime; if( m_fCanFireAfterCreated <= 0.f ) {
m_fBulletCreateTime -= fDeltaTime; if( m_fBulletCreateTime <= 0.f ) {
m_fBulletCreateTime = 1.f;
g_GameMain.CreateBullet(GetSpritePositionX(), GetSpritePositionY()); } }
ÕâÀïÓõ½g_GameMainÕâ¸öÈ«¾Ö¶ÔÏó£¬ËùÒÔÓ¦¸ÃÔÚEnemyFighter.cppÖаüº¬Í·Îļþ£º #include\
5£©Ìí¼ÓÕ½»úÉÏϸ¡¶¯µÄ´úÂë¡£µ±Õ½»ú¸¡¶¯Ê±£¬Ê×ÏÈÀۼƸ¡¶¯µÄʱ¼ä£¬µ±¸¡¶¯Ê±¼ä´óÓÚ1ºÍСÓÚ0ʱ£¬ÐÞ¸ÄÉϸ¡»¹ÊÇϸ¡µÄ±äÁ¿Öµ¡£È»ºó»ñµÃÕ½»ú´ËʱµÄYÖá×ø±ê£¬ÎÒÃÇÉèÖÃÉÏϸ¡¶¯µÄËÙ¶ÈΪ6£¬ÕâÑù¾Í¿ÉÒÔ¼ÆËã³ö¸¡¶¯ºóµÄYÖá×ø±ê¡£
if( m_bFloatUp ) {
m_fFloatTime += fDeltaTime; if( m_fFloatTime >= 1.f ) {
m_bFloatUp = false; }
floatfPosY=GetSpritePositionY(); fPosY+=6.f * fDeltaTime; SetSpritePositionY( fPosY ); } else {
m_fFloatTime -= fDeltaTime; if( m_fFloatTime <= 0.f ) {
m_bFloatUp = true; }
floatfPosY=GetSpritePositionY();
10
ÉϺ£Èñ¸ñÈí¼þÓÐÏÞ¹«Ë¾ fPosY-=6.f * fDeltaTime; SetSpritePositionY( fPosY ); }
5¡¢ÔÚCGameRunÖУ¬µ÷ÓÃCEnemyFighterÀàµÄ¾²Ì¬·½·¨ClassTick,ÈÃÓÎÏ·²»Í£µÄ´´½¨µÐ
·½Õ½»ú¡£
CEnemyFighter::ClassTick( fDeltaTime );
ʵÑéËÄ µÐ·½Õ½»ú·¢Éä×Óµ¯
¡¾ÊµÑéÄÚÈÝ¡¿
1¡¢´´½¨Ò»¸ö¾«ÁéÁ´½ÓÀࣻ
2¡¢½«Éú³ÉµÄÕ½»úÌí¼Óµ½Á´±íÖУ»
¡¾ÊµÑé˼·¡¿
ΪÁ˱ãÓÚ¶Ô¸÷ÖÖ¾«ÁéµÄ¹ÜÀí£¬ÎÒÃÇʹÓÃÁ´±íÀ´¶ÔÕâЩ¾«Áé¹ÜÀí£¬±ÈÈ羫Áé·¢ÉúÅöײ֮ºó£¬ÎÒÃÇ¿ÉÒÔͨ¹ý±éÀúÁ´±íÀ´ÅжÏÊÇÁ´±íÖеÄÄǸö¾«Áé·¢ÉúÁËÅöײ£¬Í¬Ñùɾ³ý²Ù×÷ʹÓÃÁ´±íÒ²·Ç³£µÄ±ãÀû¡£
¡¾ÊµÑéÖ¸µ¼¡¿
1¡¢ÎªCBulletÌí¼ÓÒ»¸ö±íʾ¸Ã×Óµ¯ÊÇË·¢ÉäµÄ±äÁ¿¡£
intm_iType;
2¡¢ÔÚCBulletÀ๹Ô캯ÊýÖÐΪ´Ë±äÁ¿¸³Öµ£¬¸ü¸Ä¹¹Ô캯ÊýΪÈý¸ö²ÎÊý£º
CBullet::CBullet(const int iType, const char *szName) : CSprite( szName )
{
m_iType = iType; }
3¡¢ÐÞ¸ÄCGameMainÀàµÄCreateBullet·½·¨,×¢ÒâͬʱÐ޸ĺ¯ÊýÉùÃ÷¡£
void CGameMain::CreateBullet( int iType, const float fPosX, const float fPosY ) {
¡¡
if( 1 == iType ) //Èç¹ûiTypeֵΪ1£¬Ôò˵Ã÷×Óµ¯ÎªµÐ·½Õ½»ú·´Éä¡£ {
pBullet->SetSpriteLinearVelocityX( -30 ); }
else//ÆäËûÇé¿ö˵Ã÷ΪÎÒ·½Õ½»ú·´Éä {
pBullet->SetSpriteFlipX( true ); pBullet->SetSpriteLinearVelocityX( 60 ); }
pBullet->SetScore(100); pBullet->SetDamage(100); pBullet->SetHp(10); pBullet->SetType(iType);
pBullet->SetSpriteCollisionActive(true,true);
11

