游戏开始层
#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
运行结果