游戏开始层
#ifndef __LayerGameStart_H__
#define __LayerGameStart_H__
#include "cocos2d.h"
USING_NS_CC;
class LayerGameStart :public CCLayer
{
public:
static CCScene * scene();
CREATE_FUNC(LayerGameStart);
bool init();
void addStartGamePicture();
void addPreLoadMusic();
void toMainGameCallback();
};
#endif
游戏主场景
#include "cocos2d.h" #include "Plane.h" #include "LayerGameStart.h" #include "LayerBullet.h" #include "LayerEnemy.h" #include "LayerControl.h" #include "LayerFood.h" #include "LayerGameOver.h" USING_NS_CC; const int SMALL_score = 1000; const int MID_score = 6000; const int BIG_score = 30000; const int MAX_BIGBOOM_COUNT = 100000; const int TAG_BIGBOOM = 1000; const int TAG_BIGBOOMCOUNT = 2000; class LayerGameMain :public CCLayer { public: static CCScene * scene(); CREATE_FUNC(LayerGameMain); bool init(); //加载主场景背景 void addBackGround(); //背景动起来 void movingBackGround(float dt); void addHero(); void addBulletLayer(); void addEnemyLayer(); void addCtrlLayer(); void addFoodLayer(); void updateBigBoomCount(int bigBoomCount); void boomMenuCallBack(CCObject * obj); enum BACKGROUND { BACK1,BACK2 }; void update(float dt); virtual bool ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch,CCEvent *pEvent); LayerBullet * _bulletLayer; LayerEnemy * _enemyLayer; LayerControl * _ctrlLayer; LayerFood * _foodLayer; static int score; static void setscore(int num); int bigBoomCount; };
碰撞检测
其中分为子弹与飞机的碰撞检测,飞机与飞机的碰撞检测,其中敌机分为大飞机,中飞机与小飞机,原理大致相同,这里只展示小飞机的原理与方法。
CCARRAY_FOREACH(_bulletLayer->_bulletArray,bt) { CCSprite * bullet = (CCSprite*)bt; CCArray * smallEnemyToDel = CCArray::create();“`
CCARRAY_FOREACH(_enemyLayer->smallArray,et) { Enemy * smallEnemy = (Enemy *)et; if (bullet->boundingBox().intersectsRect(smallEnemy->getBoundingBox())) { CCLog("%d",smallEnemy->getLife()); if (smallEnemy->getLife() == 1) { smallEnemy->loseLife(); bulletsToDel->addObject(bullet); smallEnemyToDel->addObject(smallEnemy); score += SMALL_score; _ctrlLayer->updatascore(score); } } } CCARRAY_FOREACH(smallEnemyToDel,et) { Enemy * smallEnemy = (Enemy*)et; _enemyLayer->smallEnemyBlowUp(smallEnemy); } smallEnemyToDel->release(); }
飞机与飞机的碰撞检测
//hero vs enemySmall CCRect planeRect = Plane::getInstance()->boundingBox(); planeRect.origin.x += 30; planeRect.origin.y += 20; planeRect.size.width -= 60; planeRect.size.height -= 40; CCARRAY_FOREACH(_enemyLayer->smallArray,et) { Enemy * smallEnemy = (Enemy *)et; if (planeRect.intersectsRect(smallEnemy->getBoundingBox())) { _bulletLayer->stopShoot(); unscheduleAllSelectors(); Plane::getInstance()->blowUp(); Plane::getInstance()->removePlane(); _enemyLayer->smallEnemyBlowUp(smallEnemy); } }
飞机大战的分层
由于游戏的复杂性,需要将精灵分为好几个层次加入到游戏中,可以分为控制层,敌机层,食物层,子弹层等
控制层代码
#ifndef __LayerControl_H__ #define __LayerControl_H__ #include "cocos2d.h" USING_NS_CC; class LayerControl : public CCLayer { public: CREATE_FUNC(LayerControl); bool init(); void menuCallBack(CCObject *obj); void updatascore(int score); private: CCMenuItemSprite * pauseMenuItem; CCLabelBMFont * scoreItem; }; #endif
食物层代码
#ifndef __LayerFood_H__ #define __LayerFood_H__ #include "cocos2d.h" USING_NS_CC; class LayerFood :public CCLayer { public: CREATE_FUNC(LayerFood); bool init(); //void addMultiBullets(float dt); //void multiBulletsMoveFinished(CCNode * pSender); //void removeMultiBullets(CCSprite *mb); void addBigBoom(float dt); void bigBoomMoveFinished(CCNode *pSender); void removeBigBoom(CCSprite *bb); public: CCArray * multiBulletArray; CCArray * bigBoomArray; }; #endif
敌机层代码
#ifndef __LayerEnemy_H__ #define __LayerEnemy_H__ #include "cocos2d.h" #include "Enemy.h" USING_NS_CC; const int SMALL_MAXLIFE = 1; const int MID_MAXLIFE = 3; const int BIG_MAXLIFE = 5; class LayerEnemy: public CCLayer { public: CREATE_FUNC(LayerEnemy); bool init(); void addSmallEnemy(float dt); void smallEnemyMovefinished(CCNode *node); void smallEnemyBlowUp(Enemy * smallEnemy); void removeSmallEnemy(CCNode * target,void * data); void removeAllSmallEnemy(); void addMidEnemy(float dt); void midHitAnimate(Enemy *midEnemy); void midEnemyMovefinished(CCNode *node); void midEnemyBlowUp(Enemy * midEnemy); void removeMidEnemy(CCNode * target,void * data); void removeAllMidEnemy(); void addBigEnemy(float dt); void bigHitAnimate(Enemy *midEnemy); void bigEnemyMovefinished(CCNode *node); void bigEnemyBlowUp(Enemy * bigEnemy); void removeBigEnemy(CCNode * target,void * data); void removeAllBigEnemy(); void removeAllEnemy(); CCArray * smallArray; CCArray *midArray; CCArray *bigArray; }; #endif
子弹层代码
#ifndef __LayerBullet_H__ #define __LayerBullet_H__ #include "cocos2d.h" USING_NS_CC; class LayerBullet: public CCLayer { public: CREATE_FUNC(LayerBullet); bool init(); void startShoot(); void stopShoot(); void addBulletCallback(float dt); void bulletMoveFinished(CCNode* node); void removeBullet(CCSprite* bullet); CCArray *_bulletArray; CCSpriteBatchNode * _bulletBatchNode; }; #endif
运行结果