2016-03-26 55 views
0

我有一個cocos2d-x場景和Button。 我嘗試添加觸摸事件偵聽器添加它提供的回調函數:cocos 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 & &, _類型& & ...)'

我明白,回調或我使用它的方式有問題。請幫忙。

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

解決方案:使用lambda來調用你的函數。

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

CC_CALLBACK_2std::bind使用引擎蓋下。 Button::addTouchEventListener的聲明是void Button::addTouchEventListener(const ccWidgetTouchCallback& callback),其中ccWidgetTouchCallbackstd::function<void(Ref*,Widget::TouchEventType)>而不是EventTouchListener
由於不會調用派生版本,因此綁定虛函數是一種不好的做法。

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

這似乎是最簡單的方法來做到這一點。 –