вы создаете кнопку и назначаете указатель InfoButton
.
infoButton = Button::create(FRAME_MM_INFO,FRAME_MM_INFO,FRAME_MM_INFO,Widget::TextureResType::PLIST);
проблема в том, что ваш infoButton
является локальным указателем.
Button *infoButton;
{
...
...
из предоставленного вами скриншота, я вижу, что он локально создан в CBirdMenu::SetupMenu()
.
затем вы добавляете info button
в качестве дочернего объекта к объекту, на который указывает указатель с именем toolBar
Однако в тот момент, когда CBirdMenu::SetupMenu()
заканчивается, ваш infoButton
больше не будет распознаваться лямбда-выражением.
Один и, возможно, самый простой способ решить вашу проблему - использовать динамическое приведение к лямбда-параметру Ref* sender
в лямбда-выражении.
InfoButton->addTouchEventListener([&](Ref* sender, cocos2d::ui::Widget::TouchEventType type)
{
cocos2d::ui::Button * infButton = dynamic_cast<cocos2d::ui::Button*>(sender);
if(infButton)//check if casting done properly
infButton->setColor(Color3B(0, 200, 0)); //colour set to green.
});
или альтернативно вместо локальногоуказатель infoButton
, сохраните его как член класса CBirdMenu
.таким образом, infoButton
никогда не потеряется, пока существует cBirdMenu
.
- это быстрое демо.файл заголовка;
#include "cocos2d.h"
#include "ui\CocosGUI.h"
class HelloWorld : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void menuCloseCallback(cocos2d::Ref* pSender);
CREATE_FUNC(HelloWorld);
private:
cocos2d::ui::Button * InfoButton; //member of HelloWorld.
};
обратите внимание на закрытый элемент cocos2d::ui::Button * InfoButton;
И, наконец, исходный файл, в котором создается экземпляр кнопки и назначается указателю infoButton
.
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
return false;
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
InfoButton = cocos2d::ui::Button::create("HelloWorld.png", "HelloWorld.png", "HelloWorld.png", ui::Widget::TextureResType::LOCAL);
InfoButton->setColor(Color3B(255, 0, 0)); //colour is set to red as suppose to.
InfoButton->setTitleFontSize(InfoButton->getTitleFontSize() * 0.7);
InfoButton->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));
InfoButton->addTouchEventListener([&](Ref* sender, cocos2d::ui::Widget::TouchEventType type)
{
InfoButton->setColor(Color3B(0, 200, 0)); //colour set to green.
});
// add the button as a child to this layer
this->addChild(InfoButton, 2);
return true;
}
если вы примените тот же принцип к своему коду, это должно решить вашу текущую проблему с lambda
.Однако я все еще не уверен, что делает ваш класс toolBar
, поскольку он не включен в код.если toolBar
- это пользовательский класс, я рекомендую вам вместо infoButton
перевести *1040* на toolBar
, если вы решите второй подход для решения вашей проблемы.