2016-03-26 10 views
0

私はcocos2d-xシーンとボタンを持っています。 私はタッチイベントリスナーがコールバック関数でそれを提供追加追加しよう:ココス2d-xタッチイベントコールバックエラーを追加

preloadScene.h: 

... 
public: 
virtual void Do(Touch* touch, Event* event); 
... 

preloadScene.cpp 

bool Preload::init(){ 
... 
auto button = ui::Button::create("assets/preload_button.png"); 
... 
auto listener = EventListenerTouchOneByOne::create(); 
listener->onTouchEnded = CC_CALLBACK_2(Preload::Do, this); 
button->addTouchEventListener(listener); 
... 
} 

コンパイル中に私はこのエラーを得た: エラーC2893は、関数テンプレート「未知の型STDを専門に失敗しました::、(_Callable & &を呼び出します_Types & & ...) '

私はコールバックや使い方が間違っていることを理解しています。助けてください。

P.S:次の行は正常に機能しますが、このイベント処理コードを他の関数にカプセル化したいと考えています。

*button->addTouchEventListener(
    [](Ref* sender, ui::Widget::TouchEventType type) { 
    switch (type) { 
    case ui::Widget::TouchEventType::BEGAN: { 
     CCLOG("touch began"); 
     auto scene = MainMenu::createScene(); 
     Director::getInstance()->popScene(); 
     Director::getInstance()->replaceScene(scene); 
    } 
     break; 

答えて

1

解決方法:ラムダを使用して関数を呼び出します。

button->addTouchEventListener([this](Touch*, Event*){ this->Do();} 

CC_CALLBACK_2フードの下でstd::bindを使用します。 Button::addTouchEventListenerの宣言はvoid Button::addTouchEventListener(const ccWidgetTouchCallback& callback)です。ccWidgetTouchCallbackEventTouchListenerではなくstd::function<void(Ref*,Widget::TouchEventType)>です。
派生バージョンが呼び出されないため、仮想関数をバインドすることは悪い習慣です。

0
button->addClickEventListener([=](Ref*) 
{ 
    Do(); 
}); 
+0

これは最も簡単な方法です。 –

関連する問題