日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用

發布時間:2024/9/27 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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函数的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。