cocos2dx引擎版本:2.1rc0-x-2.1.4
1.在添加计费代码前,执行游戏退出只是调用下面的代码
void NTMainMenu::Menu_Exit( CCObject* pRender )
{
NTGameSound::sharedEngine()->playEffectById(SOUND_BUTTON);
CCDirector::sharedDirector()->end();
}
2.添加了计费代码后,退出要求弹出移动基地的确认退出窗口,需要C++通过jni调到android层,在通过接口回调到C++再执行游戏退出,我一开始是这么做的
1)jni调用android层代码,打开移动基地退出的确认窗口
void NTMainMenu::Menu_Exit( CCObject* pRender )
{
NTGameSound::sharedEngine()->playEffectById(SOUND_BUTTON);
/* CCDirector::sharedDirector()->end();*/
XYPay::getInstance()->setPayObserver(this);
XYPay::getInstance()->exitAppConfirm();
}
2)通过android层把确定事件回调到C++层
public static void exitAppConfirm() {
GameInterface.exit(mContext, new GameExitCallback() {
@Override
public void onConfirmExit() {
//执行关闭操作
XYPay.getIntance().doPayed(true);
}
@Override
public void onCancelExit() {
}
});
}
3)然后C++层执行退出操作,有一个地方,好的习惯是不应该直接将执行代码插入到游戏当前线程中,要在当前这一帧刷完后在执行回调代码,会比较安全,所以使用了一个update来执行android层的回调
void NTMainMenu::onPayResult( int nFlag, int nPayID, bool bResult )
{
schedule(schedule_selector(NTMainMenu::updateForPayResult));
}
void NTMainMenu::updateForPayResult( float dt )
{
unschedule(schedule_selector(NTMainMenu::updateForPayResult));
CCDirector::sharedDirector()->end();
}
4)但是对于这样一个好习惯,在这里却出了问题,这样使用后,游戏可以退出,但是再次进入时会发生一次闪退现象,说明前一次的退出时有问题的,具体原因有没有想明白,于是不使用update来执行这个退出游戏的回调,结果BUG不再出现了(这里可以这么解决,因为执行的是游戏退出,但是如果是其他性质的回调,还是要在update里做)
void NTMainMenu::onPayResult( int nFlag, int nPayID, bool bResult )
{
CCDirector::sharedDirector()->end();
/* schedule(schedule_selector(NTMainMenu::updateForPayResult));*/
}