参考网址:http://blog.youkuaiyun.com/jackystudio/article/details/11890969
源码下载地址:点击打开链接
关于svn的简单使用:点击打开链接
1. 定义敌机类
// Enemy.h
#ifndef __ENEMY_H__
#define __ENEMY_H__
#include "cocos2d.h"
USING_NS_CC;
class Enemy : public CCNode
{
public:
Enemy(void);
~Enemy(void);
static Enemy *create();
void bindSprite(CCSprite *sprite, int life);
CCSprite *getSprite();
int getLife();
void loseLife();
CCRect getBoundingBox();
private:
CCSprite *m_sprite;
int m_life;
};
#endif
#include "Enemy.h"
Enemy::Enemy(void)
{
m_sprite = NULL;
m_life = 0;
}
Enemy::~Enemy(void)
{
}
Enemy *Enemy::create()
{
Enemy *pRet = new Enemy;
pRet->autorelease();
return pRet;
}
void Enemy::bindSprite(CCSprite *sprite, int life)
{
m_sprite = sprite;
m_life = life;
this->addChild(m_sprite);
}
CCSprite *Enemy::getSprite()
{
return m_sprite;
}
int Enemy::getLife()
{
return m_life;
}
void Enemy::loseLife()
{
m_life--;
}
CCRect Enemy::getBoundingBox()
{
CCRect rect = m_sprite->boundingBox();
CCPoint pos = this->convertToWorldSpace(rect.origin);
CCRect enemyRect(pos.x, pos.y, rect.size.width, rect.size.height);
return enemyRect;
}
2. 增加敌机层
// EnemyLayer.h
#ifndef __ENEMY_LAYER_H__
#define __ENEMY_LAYER_H__
#include "cocos2d.h"
#include "Enemy.h"
USING_NS_CC;
const int ENEMY1_MAXLIFE = 1;
class EnemyLayer : public CCLayer
{
public:
EnemyLayer(void);
~EnemyLayer(void);
CREATE_FUNC(EnemyLayer);
virtual bool init();
void addEnemy1(float dt);
void enemy1MoveFinished(CCNode *pSender);
void enemy1Blowup(Enemy *enemy1);
void removeEnemy1(CCNode *pTarget, void *data);
void removeAllEnemy1();
void removeAllEnemy();
CCArray *m_pAllEnemy1;
private:
CCSpriteFrame *enemy1SpriteFrame;
};
#endif
// EnemyLayer.cpp
#include "EnemyLayer.h"
#include "GameLayer.h"
EnemyLayer::EnemyLayer(void)
{
enemy1SpriteFrame = NULL;
m_pAllEnemy1 = CCArray::create();
m_pAllEnemy1->retain();
}
EnemyLayer::~EnemyLayer(void)
{
m_pAllEnemy1->release();
m_pAllEnemy1 = NULL;
}
bool EnemyLayer::init()
{
bool pRet = false;
do
{
CC_BREAK_IF(!CCLayer::init());
enemy1SpriteFrame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("enemy1.png");
CCAnimation *animation1 = CCAnimation::create();
animation1->setDelayPerUnit(0.1f);
animation1->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("enemy1_down1.png"));
animation1->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("enemy1_down2.png"));
animation1->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("enemy1_down3.png"));
animation1->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("enemy1_down4.png"));
CCAnimationCache::sharedAnimationCache()->addAnimation(animation1, "Enemy1Blowup");
this->schedule(schedule_selector(EnemyLayer::addEnemy1),0.5f);
pRet = true;
} while (0);
return pRet;
}
void EnemyLayer::addEnemy1(float dt)
{
Enemy *enemy1 = Enemy::create();
enemy1->bindSprite(CCSprite::createWithSpriteFrame(enemy1SpriteFrame), ENEMY1_MAXLIFE);
CCSize enemy1Size = enemy1->getSprite()->getContentSize();
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
int minX = enemy1Size.width / 2;
int maxX = winSize.width - enemy1Size.width / 2;
int rangeX = maxX - minX;
int actualX = (rand() % rangeX) + minX;
enemy1->setPosition(ccp(actualX, winSize.height + enemy1Size.height / 2));
this->addChild(enemy1);
this->m_pAllEnemy1->addObject(enemy1);
float minDuration, maxDuration;
minDuration = 2.0;
maxDuration = 4.0;
int rangeDuration = maxDuration - minDuration;
int actualDuration = (rand() % rangeDuration) + minDuration;
CCFiniteTimeAction *actionMove = CCMoveTo::create(actualDuration,
ccp(actualX, 0 - enemy1->getSprite()->getContentSize().height / 2));
CCFiniteTimeAction *actionDone = CCCallFuncN::create(this,
callfuncN_selector(EnemyLayer::enemy1MoveFinished));
CCSequence *sequnce = CCSequence::create(actionMove, actionDone, NULL);
enemy1->runAction(sequnce);
}
void EnemyLayer::enemy1MoveFinished(CCNode* pSender)
{
Enemy* enmey1=(Enemy*)pSender;
this->removeChild(enmey1,true);
this->m_pAllEnemy1->removeObject(enmey1);
}
void EnemyLayer::enemy1Blowup(Enemy *enemy1)
{
CCAnimation *animation = CCAnimationCache::sharedAnimationCache()->animationByName("Enemy1Blowup");
CCAnimate *animate = CCAnimate::create(animation);
CCCallFuncND *removeEnemy1 = CCCallFuncND::create(this,callfuncND_selector(EnemyLayer::removeEnemy1),(void *)enemy1);
CCSequence *sequence = CCSequence::create(animate,removeEnemy1);
enemy1->getSprite()->runAction(sequence);
}
void EnemyLayer::removeEnemy1(CCNode *pTarget, void *data)
{
Enemy *enemy1 = (Enemy *)data;
if(enemy1 != NULL)
{
m_pAllEnemy1->removeObject(enemy1);
this->removeChild(enemy1,true);
}
}
void EnemyLayer::removeAllEnemy1()
{
CCObject* obj;
CCARRAY_FOREACH(m_pAllEnemy1,obj)
{
Enemy* enemy1=(Enemy*)obj;
if (enemy1->getLife()>0)
{
enemy1Blowup(enemy1);
}
}
}
void EnemyLayer::removeAllEnemy()
{
removeAllEnemy1();
}
3. 修改游戏层文件
在 GameLayer.h 文件中添加头文件 #include "EnemyLayer.h"
class中增加成员变量 EnemyLayer *enemyLayer;
在 GameLayer.cpp 文件中初始化 enemyLayer = NULL;
init中添加
this->enemyLayer = EnemyLayer::create();
this->addChild(enemyLayer);
4. 将以上修改添加进工程项目,编译运行如图: