cocostudio c++中回调使用

4 篇文章 0 订阅

一. 以换肤为例

1.//换肤的回调处

在需要使用该回调的地方设置回调需要出现时更改的操作
+    SET_WEAK_THIS(weakProxy);
+    settingLayer->setReplaceSkinCallBack([weakProxy](int color) {
+        GET_SHARED_THIS(weakProxy, GameRoomLayer*, roomLayer);
+        string bg = "res/gameroom/bg_table_" + Value(color - 10000).asString() + ".jpg";
+        roomLayer->_Ui.bg_table->loadTexture(bg);

+    });

2.自定义回调,在SettingLayer的头文件中声明如下所示的方法:

void setReplaceSkinCallBack(std::function<void(int)> skinCallback);

std::function<void(int)> m_skinCallback;
void switchSkinOnClick(Ref* pSender);

3.实现上述头文件的方法

void SettingLayer::switchSkinOnClick(Ref* pSender) {
+    ImageView* colorView = dynamic_cast<ImageView*>(pSender);
+    int color = colorView->getTag(); //.ImageView可以设置其的tag
+    if (color == BLUE) {
+        _skin_blue_using->setVisible(true);
+        _skin_green_using->setVisible(false);
+        UserDefault::getInstance()->setIntegerForKey("color", BLUE);
+    } else if (color == GREEN) {
+        _skin_blue_using->setVisible(false);
+        _skin_green_using->setVisible(true);
+        UserDefault::getInstance()->setIntegerForKey("color", GREEN);
+    }
+    m_skinCallback(color); //后续动态先变动的地方,因为这里设置了其参数m_skinCallback的动态变化,所以setReplaceSkinCallBack里的skinCallback发生了改变,所以一开始setReplaceSkinCallBack([weakProxy](int color) 就会动态变化了

+})

void SettingLayer::setReplaceSkinCallBack(std::function<void(int)> skinCallback) {
+    m_skinCallback = skinCallback;
+}

二. 以Slider的滑动监听为例

类似于监听,在一开始的地方先声明好这个回调,然后在.cpp文件里实现该回调的方法,初始化的时候调用这个回调即可。

比如扬州麻将的设置中的关于滑动进度条的回调,

1.首先在SettingBase.h文件中声明好这个方法

void sliderCallback(cocos2d::Ref * ref, cocos2d::ui::Slider::EventType type);

2.然后在其.cpp文件中实现该方法

void SettingBase::sliderCallback(cocos2d::Ref * ref, Slider::EventType type) {

    switch (type) {

//手动拖动滑动条,停止的时候,才会动态改变当前值的大小,所以应该用ON_SLIDEBALL_UP
        case cocos2d::ui::Slider::EventType::ON_PERCENTAGE_CHANGED: {

            Slider* slider = (Slider*)ref;

            if (slider->getActionTag() == (int)SettingCheckBoxType::SettingCheckBoxMusic) {

                CENTERINS_CONFIG->setMusicVolume(_ui.setting_music_slider->getPercent());

                AudioCenter::playMusicWithBackgoundMusic(this->isHallSence() ? "audio/music/hallbg_todo.mp3":"audio/music/roombg.mp3");

                LOGGER("MusicVolume slider percent = %d", CENTERINS_CONFIG->getMusicVolume());

            }

            if (slider->getActionTag() == (int)SettingCheckBoxType::SettingCheckBoxMusicEffect) {

                CENTERINS_CONFIG->setEffectVolume(_ui.setting_effect_slider->getPercent());

                LOGGER("EffectVolume slider percent = %d", CENTERINS_CONFIG->getEffectVolume());

            }

        }

            break;

        default:

            break;

    }

}

3.initUI的时候绑定好这个空间的监听事件,如下所示,该控件为Slider

_ui.setting_music_slider->addEventListener(CC_CALLBACK_2(SettingBase::sliderCallback, this));

三. 以及时刷新更换的牌面为例

1.首先在CardButton中增加两个事件,分别为注册的监听事件和处理监听事件的方法

CardButton.h中 

//增加牌面样式切换的监听
void setCardStyleListenable();
void onCardStyleListened(EventCustom* event);同时在该.h头文件中还需要增加类似于退出onExit一样的进入的方法,如下所示:virtual void onEnter();主要用来初始化注册上述的监听事件。

在 CardButton.cpp文件中实现上述三个方法:

void CardButton::onEnter() {
    Button::onEnter();
    
    this->setCardStyleListenable();//注册监听
}//该方法重写了子类的Button:onEnter();并且注册了监听

注册监听和监听事件处理的具体实现方法:

void CardButton::setCardStyleListenable() {
    m_cardStyleListener = _eventDispatcher->addCustomEventListener("signCardStyle", CC_CALLBACK_1(CardButton::onCardStyleListened, this));
    m_cardStyleListener->retain();
}

void CardButton::onCardStyleListened(EventCustom* event) {
    this->loadCardTexture(m_cardNumber);
}

2.在设置中调起该监听事件的实现方法如下所示:

_eventDispatcher->dispatchCustomEvent("signCardStyle");

(注意:上述的m_cardNumber是实现了一个全局的cardNumber的变量,同时_eventDispatcher是自定义的处理监听的自定义的方法)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值