cocos2dx遊戲開發——微信打飛機學習筆記(九)——BulletLayer的搭建

weixin_33912246發表於2019-01-08

一、建立檔案~

         BulletLayer.h

         BulletLayer.cpp

二、How to do?

(1)例項化BulletLayer方法的實現~

     Bullet(PlayerLayer* temp);

    ~Bullet();

    static Bullet* create(PlayerLayer *temp);

          大家發現這個bullet類的例項化方法很奇怪~,那是由於小白前面製作PlayerLayer的時候沒有把他做成全域性變數,所以bulletLayer就訪問不到的說~,但是我們必須得到飛機的位置,要不子彈從哪裡打出來~~,所以小白我簡單粗暴,直接把PlayerLayer傳進BulletLayer,但實際上可以用友元的方法進行實現,但是……請原諒小編的C++ premier英文版~ 只看了150多頁~,以前看的c++教程有點水,所以。。。反正是個小遊戲,先暫時實現吧,後來再來翻工~~~~

Bullet* Bullet::create(PlayerLayer *temp)
{
    Bullet *pRet = new Bullet(temp);  //建立一個物件
    if (pRet && pRet->init())         //記憶體申請到,初始化正確,那麼就返回物件
    {
        pRet->autorelease();
        return pRet;
    }
    else
    {
        delete pRet;
        pRet = NULL;                 //否則就刪掉~
        return NULL;
    }
}


Bullet::Bullet(PlayerLayer *temp)         //把playerLayer儲存~
{
    _player = temp;
}

Bullet::~Bullet()
{

}

(2)初始化子彈的方法

         這裡採用的是跟初始化敵機一模一樣的方法~所以呢~我們就……

void Bullet::initBullet()
{
    for (int i = 0; i < BULLET_NUM; i++) //BUllET_NUM就是定義要初始化幾個子彈的巨集~
    {
        Sprite* bullet = Sprite::createWithSpriteFrameName("bullet1.png");
        bullet->setVisible(false);
        this->addChild(bullet);
        _bulletsArray.pushBack(bullet);
    }
}

(3)發射子彈的方法~

         同樣是跟發射敵機的方法是一樣的,首先就是先得到空閒的子彈~

Sprite* Bullet::getAvailableBulletSprite()
{
    for (auto&sp : _bulletsArray)
    {
        if (!sp->isVisible())
        {return sp;
        }
    }
    return nullptr;
}

        然後就是發射子彈的方法~

void Bullet::spawBullet(float dt)
{

    Vec2 playerPosition = _player->getPlayerPlanePositon();  //這裡就是得到玩家飛機的錨點位置。
                                 //大家會發現前面沒有實現這個方法~~在這裡貼一下  
Vec2 PlayerLayer::getPlayerPlanePositon()
{
    return _playerplane->getPosition();
}
Size PlayerLayer::getPlayerPlaneContentSize()
{
    return _playerplane->getContentSize();
}


    auto bulletPosition = Vec2(playerPosition.x, playerPosition.y + _player->getPlayerPlaneContentSize().height / 2);

    Sprite* bullet = getAvailableBulletSprite();//得到空閒的子彈~
    Size screenSize = Director::getInstance()->getVisibleSize();

    if (bullet)
    {
        bullet->setVisible(true);
        bullet->setPosition(bulletPosition);
        float moveOffset = screenSize.height + bullet->getContentSize().height / 2 - playerPosition.y;
        auto moveBy = MoveBy::create(moveOffset / VELOCITY_OF_BULLET, Vec2(0, moveOffset));
        auto toggleVisibility = Hide::create();
        auto action = Sequence::createWithTwoActions(moveBy, toggleVisibility);
        bullet->runAction(action);
     }
     //同樣跟敵機一樣,就是飛出螢幕的時候設定為消失~
}

(4)Init()中呼叫,並且加入到GameScene中就可以啦。

    this->initBullet();

    this->schedule(schedule_selector(Bullet::spawBullet), 1.0 / 5);

三、效果圖展示~

image

相關文章