一、建立檔案~
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);
三、效果圖展示~