【玩转cocos2d-x之三十三】游戏嵌入Webview网页

【玩转cocos2d-x之三十三】游戏嵌入Webview网页,第1张

概述原创作品,转载请标明:http://www.voidcn.com/article/p-ybpkbbax-ep.html 手游《我叫MT》一开始会d出一个游戏公告,有玩过的肯定都蛮熟悉的,这就是webview,就是一个网页。由于webview和平台相关,这里就介绍下cocos2d-x如何嵌入andorid的webview控件,在cocos2d-x中显示网页。 1.Jni Jni这里我就不再多说了。可

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


手游《我叫MT》一开始会d出一个游戏公告,有玩过的肯定都蛮熟悉的,这就是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控件。

[cpp] view plain copy staticTesttest=null;//Test实例 WebVIEwm_webVIEw;//WebVIEw控件 ImageVIEwm_imageVIEw;//ImageVIEw控件 FrameLayoutm_webLayout;//FrameLayout布局 linearLayoutm_topLayout;//linearLayout布局 buttonm_backbutton;//关闭按钮
2.2.OnCreate中添加FrameLayout布局

protectedvoIDonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); test=this; //初始化一个空布局 m_webLayout=newFrameLayout(this); FrameLayout.LayoutParamslytp=newFrameLayout.LayoutParams(800,640); lytp.gravity=Gravity.CENTER; addContentVIEw(m_webLayout,lytp); }


2.3.返回实例

publicstaticTestgetInstance(){ Log.v("TestJacky","getInstance"); returntest; }
2.4.显示webvIEw

voIDopenWebvIEw(){ "openWebVIEw"); this.runOnUiThread(newRunnable(){//在主线程里添加别的控件 voIDrun(){ //初始化webVIEw m_webVIEw=newWebVIEw(test); //设置webVIEw能够执行JavaScript脚本 m_webVIEw.getSettings().setJavaScriptEnabled(true); //设置可以支持缩放 m_webVIEw.getSettings().setSupportZoom(true);//设置出现缩放工具 m_webVIEw.getSettings().setBuiltInZoomControls(true); //载入URL m_webVIEw.loadUrl("http://m.blog.csdn.net/blog/jackyvincefu/"); //使页面获得焦点 m_webVIEw.requestFocus(); //如果页面中链接,如果希望点击链接继续在当前browser中响应 m_webVIEw.setWebVIEwClIEnt(newWebVIEwClIEnt(){ publicbooleanshouldOverrIDeUrlLoading(WebVIEwvIEw,Stringurl){ if(url.indexOf("tel:")<0){ vIEw.loadUrl(url); } returntrue; }); //背景图 m_imageVIEw=newImageVIEw(test); m_imageVIEw.setimageResource(R.drawable.bkgnd); m_imageVIEw.setScaleType(ImageVIEw.ScaleType.FIT_XY); //初始化线性布局里面加按钮和webVIEw m_topLayout=newlinearLayout(test); m_topLayout.setorIEntation(linearLayout.VERTICAL); //初始化返回按钮 m_backbutton=newbutton(test); m_backbutton.setBackgroundResource(R.drawable.btn); linearLayout.LayoutParamslypt=newlinearLayout.LayoutParams(linearLayout.LayoutParams.WRAP_CONTENT,linearLayout.LayoutParams.WRAP_CONTENT); lypt.gravity=Gravity.RIGHT; m_backbutton.setLayoutParams(lypt); m_backbutton.setonClickListener(newOnClickListener(){ voIDonClick(VIEwv){ removeWebVIEw(); } }); //把image加到主布局里 m_webLayout.addVIEw(m_imageVIEw); //把webVIEw加入到线性布局 m_topLayout.addVIEw(m_backbutton); m_topLayout.addVIEw(m_webVIEw); //再把线性布局加入到主布局 m_webLayout.addVIEw(m_topLayout); }
2.5.移除webvIEw

voIDremoveWebVIEw(){ m_webLayout.removeVIEw(m_imageVIEw); m_imageVIEw.destroyDrawingCache(); m_webLayout.removeVIEw(m_topLayout); m_topLayout.destroyDrawingCache(); m_topLayout.removeVIEw(m_webVIEw); m_webVIEw.destroy(); m_topLayout.removeVIEw(m_backbutton); m_backbutton.destroyDrawingCache(); }
2.6.重写返回键

publicbooleanonKeyDown(intkeyCoder,KeyEventevent) { //如果网页能回退则后退,如果不能后退移除WebVIEw if(m_webVIEw.canGoBack()&&keyCoder==KeyEvent.KEYCODE_BACK){ m_webVIEw.goBack(); }else{ false; }
3.cocos2d-x使用Jni 这里直接使用HelloWorld的示例,修改了close按钮的回调函数。


3.1.jni头文件

#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) #include<jni.h> #include"platform/androID/jni/JniHelper.h" #endif
3.2.Jni调用打开webvIEw

voIDHelloWorld::menuCloseCallback(CCObject*pSender) JniMethodInfominfo; //getStaticmethodInfo,判断Java静态函数是否存在,并且把信息保存到minfo里 //参数1:JniMethodInfo //参数2:java类包名+类名 //参数3:Java函数名称 //参数4:函数参数类型和返回值类型 boolisHave=JniHelper::getStaticmethodInfo(minfo,"com/jacky/test/Test","getInstance","()Lcom/jacky/test/Test;"); jobjectjobj;//存对象 if(isHave){ //这里的调用getInstance,返回Test类的对象。 jobj=minfo.env->CallStaticObjectMethod(minfo.classID,minfo.methodID); isHave=JniHelper::getmethodInfo(minfo,"com/jacky/test/Test","openWebvIEw","()V"); if(isHave){ //调用openWebvIEw,参数1:Test对象参数2:方法ID minfo.env->CallVoIDMethod(jobj,minfo.methodID); #else CCDirector::sharedDirector()->end(); #if(CC_TARGET_PLATFORM==CC_PLATFORM_IOS) exit(0); #endif #endif }


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网页所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1043805.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存