飞机大战之五:添加一类敌机

参考网址:http://blog.csdn.net/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. 将以上修改添加进工程项目,编译运行如图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值