1. 程式人生 > >對於基本的捕魚遊戲設計思路(五)——魚

對於基本的捕魚遊戲設計思路(五)——魚

今天講捕魚遊戲裡魚的部分,也是比較關鍵的一部分。

一步一步來,先分析遊戲,首先魚是從螢幕外生成,然後它有個移動的動作,而且分為不同的型別。

然後就可以進入程式碼部分,首先設定一個計時器,控制時間生成魚,而魚分種類,所以就用到隨機函式,隨機輸出一個值,傳入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,可以給魚新增一些動作,讓它活靈活現的在遊戲裡,也可以根據自己的愛好或者需要新增東西,嗯,今天就這樣吧。後面還會繼續更新。

相關推薦

no