为Cocos2d-x增加带Button回调的系统级消息框(MessageBox)

前端之家收集整理的这篇文章主要介绍了为Cocos2d-x增加带Button回调的系统级消息框(MessageBox)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


目标: 当点击系统消息框中的 "ok" 按钮时,可执行一段我们自己任意指定的c++代码...

实现: 修改(或添加)代码如下,


----------------------------------------------
platform/CCCommon.h

  1. #include <functional>
  2.  
  3. // 回调类型
  4. typedef std::function<void()> MessageBox_Callback;
  5.  
  6. // 带回调的消息框
  7. void CC_DLL MessageBox(const char * msg,const char * title,const MessageBox_Callback & callback);


----------------------------------------------
platform/ios/CCCommon.mm

  1. // 消息框代理
  2. @interface MessageBox_Delegate : NSObject <UIAlertViewDelegate>
  3. {
  4. MessageBox_Callback mCallback;
  5. }
  6. - (id)initWithCallback:(const MessageBox_Callback &)callback;
  7. @end
  8.  
  9. @implementation MessageBox_Delegate
  10. - (id)initWithCallback:(const MessageBox_Callback &)callback;
  11. {
  12. if (self = [super init])
  13. {
  14. mCallback = callback; // 备份对象
  15. }
  16. return(self);
  17. }
  18. - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
  19. {
  20. [alertView setDelegate: nil];
  21. [self autorelease];
  22. mCallback(); // 回调
  23. }
  24. @end
  25.  
  26. void MessageBox(const char * msg,const MessageBox_Callback & callback)
  27. {
  28. MessageBox_Delegate * modalDelegate = [[MessageBox_Delegate alloc] initWithCallback: callback];
  29. NSString * tmpTitle = (title) ? [NSString stringWithUTF8String : title] : nil;
  30. NSString * tmpMsg = (msg) ? [NSString stringWithUTF8String : msg] : nil;
  31. UIAlertView * messageBox = [[UIAlertView alloc] initWithTitle: tmpTitle
  32. message: tmpMsg
  33. delegate: modalDelegate
  34. cancelButtonTitle: @"OK"
  35. otherButtonTitles: nil];
  36. [messageBox autorelease];
  37. [messageBox show];
  38. }


----------------------------------------------

platform/android/CCCommon.cpp

  1. void MessageBox(const char * msg,const char * title)
  2. {
  3. showDialogJNI(msg,title,0); // 回调地址为0 则不回调
  4. }
  5.  
  6. void MessageBox(const char * msg,const MessageBox_Callback & callback)
  7. {
  8. MessageBox_Callback * Callback = new MessageBox_Callback(); // 待回调后 delete
  9. *Callback = callback; // 备份对象
  10. showDialogJNI(msg,(long long)Callback); // 将地址作为64位整型传给Java(防止日后将c++代码编译为64位版本)
  11. }
  12.  
  13. extern "C"
  14. {
  15. // 供Java回调
  16. JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxHandler_onDialogButtonClicked(JNIEnv* env,jobject thiz,jlong callback)
  17. {
  18. if (0 != callback)
  19. {
  20. MessageBox_Callback * Callback = (MessageBox_Callback *)callback;
  21. (*Callback)(); // 回调之
  22. delete Callback; // 删除对象
  23. }
  24. }
  25. }


----------------------------------------------

Java_org_cocos2dx_lib_Cocos2dxHelper.h

  1. extern void showDialogJNI(const char * pszMsg,const char * pszTitle,long long pCallback);


----------------------------------------------
Java_org_cocos2dx_lib_Cocos2dxHelper.cpp

  1. void showDialogJNI(const char * pszMsg,long long pCallback)
  2. {
  3. if (!pszMsg)
  4. {
  5. return;
  6. }
  7.  
  8. JniMethodInfo t;
  9. if (JniHelper::getStaticMethodInfo(t,CLASS_NAME,"showDialog","(Ljava/lang/String;Ljava/lang/String;J)V")) // **
  10. {
  11. jstring stringArg1;
  12.  
  13. if (!pszTitle)
  14. {
  15. stringArg1 = t.env->NewStringUTF("");
  16. }
  17. else
  18. {
  19. stringArg1 = t.env->NewStringUTF(pszTitle);
  20. }
  21.  
  22. jstring stringArg2 = t.env->NewStringUTF(pszMsg);
  23. t.env->CallStaticVoidMethod(t.classID,t.methodID,stringArg1,stringArg2,pCallback); // 调用Java
  24.  
  25. t.env->DeleteLocalRef(stringArg1);
  26. t.env->DeleteLocalRef(stringArg2);
  27. t.env->DeleteLocalRef(t.classID);
  28. }
  29. }


----------------------------------------------

Cocos2dxHelper.java

  1. public class Cocos2dxHelper
  2. {
  3. private static void showDialog(final String pTitle,final String pMessage,final long pCallback) // 供c++调用
  4. {
  5. Cocos2dxHelper.sCocos2dxHelperListener.showDialog(pTitle,pMessage,pCallback);
  6. }
  7.  
  8. public static interface Cocos2dxHelperListener // 此接口由Cocos2dxActivity实现
  9. {
  10. public void showDialog(final String pTitle,final long pCallback);
  11. }
  12. }


----------------------------------------------
Cocos2dxActivity.java

  1. public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener
  2. {
  3. @Override
  4. public void showDialog(final String pTitle,final long pCallback)
  5. {
  6. Message msg = new Message();
  7. msg.what = Cocos2dxHandler.HANDLER_SHOW_DIALOG;
  8. msg.obj = new Cocos2dxHandler.DialogMessage(pTitle,pCallback);
  9. this.mHandler.sendMessage(msg);
  10. }
  11. }


----------------------------------------------
Cocos2dxHandler.java

  1. public class Cocos2dxHandler extends Handler
  2. {
  3. private static LinkedList<DialogData> sDialogDataList = null;
  4.  
  5. // c++ 回调
  6. public static native void onDialogButtonClicked(long callback);
  7.  
  8. private void showDialog(Message msg)
  9. {
  10. Cocos2dxActivity theActivity = this.mActivity.get();
  11. DialogMessage dialogMessage = (DialogMessage)msg.obj;
  12. AlertDialog alertDialog = new AlertDialog.Builder(theActivity)
  13. .setCancelable(false)
  14. .setTitle(dialogMessage.titile)
  15. .setMessage(dialogMessage.message)
  16. .setPositiveButton("Ok",new DialogInterface.OnClickListener()
  17. {
  18. @Override
  19. public void onClick(DialogInterface dialog,int which)
  20. {
  21. if (null != sDialogDataList)
  22. {
  23. Iterator<DialogData> listItr = sDialogDataList.iterator();
  24. while (listItr.hasNext()) // 遍历list找dialog
  25. {
  26. DialogData dialogData = listItr.next();
  27. if (dialogData.dialog == dialog)
  28. {
  29. onDialogButtonClicked(dialogData.callback); // 回调c++
  30. listItr.remove(); // 移除
  31. break;
  32. }
  33. }
  34. }
  35. }
  36. })
  37. .create();
  38. if (null == sDialogDataList) // 初始化list
  39. {
  40. sDialogDataList = new LinkedList<DialogData>();
  41. }
  42. DialogData dialogData = new DialogData(alertDialog,dialogMessage.callback); // Dialog与callback绑定
  43. sDialogDataList.addFirst(dialogData); // 存入list (后弹出的对话框 会先被点击 所以放在list头部 便于查询)
  44. alertDialog.show();
  45. }
  46.  
  47. private static class DialogData // dialog及对应的callback
  48. {
  49. public DialogInterface dialog;
  50. public long callback;
  51. public DialogData(DialogInterface dialog,long callback)
  52. {
  53. this.dialog = dialog;
  54. this.callback = callback;
  55. }
  56. }
  57. public static class DialogMessage
  58. {
  59. public String titile;
  60. public String message;
  61. public long callback;
  62. public DialogMessage(String title,String message,long callback)
  63. {
  64. this.titile = title;
  65. this.message = message;
  66. this.callback = callback;
  67. }
  68. }
  69. }


----------------------------------------------
调用实例

  1. cocos2d::MessageBox("连接服务器失败","通知",[this]()
  2. {
  3. if (GGlobal::GLoginSocket->ConnectLoginServer()) // 重新请求连接
  4. {
  5. this->mTimeUsed = 0.0f;
  6. }
  7. }
  8. );


----------------------------------------------

以上源代码文件在不同版本的cocos2d-x中可能路径略微有差别,可自行搜索定位,目前只实现了Android和iOS版,仅供参考.

猜你在找的Cocos2d-x相关文章