cocos2d-x的初步学习二十三之模仿微信打飞机二

在这篇文章中,我们将把剩下的功能完成,首先,我们加入换子弹或是炸弹的功能,它的原理大体是这样的,设置物品出现的时间间隔,会随机出现物品的种类,然后判断物品跟飞机所在区域,碰撞检测,在一起就算是吃到这个物品了,。。OK,下面上代码

首页新建一个类继承CCNode,

ChangeBullet.h

typedef enum{

    propsTypeBomb = 4,
    propsTypeBullet = 5


}prosType;

class ChangeBullet:public cocos2d::CCNode
{



public:
    
    cocos2d::CCSprite *prop;
    
    
    prosType bulletType;
    
    void initWithType(prosType type);
    
    void propAnimation();
    

    static ChangeBullet* create(void);
    
    CC_SYNTHESIZE_RETAIN(cocos2d::CCSprite*, _prop, Prop);
    
    ChangeBullet();
    ~ChangeBullet();

};
ChangeBullet.cpp

ChangeBullet::~ChangeBullet()
{




}

ChangeBullet::ChangeBullet()
{




}

ChangeBullet* ChangeBullet::create()
{

    ChangeBullet * pRet = new ChangeBullet();
    if (pRet && pRet->init())
    {
        pRet->autorelease();
    }
    else
    {
        CC_SAFE_DELETE(pRet);
    }
	return pRet;

}

void ChangeBullet::initWithType(prosType type)
{


    bulletType=type;
    
    
    CCString *string=CCString::createWithFormat("enemy%i_fly_1.png",type);


    prop=CCSprite::createWithSpriteFrameName(string->getCString());
    
    prop->setPosition(ccp((arc4random()%268 + 23)*2,632*2));
    

}


//物品出现动画
void ChangeBullet::propAnimation()
{


    CCMoveTo *ac1=CCMoveTo::create(1, ccp(prop->getPosition().x, 250*2));
    CCMoveTo *ac2=CCMoveTo::create(0.4, ccp(prop->getPosition().x, 252*2));
    CCMoveTo *ac3=CCMoveTo::create(1, ccp(prop->getPosition().x, 632*2));
    CCMoveTo *ac4=CCMoveTo::create(2, ccp(prop->getPosition().x, -55*2));



    prop->runAction(CCSequence::create(ac1,ac2,ac3,ac4,NULL));


}

在上面中,我们定义了一个换物品的类,设置它的物品种类,威力更强的子弹和炸弹,并且构造一个物品出现动画的函数,这个动画函数很简单,都是CCMove构成。。。

GameScene.h

 void addBulletTypeTip();
    
    //空降物品时间计数
    int propTime;
    
    ChangeBullet *prop;
    
    bool isVisible;
    bool isBigBullet;
    bool isChangeBullet;
    
    //子弹持续时间
    int bulletlastTime;
    
    void bulletLastTime();

GameScene.cpp

//空降物
void GameLayer::addBulletTypeTip()
{

    propTime++;
    
    if (propTime>500)
    {
        
        prop=ChangeBullet::create();
        
        prop->initWithType((prosType)(arc4random()%2 + 4));
        
        this->addChild(prop->prop);
        
        prop->propAnimation();
        
        prop->retain();
        
        propTime=0;
        
        isVisible=true;
        
        
    }



}


void GameLayer::bulletLastTime()
{

    if (isBigBullet)
    {
        if (bulletlastTime > 0)
        {
            bulletlastTime --;
        }
        else
        {
            bulletlastTime = 1200;
            isBigBullet = false;
            isChangeBullet = true;
        }
    }



}

然后在我们的update函数中

 this->addBulletTypeTip();
    
    
    this->bulletLastTime();


在collisionDetection函数中

//飞机跟空降物
    if (isVisible==true)
    {
        CCRect playRect=playSprite->boundingBox();
        CCRect propRect=prop->prop->boundingBox();
        
        
        if (playRect.intersectsRect(propRect))
        {
            
            prop->prop->stopAllActions();
            prop->prop->removeFromParentAndCleanup(true);
            
            isVisible=false;
            
            //换子弹
            if (prop->bulletType==propsTypeBullet)
            {
               // CCLOG("--------22222");
                
                isBigBullet = true;
                isChangeBullet = true;
                
            }
            //炸弹
            else
            {
            
                for (int i=0; i<planeArray->count(); i++)
                {
                   
                    EnemyPlane *enemyPlane=(EnemyPlane *)planeArray->objectAtIndex(i);

                    //爆炸动画
                    this->enemyPlaneBlowupAnimation(enemyPlane);
                    
                    
                }
                
                planeArray->removeAllObjects();
            
            
            }
            
            
            
        }
        
    }


OK。。。看下效果图

 

OK,到现在我们还没做自己飞机的碰撞,那么接下来我们在collisionDetection函数中,再加入一个判断,判断敌人的飞机跟我们自己的飞机是否碰撞了,上代码

CCRect playRec=playSprite->boundingBox();
    playRec.origin.x += 25*2;
    playRec.size.width -= 50*2;
    playRec.origin.y -= 10*2;
    playRec.size.height -= 10*2;
    
    for (int i=0; i<planeArray->count(); i++)
    {
        
        EnemyPlane *enemyPlane=(EnemyPlane *)planeArray->objectAtIndex(i);

        
        if (playRec.intersectsRect(enemyPlane->boundingBox()))
        {
            
            
            this->playerBlowupAnimation();
            this->enemyPlaneBlowupAnimation(enemyPlane);
            this->gameOver();

            planeArray->removeObject(enemyPlane);
            
            
            
        }
        
        
    }

//自己的飞机爆炸动画
void GameLayer::playerBlowupAnimation()
{
    playSprite->stopAllActions();
    
    
    
    CCArray *array=CCArray::create();
    
    for (int i=1; i<=4; i++)
    {
        
        CCString *string=CCString::createWithFormat("hero_blowup_%i.png",i);
        CCSpriteFrame *frame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(string->getCString());
        
        array->addObject(frame);
        
    }
    
    CCAnimation *animation=CCAnimation::createWithSpriteFrames(array,0.1);
    CCAnimate *animate=CCAnimate::create(animation);
    
    CCRepeatForever *ac1=CCRepeatForever::create(animate);
    
    playSprite->runAction(ac1);
    
    array->removeAllObjects();




}

上面中,我们做了碰撞检测,一旦飞机跟敌人的飞机撞上,我们就认为游戏结束了,所以最后我们加上个游戏结束的画面

//游戏结束
void GameLayer::gameOver()
{


    isGameOver=true;
    
    
    this->gamePause();



    CCLayerColor *gameoverLayer=CCLayerColor::create(ccc4(215, 221, 222, 255), 582, 544);
    
    
    gameoverLayer->setPosition(ccp(wSize.width/2-582/2, 220));

    this->addChild(gameoverLayer, 3);

    
    CCLabelTTF *ttfLabel=CCLabelTTF::create("飞机大战分数", "MarkerFelt-Thin", 50);
    ttfLabel->setPosition(ccp(gameoverLayer->getContentSize().width/2-ttfLabel->getContentSize().width/2, gameoverLayer->getContentSize().height-70));
    ttfLabel->setColor(ccc3(0, 0, 0));
    ttfLabel->setAnchorPoint(ccp(0, 0));
    gameoverLayer->addChild(ttfLabel, 1);
    
    
    
    CCLabelTTF *scLabel=CCLabelTTF::create(scoreLabel->getString(), "MarkerFelt-Thin", 44);
    scLabel->setPosition(ccp(gameoverLayer->getContentSize().width/2-scLabel->getContentSize().width/2, gameoverLayer->getContentSize().height-250));
    scLabel->setColor(ccc3(0, 0, 0));
    scLabel->setAnchorPoint(ccp(0, 0));
    gameoverLayer->addChild(scLabel, 1);
    
    
    
    CCMenuItemFont *startItem=CCMenuItemFont::create("继续", this,menu_selector(GameLayer::restart));

    
    startItem->setPosition(ccp(gameoverLayer->getContentSize().width/2, 60));
    startItem->setFontSizeObj(50);
    startItem->setFontNameObj("Georgia-Bold");
    startItem->setColor(ccc3(0, 0, 0));
    
    CCMenu *pMenu = CCMenu::create(startItem, NULL);
    
    pMenu->setPosition(CCPointZero);
    
    gameoverLayer->addChild(pMenu, 1);
    

    
    
}


//游戏暂停
void GameLayer::gamePause()
{

    if (isGameOver==false)
    {
        
        
        
        
    }
    else
    {
    
    
        CCObject *object;
        
        CCARRAY_FOREACH(this->getChildren(), object)
        {
            
            CCNode *node=(CCNode *)object;
        
            node->stopAllActions();
        
        }

        
        
    
    
    }






}



OK.。。。到这里,基本上大体的功能有了,呵呵,貌似暂停还木有。。。。

下篇文章中,我们将来探究一下在ios平台上适配的问题,当然还有android等其他平台的适配,。。。。。。。。。





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值