你們好,我是Lampard!!函數
今天迎來捕魚達人系列的第三篇博客更新,但願你們多多支持。動畫
每次新建一個場景咱們逃不開那三板斧:建立一個空的場景,添加一個層,而後填充這個層。this
對於咱們遊戲場景來講也不例外,首先咱們要把背景圖片,背景音樂等準備好spa
auto GameLayerBg = Sprite::create("GameLayerBg.jpg"); GameLayerBg->setPosition(vsable.width / 2, vsable.height / 2); this->addChild(GameLayerBg); // 背景 SimpleAudioEngine::getInstance()->playBackgroundMusic("GameLayerBGM.mp3", true); // 音樂
而後由於咱們大炮的位置是固定的(參照上一篇博客實體類),因此咱們須要init的時候先把大炮的位置固定好.net
s1 = Shell::createShell(); s2 = Shell::createShell(); s3 = Shell::createShell(); s4 = Shell::createShell(); s5 = Shell::createShell(); s1->setPosition(150, 50); s2->setPosition(400, 50); s3->setPosition(650, 50); s4->setPosition(900, 50); s5->setPosition(1150, 50); s1->setScale(1.5); s2->setScale(1.5); s3->setScale(1.5); s4->setScale(1.5); s5->setScale(1.5); addChild(s1); addChild(s2); addChild(s3); addChild(s4); addChild(s5);
最後咱們還要把魚類給生成出來。由於咱們是讓魚隨機的,每秒鐘生產一條,因此咱們須要用到計時器code
schedule(schedule_selector(GameLayer::goFish), 1.0f); void GameLayer::goFish(float dt) { auto fish = Fish::createFish(); CallFunc* callBack = CallFunc::create(CC_CALLBACK_0(Fish::Finish, fish)); fish->setPosition(rand()%280+900,rand()%620+100); // 位置是隨機的 this->addChild(fish); fish->runAction(Sequence::create(Spawn::create( fish->Swimming(), fish->Going(), NULL),callBack,NULL)); }
OK,如今咱們的畫面填充就基本實現了。blog
這款捕魚達人小遊戲遊戲邏輯很簡單,就是點擊遊動的魚,而後就會播放被捕捉的動畫,而後計數器就會記錄被捕捉的魚的數量。每一局的時間是限定的,因此咱們還須要設置一個全局參數來記錄時間值。規定時間內,捕捉到的魚越多越好。遊戲
(1)設置監聽事件獲取觸摸點事件
auto Listener = EventListenerTouchOneByOne::create(); Listener->onTouchBegan = [this](Touch* t, Event* e) { log("Ontouch"); } // t是觸摸點
(2)判斷是否擊中魚 圖片
而後咱們就能夠用觸摸點的位置與遊動的魚的位置進行判斷,看觸摸點是否在其中一條魚的範圍內,若擊中則播放被捕捉的動畫,改變捉到的魚的數量,以及刪除這條魚。由於存在着許多條魚,因此咱們能夠用向量來存儲全部魚,而後用迭代器遍歷。
for (auto it = fishs->begin(); it != fishs->end(); it++) { fish = *it; CallFunc* callBack1 = CallFunc::create(CC_CALLBACK_0(Fish::Finish, fish)); if (fish->getBoundingBox().containsPoint(t->getLocation())) { log("CatchFish"); fish->stopAllActions(); fish->runAction(Sequence::create(fish->BeCatched(), action,callBack1, NULL)); // 若是擊中了,則播放被捕捉的動畫 Count++; // 捉到的魚的數量加一,全局變量 voice = true; break; } }
(3)播放子彈射出的動畫
建立子彈射出的動畫比較複雜,由於咱們首先要判斷是那一門大炮發射炮彈。而後就是,爲了發射的子彈是朝着觸摸點的方向
射出,因此咱們還要用到反正切方法(atan)來偏轉子彈的方向。
MoveTo * move = MoveTo::create(0.2, thePoint); // 移動到觸摸點的速度 Bullet* bullet = Bullet::createBullet(); bullet->setPosition(Xray,80); // 發射的位置,xray是選擇的大炮的x座標 bullet->setRotation(turn); // turn 是偏轉的角度,Rotation是偏轉 addChild(bullet); CallFunc* callBack = CallFunc::create(CC_CALLBACK_0(Bullet::Finish, bullet)); Animate* action = ActionTool::animationWithFrameName("gold0", -1, 0.1); bullet->runAction(Sequence::create(move,bullet->Shooting(),callBack,NULL));
(4)設置全局變量存放時間以及被捕捉的魚的數量
咱們設置一個.h的文件來存放全局變量,爲了其餘文件可以訪問,記得加上extern關鍵字。
#ifndef __GlobalData__H__ #define __GlobalData__H__ #include<stdio.h> extern double Time; // 時間 extern int Count; // 數量 #endif
(5)遊戲勝利的斷定
由於咱們這個小遊戲沒有失敗界面,只須要在時間結束後把捉到多少魚的數量傳遞給勝利界面展現就能夠了。因此咱們應該利用計時器函數設立一個記錄時間的方法,當時間到了以後,就跳轉到勝利界面。
schedule(schedule_selector(GameLayer::addTime), 1.0f); void GameLayer::addTime(float dt) { Time = Time + 1; if (Time > 15) { Director::getInstance()->replaceScene(WinLayer::createScene()); } }