【cocos2dx-3.0beta-制作flappybird】让马里奥大叔来搬水管—在游戏层加入水管

一、引言

如我们所看到的,每一组水管由上下两根组合而成。在结合之前我们所看到的游戏素材。我想,大概可以明白,在游戏当中,每组水管其实都是一样的,而我们看到的高低不同的各组水管,其实是通过设置水管的Y方向的坐标来实现的。


二、水管的添加

在游戏层当中,我们首先创建了两根水管:
Sprite *pipUp = Sprite::createWithSpriteFrame(AtlasLoader::getInstance()->getSpriteFrameByName("pipe_up"));
Sprite *pipDown = Sprite::createWithSpriteFrame(AtlasLoader::getInstance()->getSpriteFrameByName("pipe_down"));

于此同时,我们创建singlePip来把两根水管组合成一组:
Node *singlePip = Node::create();
singlePip->addChild(pipDown, 0, DOWN_PIP);
singlePip->addChild(pipUp, 0, UP_PIP);
singlePip->setPosition(visibleSize.width + i*PIP_INTERVAL + WAIT_DISTANCE, this->getRandomHeight());

三、水管的高度

至于水管的高度则是随机生成的:
int GameLayer::getRandomHeight() {
Size visibleSize = Director::getInstance()->getVisibleSize();
return rand()%(int)(2*PIP_HEIGHT + PIP_DISTANCE - visibleSize.height);
}

四、源源不断的水管?

在GameLayer中,我们通过一个容易来保存所创建的水管:
vector<Node *> pips;

每创建一组水管,设置其Tag值
singlePip->setTag(PIP_NEW);

并且将其放入到pips容器中
this->pips.push_back(singlePip);

在游戏进入开始状态以后,开始创建水管
this->gameStatus = GAME_STATUS_START;
this->createPips();

在移动地面的时候,同时移动所有水管
// move the pips
for (auto singlePip : this->pips) {
singlePip->setPositionX(singlePip->getPositionX() - 2);
if(singlePip->getPositionX() < -PIP_WIDTH) {
singlePip->setTag(PIP_NEW);
Size visibleSize = Director::getInstance()->getVisibleSize();
singlePip->setPositionX(visibleSize.width);
singlePip->setPositionY(this->getRandomHeight());
}
}
那么,到底有几根水管呢?
事实上,我们只设置了两根水管!如果注意观察的话,会发现,同一时刻内,只有两组水管显示在屏幕上面。而当一组水管从左侧消失的时刻设置它的X坐标和随机高度,那么此时给人一种错觉,即又有一组水管生成了= =,而实际上,它还是刚才从左侧消失的那组水管,只是高度变化了。

五、小结

本节介绍了看似源源不断的水管的实现,而有关详细代码,还请移步到github: https://github.com/OiteBoys/Earlybird

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值