这一节里,我们主要是讲解游戏欢迎界面的制作。这里我们把游戏也当作一个场景(WelcomeScene)来实现——尽管它做的事情非常的简单,仅仅是加载了欢迎层(WelcomeLayer)
ok,让我们不妨先来看看我们最后完成的效果是什么样的吧。
在welcomelayer这一层中,主要有这么一些元素:
1)背景
2)地面
3)游戏名字、版权描述
4)开始游戏按钮
5)挥动翅膀的小鸟
那么,接下来我们要做的事情就非常简单明了了——把合适的
精灵放在合适的位置即可!
一、背景的放置:
原版的背景是随机的,这里我们做了一点小小的改动,即在白天的时候显示白天的背景,而在晚上的时候显示晚上的背景,那么具体如何实现的呢?且看如下代码:
//get the current time, the background image will selected by current time day or night: bg_day or bg_night
time_t t = time(NULL);
tm* lt = localtime(&t);
int hour = lt->tm_hour;
//create the background image according to the current time;
Sprite *background;
if(hour >= 6 && hour <= 17){
background = Sprite::createWithSpriteFrame(AtlasLoader::getInstance()->getSpriteFrameByName("bg_day"));
}else{
background = Sprite::createWithSpriteFrame(AtlasLoader::getInstance()->getSpriteFrameByName("bg_night"));
}
background->setAnchorPoint(Point::ZERO);
background->setPosition(Point::ZERO);
this->addChild(background);
二、地面效果:
咋一看地面是在不断滚动的,不难理解,让图片不断往左移动即可实现这种效果。那么,一张图片可以实现这样的效果吗?
事实上,通常我们采用两个精灵(land1,land2),不断交替地移动他们的X轴坐标。即当一张图片移出左边视野以后,就设置它的X轴坐标为右边最大值,这样它又可以开始第二次的从右往左移动了。如此交替反复滚动,就实现了我们所看到的地面滚动的效果了。
这里涉及到一个定时器的使用:
this->schedule(schedule_selector(WelcomeLayer::scrollLand), 0.01f);
即每隔0.01S执行一次WelcomeLayer::scrollLand()函数。
联系定时器的功能,也许你已经猜测scrollLand()函数所做的事情了,是的,其实就是不断的设置land1,和land2 的X轴坐标啦。好吧,让我们来看看它的庐山正面目吧:
void WelcomeLayer::scrollLand(float dt){
this->land1->setPositionX(this->land1->getPositionX() - 2.0f);
this->land2->setPositionX(this->land1->getPositionX() + this->land1->getContentSize().width - 2.0f);
if(this->land2->getPositionX() == 0) {
this->land1->setPositionX(0);
}
}
三、游戏名称和版权信息
显然这两个只是普通的精灵而已,我们需要对他们的操作非常简单。创建Sprite->setPosition()->addChild()
下面简单举例对游戏名称的操作:
//add the word game-title to the current scene
Sprite *title = Sprite::createWithSpriteFrame(AtlasLoader::getInstance()->getSpriteFrameByName("title"));
title->setPosition(Point(origin.x + visiableSize.width/2 , (visiableSize.height * 5) / 7));
this->addChild(title);
四、开始按钮
相比游戏名称,我们发现当我们点击开始按钮的时候,它是有动作的。是的这里我们将引出一个菜单的概念。开始按钮实际上应该称之为菜单更加贴切。相比较Android里面的OnClick事件,这里的菜单通过回调函数来响应菜单项被选中时的事件。
1、一个菜单可以包括若干菜单项,我们不妨先建立一个菜单项:
auto menuItem = MenuItemSprite::create(startButton,activeStartButton,NULL,CC_CALLBACK_1(WelcomeLayer::menuStartCallback, this));
-------
1)MenuItemSprite::create() 的具体使用不妨参考一下cocosdx文档学习一下2)CC_CALLBACK_1 为cocos2dx 3.0 新定义的关于回调函数的宏3)显然,此处的menuStartCallback 就是菜单项选中以后的回调函数
2、然后,我们需要把这个菜单项放到某个菜单中去:
auto menu = Menu::create(menuItem,NULL);
3、接下来我们要做的事情,当然就是放置这个菜单项了:
menu->setPosition(Point(origin.x ,origin.y));
this->addChild(menu,1);
五、挥动翅膀的小鸟
作为游戏的主角,我们单独写了一个小鸟类来处理小鸟的相关动作。
这一步,我们不妨简单地先添加一只不会动的小鸟(嗯,我想你可以的= =),而在之后的小节中,我们将详细讲解小鸟类的具体实现。
六、小结
在这一节当中,我们引入了精灵的概念,介绍了游戏欢迎界面的创建,菜单的使用,定时器的使用等等。如果你被这些概念弄糊涂了的话,不妨找一本cocos2dx的书籍来翻翻。当然最直接,最详细的第一手资料当属官方文档了。