cocos2d 嵌入网页_在 cocos2d-x 中嵌入浏览器-程序员宅基地

技术标签: cocos2d 嵌入网页  

在 cocos2d-x 中嵌入浏览器

次阅读

Embeds a browser in cocos2d-x

在游戏中嵌入网页是很常见的需求,cocos2d-x 引擎官方并没有提供这个功能。

我在网上转了一圈,把找到的资料做了一些修改,将其集成到我们使用的 quick-cocos2d-x 引擎中。

主要代码来自:CCXWebview,这里 还有一篇专门讲解Android嵌入浏览器的文章,可以参考。

集成的类叫做 CCWebView,位于 extensions 之中。

本文基于 cocos2d-x 2.x,下面的 Android 平台部分介绍了一些 cocos2d-x 3.x的相关信息。

效果如下:

50be6004a0e0621ce72e9f5f02a66e3c.png

显示本博客

2c79e4088a9cfa19b53a0ec86ecca390.png

在浏览器中输入

做什么?

在游戏中,我们需要显示系统公告,或者制作一些需要复杂图文混排的界面,这些东西如果用 cocos2d-x 来做,未免太过麻烦。嵌入一个网页就简单的多。

现在的修改能满足这样一些简单的使用:

显示一个指定地址的网页,设定网页的大小和位置;

更新一个已经显示的网页的内容;

关闭已经显示的网页。

然后,就没有了。因为目前的项目不需要和浏览器交互,所以希望用 CCWebView 来实现一个商城的话可能会比较难办,要做一些扩展。

在 Android 中,浏览器与 Game 并不在一个线程,因此也没有提供把让cocos2d-x 来控制增加浏览器的关闭按钮之类的功能。如果要实现这些,最好的方法是浏览器不做全屏,然后用cocos2d-x实现一些按钮放在浏览器之上,点击按钮调用 CCWebView 的关闭函数。

怎么做?

这里只放出lua代码,C++请脑补。

创建内嵌浏览器并显示一个网站:

1-- 创建一个CCWebView,同时设置ActivityName为主Activity的包(后面会详述)

2self._webview = CCWebView:create("us/t1201/testplayer/Testplayer")

3self._webview:retain()

4-- 显示一个网页,坐标20,20(左上角为0,0),宽度1000, 高度500

5self._webview:showWebView("http://zengrong.net", 20, 20, 1000, 500)

6-- 显示包名

7print("getActivityName:", self._webview:getActivityName())

更新已有浏览器中显示的网址,移除并销毁浏览器:

1self._webview:updateURL("https://blog.zengrong.net/post/2112.html")

2self._webview:removeWebView();

3self._webview:release()

4self._webview = nil

封装

为了方便使用,我封装了一个 webview.lua 放在 framework 里面,这样只需要记住 show 和 remove 方法就好了。

由于C++中没有处理CCWebView可能重复的情况,我把 webview 做成单例的,保证任何时候都只有一个 CCWebView 在工作。

使用这个封装,我写了一个完整的测试项目,看这里:

1local WebViewTest = class("WebViewTest", function()

2return display.newNode()

3end)

4

5function WebViewTest:ctor()

6self:_showUI()

7self:_test()

8end

9

10function WebViewTest:_test()

11webview.setActivityName("us/t1201/testplayer/Testplayer")

12print("getActivityName:", webview.getActivityName())

13end

14

15function WebViewTest:_showUI()

16local __menu = ui.newMenu({

17ui.newTTFLabelMenuItem(

18{

19text="show(http://zengrong.net, 20,20,1000,500)",

20listener = function()

21webview.show("http://zengrong.net", 20,20, 1000, 500)

22end

23}),

24ui.newTTFLabelMenuItem(

25{

26text="show(http://zhihu.com, 0,0,500,300)",

27listener = function()

28webview.show("http://zhihu.com", 0,0, 500, 300)

29end

30}),

31ui.newTTFLabelMenuItem(

32{

33text="show(http://github.com)",

34listener = function()

35webview.show("http://github.com")

36end

37}),

38ui.newTTFLabelMenuItem(

39{

40text="remove()",

41listener = function()

42webview.remove()

43end

44}),

45})

46:addTo(self)

47:pos(display.cx,display.bottom+100)

48__menu:alignItemsVertically()

49end

50

51return WebViewTest

需要注意的是,在上面的例子中,如果希望改变已有的内嵌浏览器的大小,必须先remove才可以生效。

跨平台

目前内嵌浏览器仅支持 iOS 和Android 平台。以下是一些需要注意的地方(非常重要!):

Android 平台

在创建CCWebView的时候必须提供你的项目的主Activity的包路径和类名。CCWebView 需要结合主Activity中提供的一些方法才能工作。这些方法我已经添加到 项目模板 中。

如果是老项目,请比较 项目模版 和自己的主Activity的区别,加入缺少的方法(相信我,这很简单)。

如果是新项目,请使用项目创建程序 create_project 来创建。它会使用模版来自动加入这些方法。

注意写包路径和类名的格式与JAVA的习惯不同,需要把点 . 替换成斜线 / 。

使用 getActivityName() 方法可以返回传入的包名。

对于 cocos2d-x 3.x,由于Activity继承自NativeActivity,因此需要使用 getWindowManager().addView() 来加入Android控件。详见:Cocos2d-x 3.0beta成功添加Android的webview 。

iOS 平台

iOS不需要提供包名,因此可以直接使用不带参数的 create() 方法来创建 CCWebView 。但为了避免判断平台使用不同的创建方法,也可以直接传入 Android 中需要的包名。iOS平台下的代码不会记录和处理这个值。

使用 getActivityName() 方法将总是返回空字符串。

在iOS平台上,浏览器的分辨率设定是个问题。对于高清设备,你传递的值其实是真实值的一半。例如在iPhone5上调用这句:

1showWebView("http://zengrong.net", 20, 20, 1000, 500)

那么最终显示的效果是浏览器宽度超出屏幕。因为这里的宽度1000其实等于2000。

而在标清设备上(例如iPad2),传递的宽度就是真实的宽度。

Mac OS X 平台

在 quick-x-player Mac 版本中,调用 CCWebView 的方法将不会有任何作用,也不会报错,这是正常的。

Windows 平台

在 quick-x-player Windows 版本中,调用 CCWebView 的方法将不会有任何作用,也不会报错,这是正常的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_32467749/article/details/113026855

智能推荐

VM二次开发VM.PlatformSDKCS.VmException:“应用程序中的错误。”-程序员宅基地

文章浏览阅读72次。这是因为VM开发框架与你的目标框架不同导致,点击属性将目标框架切换到对应即可,如果不行就都试一遍,我这里是4.7.1,VM4.3,谢谢支持与点赞。

Elastic Job 同城主备、同城双活,高可用必备_es集群 双活方案-程序员宅基地

文章浏览阅读776次。在使用Elastic Job Lite做定时任务的时候,我发现很多开发的团队都是直接部署单点,这对于一些离线的非核心业务(如对账、监控等)或许无关紧要,但对于一些高可用补偿、核心数据定时修改(如金融场景的利息更新等),单点部署则“非常危险”。实际上,Elastic Job Lite是支持高可用的。网上关于Elastic Job的较高级的博文甚少,本文试图结合自身实践的一些经验,大致讲解其方案原理,并延伸至同城双机房的架构实践。单点部署到高可用如本文开头所说,很多系统的部署是采取以下部署架构:_es集群 双活方案

SAP ABAP 反查BOM, 找出它的上阶_abap bom反查至最上层-程序员宅基地

文章浏览阅读2.5k次。更多内容关注公众号:SAP Technical各位可以关注我的公众号:SAP Technical查询物料的上阶方法有三:1. CS15 可直接查出物料的上阶直至顶阶物料.2. CALL FUNCTION. 只能查上上阶, 要想得到顶阶, 需要递归查询.CS_WHERE_USED_MAT Bills of material; where-used li..._abap bom反查至最上层

JS(JavaScript)详解-程序员宅基地

文章浏览阅读7k次,点赞7次,收藏37次。JavaScript是由Netscape(网景)公司研发出来的一种在它的Navigator浏览器上执行的程序语言。JavaScript是一种基于对象(object-based)和事件驱动(Event Driven)的简单的并具有安全性能的脚本语言。JavaScript组成ECMAScript:JavaScript的核心,语法格式,使用方法文档对象模型(DOM,document object model):DOM(文档对象模型)是 HTML 和 XML 的应用程序接口(API)。_js

最好用的caffe深度学习简单批处理数据集(windows+linux+Python)_win linux 深度学习 数据集-程序员宅基地

文章浏览阅读395次。简单的批处理方式,包含了windows系统下的bat文件,Linux系统下的sh文件以及最牛逼的Python脚本。在进行AI相关的研究时,不可避免的需要去进行处理数据集。有些数据集是现成的,有些数据集却是需要自己去定制的。以下是自己在学习的过程中总结出来的比较常见的几种方式去处理数据。因为做的是CV,所以设计的处理方式多是处理图片。一、windows下的bat1、统计每个文件夹的名称以及相应文..._win linux 深度学习 数据集

8hutool实战:ChineseDate(农历日期工具类)_hutool chinesedate-程序员宅基地

文章浏览阅读1.3w次,点赞17次,收藏9次。hutool实战:农历日期工具,最大支持到2055年,支持:- 通过公历日期构造获取对应农历- 通过农历日期直接构造关键字:java java JAVA hutool hutool Hutool 工具类 工具类 工具类 DateUtil DateUtil DateUtil_hutool chinesedate

随便推点

Oracle19c安装及监听配置&PLSQL Developer安装-程序员宅基地

文章浏览阅读233次。首先,在“开始”菜单栏中找到Oracle-OraDB19Home1(因安装版本不同可能会有差异),接着打开Net Configuration Assistant,进行监听程序的配置;使用dos命令(windows徽标+R--输入cmd)/菜单栏搜索框直接输入cmd,输入lsnrctl status;监听程序配置完成后再通过cmd输入lsnrctl status命令,测试如下则说明监听程序已配置完成;Oracle主目录用户口令即在下载Oracle时自定义的口令密码;若如下图显示则是尚未开启监听程序;

Java中8种常见的数据结构_java数据结构-程序员宅基地

文章浏览阅读152次。数组、链表、堆、栈、队列、树、哈希、图。_java数据结构

C11新特性-程序员宅基地

文章浏览阅读1.1k次。C++11常用特性总结1、关键字及新语法C++11相比C++98增加了许多关键字及新的语法特性,很多人觉得这些语法可有可无,没有新特性也可以用传统C++去实现。也许吧,但个人对待新技术总是抱着渴望而热衷的态度对待,也许正如很多人所想,用传统语法也可以实现,但新技术可以让你的设计更完美。这就如同在原来的维度里,你要完成一件事情,需要很多个复杂的步骤,但在新语法特性里,你可以从另外的维度,很干脆,直接就把原来很复杂的问题用很简单的方法解决了,我想着就是新的技术带来的一些编程体验上非常好的感觉。大家也不要觉_c11新特性

hive导入导出数据自动化的shell脚本_shell一个脚本同时导入导出数据-程序员宅基地

文章浏览阅读3.2k次。1.从mysql导入到hive的ods层的shell脚本传参表示要导入的数据分期日期,sqoop导入,实例:#!/bin/bashexport SQOOP_HOME=/usr/bin/sqoopif [ $# == 1 ] then dateStr=$1 else dateStr=`date -d '-1 day' +'%Y-%m-%d'`fidateNowStr=`date +'%Y-%m-%d'`yearStr=`date -d ${dateStr}_shell一个脚本同时导入导出数据

python 报错 被呼叫方拒绝接收呼叫_在对excel的操作中报错,被呼叫方拒绝接收呼叫...-程序员宅基地

文章浏览阅读1.1k次。-王大海 2009-03-12 06:25(二) 使用Delphi 控件方法在Form中分别放入ExcelApplication, ExcelWorkbook和ExcelWorksheet。1) 打开Excel :ExcelApplication1.Connect;2) 显示当前窗口:ExcelApplication1.Visible[0]:=True;3) 更改 ..._python win32 被呼叫方拒绝接收呼叫

matlab区间非等长分隔,离散数据自适应区间划分优化问题-程序员宅基地

文章浏览阅读689次。原有260个样本点,我分为Num_QuJian=10 段,如果RMS太大,则再分为20段,主要是这个意思。clc;clear allformat longglobal Num_QuJian %%% 大于等于2 整个区间划分为n段Num_QuJian=10global QuJian fmaxQuJian=260;global V_O m RMSV_O=[];%%%%生成约束 AX<=..._matlab 划分区间