2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用
1????????打開建好的T32? Cocos2dx-3.2的一個項目
2????????設置Cocos顯示窗口的位置是在AppDelegate.cpp中:
3 ?設置自適應窗口大小的代碼是在上面的代碼后面緊接著就添加:
glview->setDesignResolutionSize(480,320, ResolutionPolicy::EXACT_FIT);
?
3????????cocos2d-x-3.2項目案例(3.2版本之后都去掉了CC前綴)
4????????項目目錄結構如下:
| 編寫公共的頭文件T32.h |
| #ifndef _T32_H__ #define _T32_H__ #include "cocos2d.h" USING_NS_CC; ? #define winSize Director::getInstance()->getWinSize() ? //因為3.2版本中輸出日志不建議使用CCLog,而是使用log,為了還想 //使用原來風格的CCLog做如下定義 #define CCLog cocos2d::log ? #endif // !_T32_H__ |
| 編寫:TBack.h |
| #ifndef __TBack_H__ #define __TBack_H__ ? #include "T32.h" ? //注意這時候不是CCLayer了,而是Layer了 class TBack :public Layer { public: ??? CREATE_FUNC(TBack); ??? bool init(); }; ? #endif |
| 編寫TBack.cpp |
| #include "TBack.h" ? bool TBack::init() { ??? Layer::init(); ??? //設置zorder ??? setLocalZOrder(100); ? ??? Menu* menu = Menu::create(); ? ??? MenuItemImage* item = MenuItemImage::create("CloseNormal.png","CloseSelected.png", ??????? [](Ref*){ ??????? Director::getInstance()->popScene(); ??? }); ? ??? menu->addChild(item); ??? //注意,這里的沒有回調函數了,而是用lambada表達是來替換掉了。 ??? item->setPosition(winSize.width / 2 -item->getBoundingBox().size.width / 2, ??????? item->getBoundingBox().size.height / 2 -winSize.height / 2); ? ??? addChild(menu); ? ??? return true; } |
| 編寫:TMenu.h |
| #ifndef __TMenu_H__ #define __TMenu_H__ ? #include "T32.h" ? class TMenu : public Layer { public: ??? CREATE_FUNC(TMenu); ? ??? bool init(); ? ??? bool TouchBegan(Touch*, Event*); }; ? #endif |
| 編寫TMenu.cpp |
| #include "TMenu.h" #include "TBack.h" #include "T01CPP11.h" ? static constchar* title[] = { ??? "T01CPP11", }; ? bool TMenu::init() { ??? Layer::init(); ? ??? Menu* menu = Menu::create(); ??? addChild(menu); ? ??? for (inti = 0; i < sizeof(title) / sizeof(*title); ++i) ??? { ??????? MenuItemFont* item = MenuItemFont::create(title[i], [](Ref*sender){ ? ??????????? MenuItem* item = (MenuItem*)sender; ??????????? int i = item->getTag() - 1000; ??????????? Layer* l = NULL; ??????????? if (title[i] =="T01CPP11") ??????????? { ??????????????? l = T01CPP11::create(); ??????????? } ? ??????????? if (l) ??????????? { ??????????????? TBack*b = TBack::create(); ??????????????? Scene*s = Scene::create(); ??????????????? s->addChild(b); ??????????????? s->addChild(l); ??????????????? Director::getInstance()->pushScene(s); ??????????? } ??????? }); ??????? menu->addChild(item); ??????? item->setTag(1000 +i); ??? } ? ??? menu->alignItemsVertically(); ? ??? // 觸摸 ??? auto ev = EventListenerTouchOneByOne::create(); #if 0 ??? ev->onTouchBegan = [](Touch*,Event*){ ??????? return true; ??? }; #endif ? ??? //下面兩行代碼是相同的 ??? //ev->onTouchBegan = std::bind(&TMenu::TouchBegan, this, std::placeholders::_1, std::placeholders::_2); ??? ev->onTouchBegan =CC_CALLBACK_2(TMenu::TouchBegan,this); ? ??? ev->onTouchMoved = [&](Touch*touch, Event*){ ??????? setPositionY(getPositionY() +touch->getDelta().y); ??? }; ??? _eventDispatcher->addEventListenerWithSceneGraphPriority(ev,this); ? ??? return true; } ? bool TMenu::TouchBegan(/*TMEnu* this, */Touch*,Event*) { ??? return true; } |
| 編寫:T01CPP11.h |
| #ifndef __T01CPP11_H__ #define __T01CPP11_H__ ? #include "T32.h" ? class T01CPP11:public Layer { public: ??? CREATE_FUNC(T01CPP11); ? ??? bool init(); ? ??? void mFoo(); }; ? #endif |
| 編寫:T01CPP11.cpp(主要介紹lambada表達式) |
| #include "T01CPP11.h" ? void foo() { ??? CCLog("foo is called\n"); } ? void funArg3(int n,charc,float f) { ??? CCLog("%d,%c,%f",n,c,f); } ? void T01CPP11::mFoo() { ??? CCLog("mFoo is called"); } ? //關于lambda表達式 bool T01CPP11::init() { ??? Layer::init(); ??? { ??????? auto func = []{return 1; }; ??????? int i = func(); ??????? CCLog("i = %d",i); ??? } ??? //最簡單的lambada表達式是只要一個中括號和一個大括號 ??? //[]捕獲列表 ??? //{}函數體 ??? //1.捕獲列表,可以放變量名,這里可以用來傳遞函數體內定義的變量 ??? { ??????? int v = 100; ??????? auto func = [v]{returnv; }; ??????? int x = func(); ??? } ? ??? //2.捕獲列表,可以捕獲多個變量 ??? { ??????? int p = 100, q = 200; ??????? auto func = [p, q]{returnp + q; }; ??????? int s = func(); ??? } ? ??? // 3.捕獲列表,有引用和傳值兩種方式,傳值不可以改變,引用可以改變,并且改變外部的變量值 ??? { ??????? int p = 100, q = 200; ??????? auto func = [p, &q]{q++;?return p + q; }; ??????? int s = func(); ??? } ? ??? //4.捕獲列表,可以定義mutable類型的lambada,能改變傳值的捕獲參數, ??? //但是不能改變外部的變量值 ??? { ??????? int p = 100, q = 200; ??????? auto func = [p, q]()mutable{p++;q++; return p + q; }; ??????? int s = func(); ??????? CCLog("p = %d,q = %d,s = %d",p, q, s); ??? } ? ??? //5.捕獲列表,可以用=或者&捕獲所有變量,=指傳值,&表示引用 ??? { ??????? int p = 100, q = 200; ??????? //用&的時候,所有的都可以調用了,[&,p]:表示除了p不能被使用,其它的都可以被使用 ??????? auto func = [&]{ ??????????? return p + q; ??????? }; ??? } ? ??? //稍微復雜點的lambda表達式 ??? { ??????? auto add = [](int v1,int v2){returnv1 + v2; }; ??????? auto a = add(1 , 2); ??? } ? ??? //小括號中的是參數列表,參數列表和捕獲列表區別在于,參數列表的參數由調用方決定, ??? //捕獲列表由定義方決定,所以更加靈活 ? ??? //更加復雜的lambada表達是,有返回值,返回值一般都省略 ??? { ??????? //->int表示返回值是int類型的 ??????? auto add = [](int v1,int v2)->int{returnv1 + v2; }; ??? } ? ??? //總結:auto func = [](){} ??? { ??????? auto func = [](){}; ??? } ? ??? return true; } |
| // T01CPP11.cpp中使用使用function和bind函數的案例: |
| #include "T01CPP11.h" ? void foo() { ??? CCLog("foo is called\n"); } ? void funArg3(int n,charc,float f) { ??? CCLog("%d,%c,%f",n,c,f); } ? void T01CPP11::mFoo() { ??? CCLog("mFoo is called"); } ? //關于lambda表達式 bool T01CPP11::init() { ??? Layer::init(); ??? ??? //std::function; ??? //std::bind ? ??? //函數指針類型 ??? std::function<void()>func = foo; ??? func(); ? ??? //成員函數指針的賦值和調用 ??? { ??????? //注意在::域作用符后面加上* ??????? void(T01CPP11::*FuncPtr)() = &T01CPP11::mFoo; ??????? //調用成員函數的時候加上this ??????? (this->*FuncPtr)(); ??? } ? ??? //bind的功能,就是把一個具體函數,編程std::function對象 ??? //bind可以把具體函數和std::function形式完全改變,比如參數數量的改變 ??? { ??????? std::function<void()>func = std::bind(funArg3, 100,'c', 0.1f); ??????? func(); ??? } ? ??? //也可以改變參數順序 ??? { ??????? //其中 ??????? //_1:表示function<void(float, char, int)>括號中的第一個參數 ??????? //_2:表示function<void(float, char, int)>括號中的第二個參數 ??????? //_3:表示function<void(float, char, int)>括號中的第三個參數 ??????? //后面3個占位符分別在funArg3中的順序,而又用標記來代表上面括號中參數的的位置 ??????? std::function<void(float,char, int)> func = std::bind(funArg3, ??????????? std::placeholders::_3,std::placeholders::_2,std::placeholders::_1); ??????? func(1.0f, 'd', 2000); ??? } ? ??? // 也可以同時改變參數個數和順序 ??? { ??????? std::function<void(float,char)> func = std::bind(funArg3, ??????????? 100, std::placeholders::_2,std::placeholders::_1); ??????? func(4.0f, 'x'); ??? } ? ??? //也可以綁定成員函數 ??? { ??????? std::function<void()>func = std::bind(&T01CPP11::mFoo,this); ??????? func(); ??? }
? ? ? //下面的運行結果是:lambada is called ??? { ??????? std::function<void()> func = [](){}; ??????? std::function<void(int)> func1 = std::bind([](int, int){ ??????????? CCLog("lambada iscalled"); ??????? },10,std::placeholders::_1); ??????? func1(100); ??? } ? ??? return true; } |
| 修改AppDelegate.cpp |
| A添加頭文件: #include "TMenu.h" #include "TBack.h" ? B:修改:applicationDidFinishLaunching()截圖如下:
|
?
總結
以上是生活随笔為你收集整理的2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.cocos2dx 3.2环境搭建
- 下一篇: 联想电脑怎么设置uefi 如何在联想电脑