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。