對於基本的捕魚遊戲設計思路(五)——魚
阿新 • • 發佈:2019-01-20
今天講捕魚遊戲裡魚的部分,也是比較關鍵的一部分。
一步一步來,先分析遊戲,首先魚是從螢幕外生成,然後它有個移動的動作,而且分為不同的型別。
然後就可以進入程式碼部分,首先設定一個計時器,控制時間生成魚,而魚分種類,所以就用到隨機函式,隨機輸出一個值,傳入switch語句,從而生成不同的魚。
<span style="font-size:18px;">void GameScene::xiaoyuupdate(float dt){ Size visibleSize = Director::getInstance()->getVisibleSize(); int s = rand() % 7; //隨機的s用於傳入switch語句 auto move = MoveTo::create(8, Vec2(visibleSize.width + 650, rand() % 768)); //下面做兩個移動的動作move1和move auto move1 = MoveTo::create(15, Vec2(-650, rand() % 768)); switch (s){ case 0: xiaoyu = Sprite::createWithSpriteFrameName("wugui1.png"); xiaoyu->setPosition(Vec2(-xiaoyu->getContentSize().width / 2, rand() % 768)); playanim(0); xiaoyu->runAction(move); p = 2; break; case 1: xiaoyu = Sprite::createWithSpriteFrameName("huangyu1.png"); xiaoyu->setPosition(Vec2(-xiaoyu->getContentSize().width / 2, rand() % 768)); playanim(1); xiaoyu->runAction(move); p = 1; break; case 2: xiaoyu = Sprite::createWithSpriteFrameName("dly01.png"); xiaoyu->setPosition(Vec2(visibleSize.width + xiaoyu->getContentSize().width / 2, rand() % 768)); playanim(2); xiaoyu->runAction(move1); p = 2; break; case 3: xiaoyu = Sprite::createWithSpriteFrameName("dm01.png"); xiaoyu->setPosition(Vec2(visibleSize.width + xiaoyu->getContentSize().width / 2, rand() % 768)); playanim(3); p = 2; xiaoyu->runAction(move1); break; default: break; } addChild(xiaoyu); }</span>
四隻不同的魚類就可以新增到場景了,然後就是魚的動作,上面只是有個移動,如果沒有動畫的魚就會看起來很尷尬,所以上面看不懂的playanim就是定義的一個動畫函式,傳入一個int型常量,就是魚的動畫播放動畫,看過前一章的就知道也是利用序列幀動畫完成的魚的動作。
那我就不講序列幀動畫了,可以去看前面的部落格,最後放進陣列也是用於優化遊戲。<span style="font-size:18px;">void GameScene::playanim(int x){ Size visibleSize = Director::getInstance()->getVisibleSize(); if (x == 0){ Animation* animation1 = Animation::create(); animation1->setDelayPerUnit(0.4f); animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui1.png")); animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png")); animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui3.png")); animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png")); animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui1.png")); animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png")); animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui3.png")); animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png")); animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui1.png")); Animate* animate1 = Animate::create(animation1); xiaoyu->runAction(RepeatForever::create(animate1)); } else if (x == 1){ Animation* animation2 = Animation::create(); animation2->setDelayPerUnit(0.1f); animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu1.png")); animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png")); animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu3.png")); animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png")); animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu1.png")); animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png")); animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu3.png")); animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png")); animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu1.png")); Animate* animate2 = Animate::create(animation2); xiaoyu->runAction(RepeatForever::create(animate2)); } else if (x == 2){ Animation* animation3 = Animation::create(); animation3->setDelayPerUnit(0.1f); animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly01.png")); animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly02.png")); animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly03.png")); animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly04.png")); animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly05.png")); animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly06.png")); animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly07.png")); animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly08.png")); animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly09.png")); animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly10.png")); Animate* animate3 = Animate::create(animation3); xiaoyu->runAction(RepeatForever::create(animate3)); } else if (x == 3){ Animation* animation5 = Animation::create(); animation5->setDelayPerUnit(0.1f); animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm01.png")); animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm02.png")); animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm03.png")); animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm04.png")); animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm05.png")); animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm06.png")); animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm07.png")); animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm08.png")); Animate* animate5 = Animate::create(animation5); xiaoyu->runAction(RepeatForever::create(animate5)); } fishVec.pushBack(xiaoyu); //將魚放進陣列 }</span>
其實這裡也做的不是很好,只是一個簡單的demo,可以給魚新增一些動作,讓它活靈活現的在遊戲裡,也可以根據自己的愛好或者需要新增東西,嗯,今天就這樣吧。後面還會繼續更新。