声明
本教程仅用于初学cocos2dx同学使用,内容由本人(Code-Man)编写,此教程使用cocos2dx版本为3.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。QQ群:Cocos2d-CodeMonkey,461679592。
经过上一节课相信Monkey们对Cocos2dx的HelloWorld有一定的了解了。如果还不能理解,就赶快加入我们的QQ群吧,期待与你一起成长。今天的任务很明显,写一个自己的HelloWorld,想写点特别点的。与自带的HelloWorld有所区别,但又不能超出一定的知识范围,为此我也挺头痛的!!! 求安慰!!!,经过我日思夜想,天天不能寝,夜夜不能寐最后想到了,我们要完成一个伟大的壮举。创建夏娃和亚当。。。。不要问为什么,技术宅任性。
为什么是《罪恶王冠》? ??? 因为我前几天刚追完。让我发泄一下!! 我的楪祈女神。。。至于跟夏娃亚当有什么关系??不懂的自己补番。。。
【一】添加资源
本文以Xcode为列。下图就是我们的一个项目包的大概的一个结构
2.资源导入到项目
回到工程,资源文件右键Add Files to “MyCppGame”
Add到工程
完成结果,注意!!! 图片一定是PNG格式!!!
【二】场景构建
1.创建第一个C++文件,New File...
2.Next C++文件
3.文件名
4.头文件
我们先来理一理,我们需要做的事情。
①.创建场景--->创建层---》创建两个按钮
③.需要一串文字来指导我们的操作
如图:
建议:Monkey们先按照这个思路自己写一些。无论写成什么样都可以。。。。
【三】代码分析
本文知识点:
①Tag值和Name值
②节点与节点之间的关系
③Lable的使用注意事项
最后,我们只要执行我们的场景就好了,在哪呢???
打开 Appelegate.cpp文件
附上源码:
<pre name="code" class="cpp">
</pre><pre name="code" class="cpp">// // LessonOneScene.h // MyCppGame // // Created by He_bi on 15/6/4. // // #ifndef __MyCppGame__LessonOneScene__ #define __MyCppGame__LessonOneScene__ #include <stdio.h> #include <cocos2d.h> USING_NS_CC; class LessonOneScene : public Layer { public: //创建场景 static Scene* createScene(); //初始化函数 virtual bool init(); //用宏去创建一个层(自己) CREATE_FUNC(LessonOneScene); private: //删除按钮的回调 void menuRemoveCallback(cocos2d::Ref* pSender); //添加按钮的回调 void menuAddCallback(cocos2d::Ref* pSender); private: //一个英雄节点 Node* HeroNode; //按钮层 Menu* MyMenu; //屏幕大小 Size WinSize; }; #endif /* defined(__MyCppGame__LessonOneScene__) */
// // LessonOneScene.cpp // MyCppGame // // Created by He_bi on 15/6/4. // // #include "LessonOneScene.h" //这个函数在此次不累赘、越往后面,对于前面的知识不会做无谓的讲解。 //忘记的可以复习前面的只是 Scene* LessonOneScene::createScene(){ auto Myscene=Scene::create(); auto MyLayer=LessonOneScene::create(); Myscene->addChild(MyLayer); return Myscene; } bool LessonOneScene::init(){ if (!Layer::init()) { return false; } WinSize=Director::getInstance()->getVisibleSize(); //创建我们的背景图片 auto bg=Sprite::create("LessonOne_Bg.png"); //WinSize/2 这种写法是3.0之后才有的,是不是很方便 bg->setPosition(WinSize/2); //这个这样理解吧,“别名”,也就是这个对象的另一个名字。例如:张三,别名:Monkey,哈哈哈! bg->setName("bg"); this->addChild(bg); //按钮控件,还记得上一节课的那个按钮吗?那个使用图片作为按钮,现在我们使用的是文字按钮 auto AddMenItem=MenuItemFont::create("添加按钮",CC_CALLBACK_1(LessonOneScene::menuAddCallback,this)); AddMenItem->setPosition(WinSize.width/2,WinSize.height/2/2); auto RemoveMenItem=MenuItemFont::create("删除按钮",CC_CALLBACK_1(LessonOneScene::menuRemoveCallback,this)); RemoveMenItem->setPosition(WinSize.width/2,WinSize.height/2+WinSize.height/2/2); //把按钮都添加到Men层上 MyMenu=Menu::create(AddMenItem,RemoveMenItem,NULL); // Vec2::ZERO= Vec2(0,0),3.0后的写法,直接变成静态变量 MyMenu->setPosition(Vec2::ZERO); this->addChild(MyMenu); /** 还记得我们上一节课,是如何创建helloWorld文字的吗? Label::createWithTTF("Hello World","fonts/Marker Felt.ttf",24); 这是上一节课创建方式。是不是稍微不一样?到底哪里不一样呢?其实看函数名可以很好的理解。 WithTTF:依靠着TTF(True Type File 字型文件),Marker Felt.ttf(不包含中文) WithSystemFont:跟随着系统的文字。 所有如果我们使用上一节课的方式创建,是看不到中文的 */ auto MyLabel=Label::createWithSystemFont("请添加主角","宋体",43); MyLabel->setPosition(WinSize.width-MyLabel->getContentSize().width,WinSize.height/2); //Node的常用函数,设置一个Node的颜色,但如果我们直接创建一个Node而不是它的子类然后设置颜色会怎么样呢?留给大家耍一耍 MyLabel->setColor(Color3B(255,0)); //这个,跟名字一样而是对象的另一个名字,好比人的身份证 MyLabel->setTag(10000); bg->addChild(MyLabel,2); return true; } void LessonOneScene::menuAddCallback(cocos2d::Ref *pSender){ // 在主角节点为空的适合我们就去招呼出我们的萌萌哒的主角 if (HeroNode==nullptr) { // 创建我们的空节点,理解为容器吧,可以装很多东西 HeroNode=Node::create(); this->addChild(HeroNode); // 出来吧男主角 auto LessonOne_Boy=Sprite::create("LessonOne_Boy.png"); auto BoySize=LessonOne_Boy->getContentSize(); LessonOne_Boy->setPosition(BoySize.width/2,WinSize.height/2/2); // 装到容器里面 HeroNode->addChild(LessonOne_Boy); // 出来吧女主角 auto LessonOne_Gril=Sprite::create("LessonOne_Gril.png"); auto GrilSize=LessonOne_Gril->getContentSize(); LessonOne_Gril->setPosition(GrilSize.width/2,WinSize.height/2+WinSize.height/2/2); HeroNode->addChild(LessonOne_Gril); // this是谁?自己,自己是什么?,层,层有一个儿子它的别名叫“bg”,“bg”有一个儿子它的身份证是10000。结合上面就能找到最后哪个人就是:上面的MyLabel auto MyLabel=(Label*)this->getChildByName("bg")->getChildByTag(10000); // 重新设置显示的文字 MyLabel->setString("请删除我们的\n英雄"); }else{ // 打一个log出来可以在控制台看见 log("这个Node已存在,无需重复添加"); } } void LessonOneScene::menuRemoveCallback(cocos2d::Ref *pSender){ // 只要我们的容器不为空,我们就继续执行 if (HeroNode !=nullptr) { // 我们并没有主动去删除男女主角,而是通过删除它的父节点,也就是主角的容器。 HeroNode->removeFromParentAndCleanup(true); HeroNode=nullptr; auto MyLabel=(Label*)this->getChildByName("bg")->getChildByTag(10000); // 再次更改它的文字 MyLabel->setString("请添加我们的\n英雄"); }else{ log("这个Node删除,无需重复删除"); } }
资源下载地址: http://pan.baidu.com/s/1gdvTiTX
Monkey们下次见吧!!!!最近一直在干项目。。。心好塞。。。