cocos2dx 添加移动基地计费代码后如何安全执行退出

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));*/
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值