Cocos2d-x 3.x学习笔记:猩先生带你打飞机(二)素材准备与游戏菜
注:那个,秉着敬业爱业的精神,代码我会尽量解释清楚和一些路上捡的心得体会外加一堆废话(这段也是废话!!!)。如果没有解释的,那是我也没看懂,(╯3╰),百度去吧。倒是感觉这代码注释过多也是影响了代码的可见度,so如有影响,直接参照源代码。(这尼玛HelloWorld也要注释?额~~请轻喷) 一、材料准备 glview->setFrameSize(480,800); //添加的代码
director->setOpenGLView(glview);
现在可以跑下看看窗口改变的效果。 //背景精灵
auto bg1 = Sprite::create("background.png");
//注意,Vec2是cocos2d的数据结构,里面包含两个float型的数据,分别用来表示x轴和y轴。 //第二张背景图,是跟在第一张的上面,无缝连接,两张图形成不间断的地图滚动,getContentSize是获取精灵的size其中有它的宽度和高度。 auto bg2 = Sprite::create("background.png");
bg2->setPosition(Vec2(origin.x + visibleSize.width/2,bg1->getPositionY()+bg1->getContentSize().height));
bg2->setAnchorPoint(Vec2(0.5,0));
bg2->setTag(102);
this->addChild(bg2,0);
为什么有两个一样的背景精灵呢?这个是为了滚动地图设定的。 void HelloWorld::backgroundMove(float f) //背景滚动的回调方法
{
//背景滚动逻辑
auto bg1 = this->getChildByTag(101);
auto bg2 = this->getChildByTag(102);
//当第二张图片退出屏幕时,把第一张图片设置到屏幕中,由于我的背景图片的高度是大于屏幕的高度的,所以判断逻辑要复杂点
if(bg2 -> getPositionY() + bg2->getContentSize().height <= Director::getInstance()->getVisibleSize().height)
{
bg1->setPositionY(-bg1->getContentSize().height + Director::getInstance()->getVisibleSize().height);
}
bg1->setPositionY(bg1->getPositionY()-3);
bg2->setPositionY(bg1->getPositionY()+bg1->getContentSize().height);
}
背景滚动逻辑第一次接触也是件麻烦事,下面一张图告诉你。下面的图表示的逻辑也是上面的回调方法的实现。 // 菜单项的回调方法
void menuCloseCallback(cocos2d::Ref* pSender); //这个是系统默认写好的下面的才是新添加的。
void menuStartCallback(cocos2d::Ref* pSender); //参数什么的先不用去了解,循规蹈矩再去创新。
创建如下的菜单项: auto startItem = MenuItemImage::create( "game_start.png","game_start2.png",CC_CALLBACK_1(HelloWorld::menuStartCallback,this));
startItem->setPosition(Vec2(visibleSize.width/2 + origin.x,visibleSize.height/2 + origin.y));
//这个是结束游戏菜单项
auto closeItem = MenuItemImage::create( "game_exit.png","game_exit2.png",CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
closeItem->setPosition(Vec2(origin.x + visibleSize.width/2,visibleSize.height/2 + origin.y - startItem->getContentSize().height));
//把菜单项添加到菜单精灵中
auto menu = Menu::create(startItem,closeItem,NULL);
menu->setPosition(Vec2::ZERO);
//把菜单精灵添加到当前的层中
this->addChild(menu,1);
下面是回调函数的实现 void HelloWorld::menuStartCallback(Ref* pSender)
{
//开始游戏
}
好,菜单项搞定,编译运行下,是不是发现有两个菜单项在屏幕中间了!!!点击退出还可以退出游戏。不过开始游戏逻辑还没写。呵呵,小有成就是吧。好我们继续。 //添加飞机
auto plane = Sprite::create("hero1.png");
plane->setPosition(visibleSize.width/2+origin.x,200);
this->addChild(plane);
//飞机添加帧动画,添加格式如下,别问我为什么,呵呵。 SpriteFrame * spriteFrame1 = SpriteFrame::create("hero1.png",Rect(0,0,102,126));
SpriteFrame * spriteFrame2 = SpriteFrame::create("hero2.png",126));
animation->addSpriteFrame(spriteFrame1);
animation->addSpriteFrame(spriteFrame2);
animation->setDelayPerUnit(0.15f); //两张图片交互播放的间隔
Animate * animate = Animate::create(animation);
plane->runAction(RepeatForever::create(animate)); //开始执行动画
动画的执行是以精灵为单位,即可以为精灵添加动画,创建完动画,只要让精灵执行这个动作即可。如果执行完毕后,必须使用下面代码移除动画 ok,飞机动画创建成功,启动运行一下吧。是不是看到小飞机的飞翔在天空中的雄姿了??? 2-6 最终界面 素材:素材 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |