对于基本的捕鱼游戏设计思路(五)——鱼

今天讲捕鱼游戏里鱼的部分,也是比较关键的一部分。

一步一步来,先分析游戏,首先鱼是从屏幕外生成,然后它有个移动的动作,而且分为不同的类型。

然后就可以进入代码部分,首先设置一个计时器,控制时间生成鱼,而鱼分种类,所以就用到随机函数,随机输出一个值,传入switch语句,从而生成不同的鱼。

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);
}

四只不同的鱼类就可以添加到场景了,然后就是鱼的动作,上面只是有个移动,如果没有动画的鱼就会看起来很尴尬,所以上面看不懂的playanim就是定义的一个动画函数,传入一个int型常量,就是鱼的动画播放动画,看过前一章的就知道也是利用序列帧动画完成的鱼的动作。

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);   //将鱼放进数组
}
那我就不讲序列帧动画了,可以去看前面的博客,最后放进数组也是用于优化游戏。
其实这里也做的不是很好,只是一个简单的demo,可以给鱼添加一些动作,让它活灵活现的在游戏里,也可以根据自己的爱好或者需要添加东西,嗯,今天就这样吧。后面还会继续更新。

你可能感兴趣的:(捕鱼达人,VS2013,cocos2d-x,C++,c++)