一. 以换肤为例
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是自定义的处理监听的自定义的方法)