2015-03-19 75 views
0

我試圖使用Cocos2dx 3.4製作一款遊戲,並且一切正常(在Eclipse中使用),所以我想在Xcode for iOS上嘗試一下,看看它會在那裏工作,我將它導入Xcode,但是當我嘗試編譯它時,我得到這個錯誤no viable overloaded '='listener1->onTouchEnded = [=](Touch* touch, Event* event)在Xcode中沒有可行的重載'='錯誤(Eclipse沒有顯示錯誤)

此代碼是從cocos2d的維基EventDispatcher_Mechanism http://www.cocos2d-x.org/wiki/EventDispatcher_Mechanism

我的代碼:

auto listener1 = EventListenerTouchOneByOne::create(); 

listener1->setSwallowTouches(true); 


listener1->onTouchBegan = [](Touch* touch, Event* event) { 
     auto target = static_cast<Sprite*>(event->getCurrentTarget()); 
     Point locationInNode = target->convertToNodeSpace(touch->getLocation()); 
     Size s = target->getContentSize(); 
     Rect rect = Rect(0, 0, s.width, s.height); 


     if (rect.containsPoint(locationInNode)) 
     { 

      target->setOpacity(180); 
      return true; 
     } 
     return false; 
    }; 



listener1->onTouchEnded = [=](Touch* touch, Event* event) { 
    auto target = static_cast<Sprite*>(event->getCurrentTarget()); 

    target->setOpacity(255); 

     if (target == abc) 
     { 
      auto sceneABC = ABCfirst::createScene(mute); 
      Director::getInstance()->replaceScene(sceneABC); 
      return true; 
     } 

     if (target == n123) 
     { 
      auto sceneNumbers = Numbers::createScene(mute); 
      Director::getInstance()->replaceScene(sceneNumbers); 
      return true; 
     } 

     if (target == lgame) 
     { 
      auto scenePWL = PWL::createScene(mute); 
      Director::getInstance()->replaceScene(scenePWL); 
      return true; 
     } 

     if (target == ngame) 
     { 
      auto scenePWN = PWN::createScene(mute); 
      Director::getInstance()->replaceScene(scenePWN); 
      return true; 
     } 

     if (target == info) 
     { 
      auto sceneAbout = About::createScene(); 
      Director::getInstance()->replaceScene(sceneAbout); 
      return true; 
     } 



    }; 

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, abc); 
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), 
     n123); 
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), 
     lgame); 
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), 
     ngame); 
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), 
      info); 

我去槽的情侶,人們也有類似問題的網頁,但它並沒有解決我的problem.Compiler設置爲C++ 11和onTouchBegan是bool其餘的都是void(我用pyhton腳本編寫了這個項目)。

這是我第一次使用xCode,所以它可能是我忘了一些東西。謝謝你在前進

回答

1

我覺得它有助於明確指定拉姆達的返回類型:

[=](Touch* touch, Event* event) -> void { ... } 

這樣編譯器會幫你擺脫流浪return語句的在那裏。您目前正在嘗試將帶有簽名bool的Lambda(Touch *,Event *)分配給std::function<void(Touch*,Event*)>

+0

這樣做的技巧ty這樣一個簡單的錯誤 – MePo 2015-03-19 09:43:43

1

儘量在這個拉姆達擺脫return true聲明:

[=](Touch* touch, Event* event) { ... } 

編譯器將把您的拉姆達,因爲它有一個bool返回類型,而onTouchEnded不希望它返回一個bool。如果您看看Cocos2d示例,那麼它不返回任何內容(因此lambda是void類型)。如果您想阻止執行其他分支,只需清除return true語句,並使用else if

+0

你們兩個權利,但他是第一個,所以我給了他解決,但謝謝澄清我真的apriciate它。 – MePo 2015-03-19 09:44:16