加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 16:53:11 所属栏目:百科 来源:网络整理
导读:测试代码环境: VS2013 + cocos 2d x 3.0 程序执行流程 1、AppDelegate::applicationDidFinishLaunching() 2、创建场景createScene。 3、导演执行runWithScene 导演: CCDirector获取: [cpp] view plain copy autodirector=Director::getInstance(); 导演可

测试代码环境:

VS2013 + cocos 2d x 3.0


程序执行流程

1、AppDelegate::applicationDidFinishLaunching()
2、创建场景createScene。
3、导演执行runWithScene

导演:


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

导演可以获取到视图信息,以及对视图显示相关项进行配置等。
获取界面可视区域大小
copy
    Director::getInstance()->getVisibleSize();

场景:
一个界面为一个场景。场景继承于层Layer。
导演控制场景的显示,场景有多层,没层里有许多精灵,精灵有各种动作。
很常用的类如下:
copy
    DirectorSceneLayerSprite


如何自定义场景?


答:
1、首先派生自public cocos2d::Layer。
2、让场景自动释放。CREATE_FUNC(MyAppScene);
3、添加创建场景实现。
copy
    staticcocos2d::Scene*createScene()
  1. {
  2. cocos2d::Scene*MyAppScene::createScene()
  3. //自动释放的场景
  4. autoscene=Scene::create();
  5. //自动释放的层
  6. autolayer=MyAppScene::create();
  7. //场景中添加层
  8. scene->addChild(layer);
  9. //返回场景
  10. returnscene;
  11. }
  12. }

4、重写虚函数 virtual bool init() override; 在场景里添加精灵。
copy
    boolMyAppScene::init()
  1. if(!Layer::init())
  2. returnfalse;
  3. SizevisibleSize=Director::getInstance()->getVisibleSize();
  4. //新建精灵
  5. autosprite=Sprite::create("dk_quit_game_bg.9.png");
  6. //设置瞄点位置
  7. sprite->setAnchorPoint(ccp(0.5,0.5));
  8. //设置图片位置
  9. sprite->setPosition(ccp(visibleSize.width/2.0,visibleSize.height/2.0));
  10. //添加精灵到场景
  11. this->addChild(sprite);
  12. true;
  13. 如何添加按钮以及相应按钮事件? 1、可用图片式按钮,需要准备两张图片,正常情况和鼠标按下的情况。
    定义一个签名为 void OnStartButtonMenu(cocos2d::CCObject* pSender); 的事件响应函数。
    copy
      //图片式按钮
    1. autostartmenu=CCMenuItemImage::create("button.png",
    2. "button_p.png",
    3. this,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> menu_selector(MyAppScene::OnStartButtonMenu));
    4. //文本式按钮
    5. autostarmenuitemfont=CCMenuItemFont::create("On", automenu=CCMenu::create(startmenu,starmenuitemfont,NULL);
    6. 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] copy
      <dict>
    1. key>Hello</>
    2. string>你好!>Info>我是hahaya。>

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

    水平翻转、或者垂直翻转精灵(图片)如何实现?
    答:可以让精灵执行动作CCFlipX、CCFlipY实现
    copy
      autoflipxAction=CCFlipX::create(true);
    1. autosprite=CCSprite::create("game_loading1.png");
    2. sprite->setPosition(ccp(visibleSize.width/2.0,visibleSize.height*3/5.0));
    3. sprite->runAction(flipxAction);
    4. this->addChild(sprite);


    如何按照顺序执行一序列预先制定的动作?
    答:可以使用CCSequence。
    copy
      autoallActions=CCSequence::create(ac,bc,nullptr);
    1. sprite->runAction(allActions);
    2. 如何同时执行动作,例如运动的过程中同时进行缩放?
      可以使用CCSpawn。
      copy
        autoac=CCRotateBy::create(5,270);
      1. autobc=CCScaleBy::create(5,0.5,0);
      2. autoallActions=CCSpawn::create(ac,nullptr);

      如何在某一动作执行完后加个延迟时间? 可以使用CCDelayTime实现。
      如何在某一动作执行完后调用指定的函数? 可以使用CCCallFunc、CCCallFuncN、CCCallFuncND、CCCallFuncO实现。
      分别代表的签名为:
      CCCallFunc -- 函数无返回值,无参数。
      CCCallFuncN -- 函数无返回值,有一个CCNode*的指针
      CCCallFuncND -- 一个void*的参数。
      CCCallFuncO -- 这个函数与CCCallFuncN差不多,只不过回调函数的参数是CCObject*类型。
      如何查看一些常用的宏来简化程序,让程序更简洁呢?

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


      copy
        CREATE_FUNC、CC_BREAK_IF、CC_SAFE_DELETE

      等等。
      如何让一序列图片动起来,跟gif一样的效果呢?
      1、创建CCAnimation对象。
      2、为CCAnimation对象添加动画帧addSpriteFrame。
      3、为CCAnimation对象设置帧间隔setDelayPerUnit。
      4、通过CCAnimation对象创建CCAnimate对象。
      4、创建精灵。
      5、让精灵去执行CCAnimate对象。
      copy
        autoanimation=CCAnimation::create();
      1. std::vector<std::string>sFishNameVec;
      2. sFishNameVec.push_back("fish001.png");
      3. sFishNameVec.push_back("fish002.png");
      4. sFishNameVec.push_back("fish003.png");
      5. sFishNameVec.push_back("fish004.png");
      6. sFishNameVec.push_back("fish005.png");
      7. sFishNameVec.push_back("fish006.png");
      8. sFishNameVec.push_back("fish007.png");
      9. sFishNameVec.push_back("fish008.png");
      10. sFishNameVec.push_back("fish009.png");
      11. sFishNameVec.push_back("fish010.png");
      12. sFishNameVec.push_back("fish011.png");
      13. sFishNameVec.push_back("fish012.png");
      14. for_each(sFishNameVec.begin(),sFishNameVec.end(),[animation](conststd::string&sname)
      15. animation->addSpriteFrame(CCSpriteFrame::create(sname,CCRectMake(0,100,100)));
      16. });
      17. animation->setDelayPerUnit(0.1f);
      18. autoaction=CCAnimate::create(animation);
      19. autosprite=CCSprite::create();
      20. sprite->setPosition(ccp(200,200));
      21. this->addChild(sprite);
      22. sprite->runAction(CCRepeatForever::create(action));

      如何播放音乐?
      答:使用SimpleAudioEngine。
      copy
        CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("background-music.mp3",153); font-weight:bold; background-color:inherit">true);

      如何使用定时器? 答:使用schedule函数即可。
      使用步骤:
      1、定义定时器定时调用函数
      copy
        voidMyAppScene::RunTimer(floatf)。

      2、执行定时器。
      copy
        this->schedule(schedule_selector(MyAppScene::RunTimer));

      如何切换场景? 答:通过导演进行切换场景。
      copy
        //从MyAppScene场景切换到HelloWord场景
      1. autohelloScene=HelloWorld::createScene();
      2. CCDirector::getInstance()->replaceScene(CCTransitionJumpZoom::create(3,helloScene));

      一般此函数有两个参数,第一个是特效的切换时间,直接生成一个CCTime即可,例子中设定的时间是1.2s,对于很多场景的显示都很舒服,第二个是要进入的场景,有的会有第三个参数,会在下面介绍
      场景切换效果汇总:create
      CCTransitionJumpZoom::create(t,s); // 跳跃式,本场景先会缩小,然后跳跃进来
      CCTransitionFade::create(t,s); // 淡出淡入,原场景淡出,新场景淡入
      CCTransitionFlipX::create(t,kOrientationLeftOver); // x轴左翻
      CCTransitionFlipY::create(t,kOrientationUpOver); //y轴上翻
      CCTransitionFlipAngular::create(t,kOrientationLeftOver); //有角度转的左翻
      CCTransitionZoomFlipX::create(t,kOrientationLeftOver); //带缩放效果x轴左翻
      CCTransitionZoomFlipY::create(t,kOrientationUpOver); //带缩放效果y轴上翻
      CCTransitionZoomFlipAngular::create(t,kOrientationLeftOver); //带缩放效果/有角度转的左翻
      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,false); //翻页,前翻
      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

      (编辑:李大同)

      【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读