cocos2dx 开发成长之路 001
1.响应按钮事件的创建过程中,如果按钮的响应事件是打开某个页面,也就是说创建一个新的页面,那么先要将此之前创建的同样的页面消除掉,这样避免玩家狂点按钮;如果按钮掉功能是请求服务器点话,请求之后可能会进行某些回调操作,那么有两种方法取设计用户体验,一,强制disable操作界面,直至回调完成之后在解除屏蔽;二,假装屏蔽,设置flag判断是否回调结束,如果回调未结束,则玩家点了按钮也不会产生新的请求。相比之下,第二种方式似乎更人性化,毕竟隐藏了对用户对拒绝警告,更加和谐的一种软屏蔽。当然,还会遇到某些情况下,回调并未完成而页面已经消除,但是回调是放在主线程里的专门对UI进行操作的,因此如果不做保护判断,则会在网络延迟的情况下崩掉,因此,要在回调中判断这些操作的对象是否还存在.
如:1.
m_IsClickedButStillNotCallBack = false;
m_IsClickedButStillNotCallBack = true;
btn->setCallBack( [this]() {
if (! m_IsClickedButStillNotCallBack)
{
do something;
}
m_IsClickedButStillNotCallBack = false;
});
此情况是避免用户狂点一个按钮而产生多次操作,
如果用户在回调前先关掉咯this这个页面,那么m_IsClickedButStillNotCallBack 将变的没有意义,
但是this指针仍然会存在,所以不能用 if (this)这样来判断当前页面是否存在,
只能用当前页面的父节点用TAG或者NAME的方式获取,
但是你要确保RootLayer一定存在,那么肯定单例,
如,MyLayer* pMyLayer = RootLayer->getChildByTag(MY_LAYER);
if(pMyLayer && ! pMyLayer->getIsClickedButStillNotCallBack() )
{
do something;
}
完整版:
m_IsClickedButStillNotCallBack = false;
btn->setCallBack( [this]() {
if(getIsClickedButStillNotCallBack() ) //避免短时间内多次点击多次响应
{
pMyLayer->setIsClickedButStillNotCallBack( true ); //关门
doSomething(params,[this](){ //请求。如网络请求等。,设置请求结束后的回调
MyLayer* pMyLayer = RootLayer->getChildByTag(MY_LAYER); //判断当前页面是否还存在
if(pMyLayer) //如果存在,就刷新页面或者进行其他操作,最后把门打开。
{
pMyLayer->refreshUI();
pMyLayer->setIsClickedButStillNotCallBack( false );
}
});
}
});