cocos2dx3.0 C++开发 零基础入门笔记

来源:互联网 发布:java 判断奇数偶数 编辑:程序博客网 时间:2024/06/12 03:16

测试代码环境:

 

VS2013 + cocos 2d x 3.0


程序执行流程

1、AppDelegate::applicationDidFinishLaunching()

2、创建场景createScene。

3、导演执行runWithScene


导演:


CCDirector获取:
[cpp] view plain copy
  1. auto director = Director::getInstance();  


导演可以获取到视图信息,以及对视图显示相关项进行配置等。

获取界面可视区域大小

[cpp] view plain copy
  1. Director::getInstance()->getVisibleSize();  



场景:

一个界面为一个场景。场景继承于层Layer。

导演控制场景的显示,场景有多层,没层里有许多精灵,精灵有各种动作。

很常用的类如下:

[cpp] view plain copy
  1. Director    Scene      Layer     Sprite    

 

如何自定义场景?


答:

1、首先派生自public cocos2d::Layer。

2、让场景自动释放。CREATE_FUNC(MyAppScene);

3、添加创建场景实现。

[cpp] view plain copy
  1. static cocos2d::Scene* createScene()  
  2. {  
  3.     cocos2d::Scene* MyAppScene::createScene()  
  4.     {  
  5.     // 自动释放的场景  
  6.     auto scene = Scene::create();  
  7.   
  8.     // 自动释放的层  
  9.     auto layer = MyAppScene::create();  
  10.   
  11.     // 场景中添加层  
  12.     scene->addChild(layer);  
  13.   
  14.     // 返回场景  
  15.     return scene;  
  16.     }  
  17. }  



4、重写虚函数 virtual bool init() override; 在场景里添加精灵。
[cpp] view plain copy
  1. bool MyAppScene::init()  
  2. {  
  3.     if (!Layer::init())  
  4.     {  
  5.         return false;  
  6.     }  
  7.   
  8.     Size visibleSize = Director::getInstance()->getVisibleSize();  
  9.   
  10.     // 新建精灵  
  11.     auto sprite = Sprite::create("dk_quit_game_bg.9.png");  
  12.     // 设置瞄点位置  
  13.     sprite->setAnchorPoint(ccp(0.5, 0.5));  
  14.     // 设置图片位置  
  15.     sprite->setPosition(ccp(visibleSize.width / 2.0, visibleSize.height / 2.0));  
  16.   
  17.     // 添加精灵到场景  
  18.     this->addChild(sprite);  
  19.   
  20.     return true;  
  21. }  




如何添加按钮以及相应按钮事件?

答:
1、可用图片式按钮,需要准备两张图片,正常情况和鼠标按下的情况。
定义一个签名为   void OnStartButtonMenu(cocos2d::CCObject* pSender);   的事件响应函数。

[cpp] view plain copy
  1. // 图片式按钮  
  2. auto startmenu = CCMenuItemImage::create("button.png",  
  3.     "button_p.png",  
  4.     this,  
  5.     menu_selector(MyAppScene::OnStartButtonMenu));  
  6.   
  7. // 文本式按钮  
  8. auto starmenuitemfont = CCMenuItemFont::create("On"this, menu_selector(MyAppScene::OnStartButtonMenu));  
  9.   
  10. auto menu = CCMenu::create(startmenu, starmenuitemfont, NULL);  
  11. this->addChild(menu);  


    

中文乱码如何解决?

答:


由于在cocos2d-x中直接使用中文会出现乱码,谁让cocos2d-x是由cocos2d而来,而cocos2d这东西是老外写的呢?通常解决中文乱码有两种方法:


(1)使用iconv库,cocos2d-x中提供了这个库,但是只是在win32平台,当程序移植到Android等平台时,需要自己下载iconv库编译。

(2)将中文字符串写到XML文件中(注意XML文件格式保存为UTF-8),然后解析XML文件,格式可以仿照Android中的strings.xml,而且这种方法能方便以后的国际化。

通过比较,可以很容易的发现第二种方法更好,那么下面就介绍第二种方法,让我们能在cocos2d-x程序中使用中文,彻底解决中文乱码问题。

二 实现
1 、新建XML文件,按照一定的格式,输入相应要显示的中文,最后一定需要使用UTF-8格式保存文件

[html] view plain copy
  1. <dict>  
  2.     <key>Hello</key>  
  3.     <string>你好!</string>  
  4.     <key>Info</key>  
  5.     <string>我是hahaya。</string>  
  6. </dict>   


2 、代码实现
[cpp] view plain copy
  1. // 在cocos2d-x中使用中文   
  2.   
  3. // 利用CCDictionary来读取xml  
  4. auto strings = CCDictionary::createWithContentsOfFile("strings.xml");  
  5.   
  6. // 读取Hello键中的值 objectForKey根据key,获取对应的string  
  7. auto text = CCLabelTTF::create(((CCString*)strings->objectForKey("Hello"))->getCString(), "微软雅黑", 48);  
  8.   
  9. auto winSize = Director::getInstance()->getWinSize();  
  10. text->setPosition(winSize.width/2.0, winSize.height/2.0);  
  11. text->setColor(Color3B(0, 34, 231));  
  12. this->addChild(text);  

水平翻转、或者垂直翻转精灵(图片)如何实现?


答:可以让精灵执行动作CCFlipX、CCFlipY实现

[cpp] view plain copy
  1. auto flipxAction = CCFlipX::create(true);  
  2. auto sprite = CCSprite::create("game_loading1.png");  
  3. sprite->setAnchorPoint(ccp(0.5, 0.5));  
  4. sprite->setPosition(ccp(visibleSize.width / 2.0, visibleSize.height*3 / 5.0));  
  5.   
  6. sprite->runAction(flipxAction);  
  7. this->addChild(sprite);  


    
    

如何按照顺序执行一序列预先制定的动作?


答:可以使用CCSequence。
[cpp] view plain copy
  1. auto allActions = CCSequence::create(ac, bc, nullptr);  
  2. sprite->runAction(allActions);  
  3. this->addChild(sprite);  

    

如何同时执行动作,例如运动的过程中同时进行缩放?


答:
可以使用CCSpawn。
[cpp] view plain copy
  1. auto ac = CCRotateBy::create(5, 270);  
  2. auto bc = CCScaleBy::create(5, 0.5, 0);  
  3. auto allActions = CCSpawn::create(ac, bc, nullptr);  

如何在某一动作执行完后加个延迟时间?

答:
可以使用CCDelayTime实现。

如何在某一动作执行完后调用指定的函数?

答:
可以使用CCCallFunc、CCCallFuncN、CCCallFuncND、CCCallFuncO实现。
分别代表的签名为:
CCCallFunc       -- 函数无返回值,无参数。
CCCallFuncN    -- 函数无返回值,有一个CCNode*的指针
CCCallFuncND --  一个void*的参数。
CCCallFuncO    -- 这个函数与CCCallFuncN差不多,只不过回调函数的参数是CCObject*类型。



如何查看一些常用的宏来简化程序,让程序更简洁呢?

答:


查看头文件CCPlatformDefine.h,有很多非常常用的宏。
尝试使用它们,养成习惯。会让代码一定程度上简洁许多。

例如:


[cpp] view plain copy
  1. CREATE_FUNC、CC_BREAK_IF、CC_SAFE_DELETE  

等等。


如何让一序列图片动起来,跟gif一样的效果呢?


答:

1、创建CCAnimation对象。
2、为CCAnimation对象添加动画帧addSpriteFrame。
3、为CCAnimation对象设置帧间隔setDelayPerUnit。
4、通过CCAnimation对象创建CCAnimate对象。
4、创建精灵。
5、让精灵去执行CCAnimate对象。

[cpp] view plain copy
  1. auto animation = CCAnimation::create();  
  2. std::vector<std::string> sFishNameVec;  
  3.   
  4. sFishNameVec.push_back("fish001.png");  
  5. sFishNameVec.push_back("fish002.png");  
  6. sFishNameVec.push_back("fish003.png");  
  7. sFishNameVec.push_back("fish004.png");  
  8. sFishNameVec.push_back("fish005.png");  
  9. sFishNameVec.push_back("fish006.png");  
  10. sFishNameVec.push_back("fish007.png");  
  11. sFishNameVec.push_back("fish008.png");  
  12. sFishNameVec.push_back("fish009.png");  
  13. sFishNameVec.push_back("fish010.png");  
  14. sFishNameVec.push_back("fish011.png");  
  15. sFishNameVec.push_back("fish012.png");  
  16.   
  17. for_each(sFishNameVec.begin(), sFishNameVec.end(), [animation](const std::string& sname)  
  18. {  
  19.     animation->addSpriteFrame(CCSpriteFrame::create(sname, CCRectMake(0, 0, 100, 100)));  
  20. });  
  21.   
  22. animation->setDelayPerUnit(0.1f);  
  23. auto action = CCAnimate::create(animation);  
  24.   
  25. auto sprite = CCSprite::create();  
  26. sprite->setPosition(ccp(200, 200));  
  27. this->addChild(sprite);  
  28. sprite->runAction(CCRepeatForever::create(action));  

如何播放音乐?


答:使用SimpleAudioEngine。

[cpp] view plain copy
  1. CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("background-music.mp3"true);  

如何使用定时器?

答:使用schedule函数即可。
使用步骤:
1、定义定时器定时调用函数
[cpp] view plain copy
  1. void MyAppScene::RunTimer(float f)。  


2、执行定时器。
[cpp] view plain copy
  1. this->schedule(schedule_selector(MyAppScene::RunTimer));  


如何切换场景?

答:通过导演进行切换场景。
[cpp] view plain copy
  1. // 从MyAppScene场景切换到HelloWord场景  
  2. auto helloScene = HelloWorld::createScene();  
  3. CCDirector::getInstance()->replaceScene(CCTransitionJumpZoom::create(3, helloScene));  

    一般此函数有两个参数,第一个是特效的切换时间,直接生成一个CCTime即可,例子中设定的时间是1.2s,对于很多场景的显示都很舒服,第二个是要进入的场景,有的会有第三个参数,会在下面介绍

场景切换效果汇总:create

CCTransitionJumpZoom::create(t, s);                                    // 跳跃式,本场景先会缩小,然后跳跃进来

CCTransitionFade::create(t, s);                                               // 淡出淡入,原场景淡出,新场景淡入

CCTransitionFade::create(t, s, ccWHITE);                            // 如果上一个的函数,带3个参数,则第三个参数就是淡出淡入的颜色

CCTransitionFlipX::create(t, s, kOrientationLeftOver);        // x轴左翻

CCTransitionFlipX::create(t, s, kOrientationRightOver);      // x轴右翻

CCTransitionFlipY::create(t, s, kOrientationUpOver);           //y轴上翻

CCTransitionFlipY::create(t, s, kOrientationDownOver);       //y轴下翻

CCTransitionFlipAngular::create(t, s, kOrientationLeftOver);           //有角度转的左翻

CCTransitionFlipAngular::create(t, s, kOrientationRightOver);        //有角度转的右翻

CCTransitionZoomFlipX::create(t, s, kOrientationLeftOver);            //带缩放效果x轴左翻

CCTransitionZoomFlipX::create(t, s, kOrientationRightOver);         //带缩放效果x轴右翻

CCTransitionZoomFlipY::create(t, s, kOrientationUpOver);              //带缩放效果y轴上翻

CCTransitionZoomFlipY::create(t, s, kOrientationDownOver);            //带缩放效果y轴下翻

CCTransitionZoomFlipAngular::create(t, s, kOrientationLeftOver);    //带缩放效果/有角度转的左翻

CCTransitionZoomFlipAngular::create(t, s, kOrientationRightOver);    //带缩放效果有角度转的右翻

CCTransitionShrinkGrow::create(t, s);                                //交错换

CCTransitionRotoZoom::create(t, s);                                    //转角换

CCTransitionMoveInL::create(t, s);                                    //新场景从左移入覆盖

CCTransitionMoveInR::create(t, s);                                    //新场景从右移入覆盖

CCTransitionMoveInT::create(t, s);                                    //新场景从上移入覆盖

CCTransitionMoveInB::create(t, s);                                    //新场景从下移入覆盖

CCTransitionSlideInL::create(t, s);                                    //场景从左移入推出原场景

CCTransitionSlideInR::create(t, s);                                    //场景从右移入推出原场景

CCTransitionSlideInT::create(t, s);                                    //场景从上移入推出原场景

CCTransitionSlideInB::create(t, s);                                    //场景从下移入推出原场景


以下三个需要检测opengl版本是否支持
CCConfiguration::sharedConfiguration()->getGlesVersion() <= GLES_VER_1_0如果为真则为不支持

CCTransitionCrossFade::create(t,s);                                    //淡出淡入交叉,同时进行

CCTransitionRadialCCW::create(t,s);                                    //顺时针切入

CCTransitionRadialCW::create(t,s);                                    //逆时针切入


以下两个需要先设置摄像机,使用CCDirector::sharedDirector()->setDepthTest(true);

CCTransitionPageTurn::create(t, s, false);                            //翻页,前翻

CCTransitionPageTurn::create(t, s, true);                            //翻页,后翻

CCTransitionFadeTR::create(t, s);                                    //向右上波浪

CCTransitionFadeBL::create(t, s);                                    //向左下波浪

CCTransitionFadeUp::create(t, s);                                    //向上百叶窗

CCTransitionFadeDown::create(t, s);                                    //向下百叶窗

CCTransitionTurnOffTiles::create(t, s);                                //随机小方块

CCTransitionSplitRows::create(t, s);                                //按行切

CCTransitionSplitCols::create(t, s);                                //按列切


什么是粒子系统,如何使用粒子系统实现下雪效果?

答:
粒子系统是为了模仿自然世界的真实显现,比如说烟,雾,火花,闪电,火焰,下雪。
粒子系统中需要包括四个部分:粒子对象,运动规律,随机性,粒子状态。
大量的粒子叠加就可以产生我们需要的特效。



FROM: http://blog.csdn.net/xuminglong/article/details/38185303

0 0
原创粉丝点击