1. 程式人生 > >Cocos ui控制元件Button 一個誤導人的小錯誤

Cocos ui控制元件Button 一個誤導人的小錯誤

版本:cocos2d-x 3.12     語言:C++

今天開始996,終於要開始加死人不償命的生活了。哈哈,今天給大家帶來一個我畢設中的小失誤。

不知道還有沒有人在用CocosStudio,我們專案中可憐都沒得用,然後都是自己寫ui的,別的組已經在使用了,感覺用起來很舒服的,不知道為什麼停更了,然後現在只有個js的creator,真不知道觸控那幫子人怎麼想的。

反正在我之前的畢設中,使用到了一個ui介面放了一個Button的控制元件,來看一下程式碼(我現在知道怎麼插程式碼了):

Button* button= Button::create("res/HelloWorld.png");
button->setPosition(Vec2(200, 200));
this->addChild(button);
button->addTouchEventListener(this,toucheventselector(SceneTest::touch));

這是當然是測試的程式碼,實際中的程式碼就不拿出來了。建立了一個Button後,設定了一個常規屬性,最後添加了觸碰事件。

再來看看觸碰事件:

void SceneTest::touch(Ref* target,TouchEventType type)
{
    CCLOG("you touch me! you bitch!");
}

執行一下:

沒有任何問題,但是有個挺不爽的地方:

雖然可以執行,但是上面警告宣告被否決了,畢設期間也不懂,反正就這麼過了,這幾天又仔細研究了一下。

首先來看看另一種的註冊方式:

button->addClickEventListener(CC_CALLBACK_1(SceneTest::click, this));

使用Click進行註冊:

void SceneTest::click(Ref* target)
{
    CCLOG("you love me");
}

列印結果:

Click只在Ended的時候會觸發。好了,沒有任何問題。但是addTouchEventListener的方式應該是2.0時代使用的方法,我們現在使用3.0的方法試試:

button->addTouchEventListener(CC_CALLBACK_2(SceneTest::touch, this));

發生錯誤了:

一堆,不過我在我自己專案中並不是報這個錯誤,報的是什麼std::invoke為找到過載函式,如果報這個錯誤的話,我早就解決了,大家仔細看看。

沒錯,把方法這麼改寫就OK了:

touch(Ref*target,Widget::TouchEventTypetype)

Widget::TouchEventType和TouchEventType並不是同一個東西,我暈。

昨天draw方法相關的一個標誌轉換問題解決後,警告大幅度的減少了。今天又解決了這個問題,我想只要耐心這些警告也都不會出現,每次要在100多個警告裡面找一個錯誤實在難受。

總結:

UI控制元件中寫回調函式,不要忘記第二個引數是Widget中的TouchEventType,雖然他們的取值是一樣的、數量也是一樣的、表示的內容也是一樣的。用最近流行的話說就是MDZZ。