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 );

        }

      });

    }

    });

 

posted @ 2014-09-02 15:28  Mareon  阅读(219)  评论(0编辑  收藏  举报