Cocos2d-x   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了【玩转cocos2d-x之三十三】游戏嵌入Webview网页大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

原创作品,转载请标明:http://www.voidcn.com/article/p-ybpkbbax-ep.html


手游《我叫MT》一开始会弹出一个游戏公告,有玩过的肯定都蛮熟悉的,这就是webview,就是一个网页。由于webview和平台相关,这里就介绍下cocos2d-x如何嵌入andorid的webview控件,在cocos2d-x中显示网页。


1.Jni

Jni这里我就不再多说了。可用参wikipedia,或者微信飞机大战的移植篇。通过Jni,可以实现在cocos2d-x中调用Android的API,当然也可以进行传值。

2.Android使用webview

直接上代码。主要是处理布局和webview使用的问题。这里采用代码布局。以下操作在Android的主类(cocos2dxActivity)中处理

2.1.添加成员变量

整个布局的结构是最底层一个FrameLayout,ImageView控件放置在FrameLayout上。然后之上是一个LinearLayout用来放置关闭按钮,LinearLayout往下是Webview控件。

  1. staticTesttest=null;//Test实例
  2. WebViewm_webView;//WebView控件
  3. ImageViewm_imageView;//ImageView控件
  4. FrameLayoutm_webLayout;//FrameLayout布局
  5. LinearLayoutm_topLayout;//LinearLayout布局
  6. Buttonm_BACkButton;//关闭按钮

2.2.onCreate中添加FrameLayout布局

@H_673_130@
    protectedvoidonCreate(BundlesavedInstanceStatE){
  1. super.onCreate(savedInstanceStatE);
  2. test=this;
  3. //初始化一个空布局
  4. @H_338_65@m_webLayout=newFrameLayout(this);
  5. FrameLayout.LayoutParamslytp=newFrameLayout.LayoutParams(800,640);
  6. lytp.gravity=Gravity.CENTER;
  7. addContentView(m_webLayout,lytp);
  8. }


2.3.返回实例

@H_673_130@
    publicstaticTestgeTinstance(){
  1. Log.v("TestJacky","geTinstance");
  2. returntest;
  3. }

2.4.显示webview

@H_673_130@
    voidopenWebview(){
  1. :rgb(108,"openWebView");
  2. this.runOnUiThread(newRunnable(){//在主线程里添加别的控件
  3. voidrun(){
  4. //初始化webView
  5. @H_338_65@m_webView=newWebView(test);
  6. //设置webView能够执行javascript脚本
  7. @H_338_65@m_webView.getSetTings().setJavaScriptEnabled(true);
  8. //设置可以支持缩放
  9. @H_338_65@m_webView.getSetTings().setSupportZoom(true);//设置出现缩放工具
  10. @H_338_65@m_webView.getSetTings().setBuilTinZoomControls(true);
  11. //载入URL
  12. @H_338_65@m_webView.loadUrl("http://m.blog.csdn.net/blog/jackyvincefu/");
  13. //使页面获得焦点
  14. @H_338_65@m_webView.requestFocus();
  15. //如果页面中链接,如果希望点击链接继续在当前browser中响应
  16. @H_338_65@m_webView.setWebViewClient(newWebViewClient(){
  17. publicBooleanshouldOverrideUrlLoading(WebViewview,Stringurl){
  18. if(url.indexOf("tel:")<0){
  19. view.loadUrl(url);
  20. }
  21. returntrue;
  22. });
  23. //背景图
  24. @H_338_65@m_imageView=newImageView(test);
  25. @H_338_65@m_imageView.setImageresource(R.drawable.bkgnd);
  26. @H_338_65@m_imageView.setScaleType(ImageView.ScaleType.FIT_XY);
  27. //初始化线性布局里面加按钮和webView
  28. @H_338_65@m_topLayout=newLinearLayout(test);
  29. @H_338_65@m_topLayout.setOrientation(LinearLayout.VERTICAL);
  30. //初始化返回按钮
  31. @H_338_65@m_BACkButton=newButton(test);
  32. @H_338_65@m_BACkButton.setBACkgroundresource(R.drawable.btn);
  33. LinearLayout.LayoutParamslypt=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
  34. lypt.gravity=Gravity.RIGHT;
  35. @H_338_65@m_BACkButton.setLayoutParams(lypt);
  36. @H_338_65@m_BACkButton.setOnClickListener(newOnClickListener(){
  37. voidonClick(Viewv){
  38. removeWebView();
  39. }
  40. });
  41. //把image加到主布局里
  42. @H_338_65@m_webLayout.addView(m_imageView);
  43. //把webView加入到线性布局
  44. @H_338_65@m_topLayout.addView(m_BACkButton);
  45. @H_338_65@m_topLayout.addView(m_webView);
  46. //再把线性布局加入到主布局
  47. @H_338_65@m_webLayout.addView(m_topLayout);
  48. }

2.5.移除webview

@H_673_130@
    voidremoveWebView(){
  1. @H_338_65@m_webLayout.removeView(m_imageView);
  2. @H_338_65@m_imageView.destroyDrawingCache();
  3. @H_338_65@m_webLayout.removeView(m_topLayout);
  4. @H_338_65@m_topLayout.destroyDrawingCache();
  5. @H_338_65@m_topLayout.removeView(m_webView);
  6. @H_338_65@m_webView.destroy();
  7. @H_338_65@m_topLayout.removeView(m_BACkButton);
  8. @H_338_65@m_BACkButton.destroyDrawingCache();
  9. }

2.6.重写返回键

@H_673_130@
    publicBooleanonKeyDown(intkeyCoder,KeyEventevent)
  1. {
  2. //如果网页能回退则后退,如果不能后退移除WebView
  3. if(m_webView.canGoBACk()&&keyCoder==KeyEvent.KEYCODE_BACK){
  4. @H_338_65@m_webView.goBACk();
  5. }else{
  6. false;
  7. }

@L_675_15@3.cocos2d-x使用Jni

这里直接使用HelloWorld的示例,修改了close按钮的回调函数。


3.1.jni头文件

@H_673_130@
    #if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
  1. #include<jni.h>
  2. #include"platform/android/jni/JniHelper.h"
  3. #endif

3.2.Jni调用打开webview

@H_673_130@
    voidHelloWorld::menuCloseCallBACk(CCObject*pSender)
  1. JniMethodInfominfo;
  2. //getStaticMethodInfo,判断Java静态函数是否存在,并且把信息保存到minfo里
  3. //参数1:JniMethodInfo
  4. //参数2:Java类包名+类名
  5. //参数3:Java函数名称
  6. //参数4:函数参数类型和返回值类型
  7. boolisHave=JniHelper::getStaticMethodInfo(minfo,"com/jacky/test/Test","geTinstance","()Lcom/jacky/test/Test;");
  8. jobjectjobj;//存对象
  9. if(isHavE){
  10. //这里的调用geTinstance,返回Test类的对象。
  11. jobj=minfo.env->CallStaticObjectMethod(minfo.classID,minfo.methodID);
  12. isHave=JniHelper::getMethodInfo(minfo,"com/jacky/test/Test","openWebview","()V");
  13. if(isHavE){
  14. //调用openWebview,参数1:Test对象参数2:方法ID
  15. @H_338_65@minfo.env->CallVoidMethod(jobj,minfo.methodID);
  16. #else
  17. CCDirector::sharedDirector()->end();
  18. #if(CC_TARGET_PLATFORM==CC_PLATFORM_IOS)
  19. exit(0);
  20. #endif
  21. #endif
  22. }


4.效果图

爪机截屏的。






ps:这里没有处理多次打开webview的情况。可以采用Jni方法来通知cocos2d-x,也可以直接在主类中设置一个成员变量标志位,调用openWebview时设置为true,removeWebView时设置为false,在调用openWebview时检测这个标志位来决定是否打开即可。

5.源码下载

包含win32,android代码,拿掉了android交叉编译生成的obj,保留so和apk文件。
下载地址:http://download.csdn.net/detail/jackyvincefu/6770315

大佬总结

以上是大佬教程为你收集整理的【玩转cocos2d-x之三十三】游戏嵌入Webview网页全部内容,希望文章能够帮你解决【玩转cocos2d-x之三十三】游戏嵌入Webview网页所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:13cocoscocos2ddwebviewx之三十三嵌入游戏网页
猜你在找的Cocos2d-x相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap