发明内容
本发明提供了一种cocos2dx嵌入cef实现透明网页的方法,以解决Windows平台下无法在cocos2dx框架下实现透明网页的加载的问题,填补了cocos2dx在Windows平台下内嵌加载网页的空缺。
为解决上述技术问题,本发明的技术方案为:
一种cocos2dx嵌入cef实现透明网页的方法,包括以下步骤:
S1:在cocos2dx中创建并显示网页层,开启所述网页层的刷新定时器,创建浏览器对象;
S2:创建cef事件处理对象,注册所述事件处理对象到所述浏览器对象;
S3:启动cef消息循环,分发处理消息,将渲染后得到的RGBA的位图数据回调给所述网页层,所述网页层将所述数据缓存到队列尾部;
S4:所述网页层在刷新定时器回调中检测缓存队列中是否有网页数据,若无数据,则重复检测;若有数据,则判断背景精灵是否已创建,若未创建,则使用所述数据创建背景精灵和初始化纹理,若已创建,则使用所述数据更新纹理;
S5:所述网页层检测是否有键盘、鼠标事件触发,若有,则重组消息发送给cef;若无,则转去执行S4。
进一步地,在S1之前还包括:初始化cef环境,创建全局CefApp对象,开启离屏渲染,调用CefInitialize完成初始化。
进一步地,S1中开启所述网页层的刷新定时器具体包括:调用ScheduleUpdate开启update定时器。
进一步地,S1中创建浏览器对象具体包括:调用CefBrowserHost::CreateBrowser创建浏览器对象。
进一步地,S3中将渲染后得到的RGBA的位图数据回调给所述网页层进一步包括:cef通过OnPaint回调出渲染后得到的RGBA的位图数据,通知网页层有数据回调。
进一步地,在S3之前还包括:cef通过所述事件处理对象回调出网页显示的大小和位置。
进一步地,S5中所述网页层检测是否有键盘、鼠标事件触发进一步包括:所述网页层注册mouse down、move和up事件的监听,将收到的坐标封装成windows鼠标消息事件,调用cef的发送鼠标消息接口传递给cef内部响应。
进一步地,S5中所述网页层检测是否有键盘、鼠标事件触发还进一步包括:所述网页层重定向主窗口的窗口过程,检测到键盘事件时,调用cef的发送键盘消息接口传递给cef内部响应。
进一步地,S3中将渲染后得到的RGBA的位图数据回调给所述网页层之前还包括:判断是否有位图数据回调,当有位图数据时,将所述位图数据缓存入队列。
进一步地,在S5步骤之后还包括:关闭主窗口时,发送退出消息给cef,等待cef退出循环,调用CefShutdown释放cef环境。
本发明提供了一种cocos2dx嵌入cef实现透明网页的方法,包括以下步骤:S1:在cocos2dx中创建并显示网页层,开启所述网页层的刷新定时器,创建浏览器对象;S2:创建cef事件处理对象,注册所述事件处理对象到所述浏览器对象;S3:启动cef消息循环,分发处理消息,将渲染后得到的RGBA的位图数据回调给所述网页层,所述网页层将所述数据缓存到队列尾部;S4:所述网页层在刷新定时器回调中检测缓存队列中是否有网页数据,若无数据,则重复检测;若有数据,则判断背景精灵是否已创建,若未创建,则使用所述数据创建背景精灵和初始化纹理,若已创建,则使用所述数据更新纹理;S5:所述网页层检测是否有键盘、鼠标事件触发,若有,则重组消息发送给cef;若无,则转去执行S4。本发明提供的cocos2dx嵌入cef实现透明网页的方法,cef启用离屏渲染功能,将网页内容渲染成RGBA的位图数据后回调给cocos2dx的layer层,在cocos2dx框架下显示位图实现透明网页的加载,填补了cocos2dx在Windows平台下内嵌web的空缺。
具体实施方式
本发明实施例提供了一种cocos2dx嵌入cef实现透明网页的方法,cef离屏渲染回调位图数据,cocos2dx显示位图数据实现透明网页的加载,填补了cocos2dx在Windows平台下内嵌web的空缺。
为了便于理解本发明,下面将参照相关附图对本发明进行更全面的描述。附图中给出了本发明的首选实施例。但是,本发明可以以许多不同的形式来实现,并不限于本文所描述的实施例。相反地,提供这些实施例的目的是使对本发明的公开内容更加透彻全面。
除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明。本文所使用的术语“及/或”包括一个或多个相关的所列项目的任意的和所有的组合。
在Windows下实现透明网页的功能,一般会从设置窗口透明度来实现,但是微软限制只能设置主窗口的透明度,无法修改子窗口透明度,因此,想要在cocos2dx主窗口以子窗口的形式嵌入cef浏览器的这一功能是不能实现透明网页的。
另外设置窗口透明度的方法会将整个窗口都透明化,导致网页中非透明的东西显示不出来。如果采用抠颜色值的方式来实现透明,那么网页中要显示的内容不能使用该颜色值,且抠颜色的效果会出现明显的毛边。因此,想要实现透明网页的功能,只能通过cef提供的离屏渲染功能来回调出带有透明值的rgb数据,cocos2dx能够很好地显示这种数据。
本发明实施例提供的cocos2dx嵌入cef实现透明网页的方法,采用谷歌开源浏览器框架cef3的离屏渲染功能来加载网页,并输出RGBA图像,cocos2dx来渲染该图像,当Alpha通道设置为0时,即可显示为透明。cocos2dx捕捉鼠标和键盘的输入事件,传递给cef3来完成响应。基于这种方案,可在cocos2dx框架下实现透明网页的加载,填补了cocos2dx在Windows平台下内嵌加载网页的空缺。
本发明实施例提供的cocos2dx嵌入cef实现透明网页的方法,包括以下步骤:
S100:在cocos2dx中创建并显示网页层,开启所述网页层的刷新定时器,创建浏览器对象;
S200:创建cef事件处理对象,注册所述事件处理对象到所述浏览器对象;
S300:启动cef消息循环,分发处理消息,将渲染后得到的RGBA的位图数据回调给所述网页层,所述网页层将所述数据缓存到队列尾部;
S400:所述网页层在刷新定时器回调中检测缓存队列中是否有网页数据,若无数据,则重复检测;若有数据,则判断背景精灵是否已创建,若未创建,则使用所述数据创建背景精灵和初始化纹理,若已创建,则使用所述数据更新纹理;
S500:所述网页层检测是否有键盘、鼠标事件触发,若有,则重组消息发送给cef;若无,则转去执行S400。
本发明实施例提供的cocos2dx嵌入cef实现透明网页的方法,基本实现思路为:
初始化cef环境:创建全局CefApp对象,开启离屏渲染,调用CefInitialize完成初始化;
在cocos2dx的layer中开启update定时器,每帧刷新前检查缓存队列中是否有网页数据;
创建cef事件处理对象CefClient,调用CefBrowserHost::CreateBrowser创建浏览器,并将事件对象注册进去;
cef通过CefClient回调出来获取网页显示的大小和位置;
cef通过OnPaint回调出RGBA的网页数据,通知layer有数据回调;
layer将数据缓存到队列;
Update定时器检测到数据,初次时使用数据创建纹理和精灵,后续直接使用数据更新纹理;
layer注册mouse down,move和up事件,将收到的坐标封装成windows鼠标消息事件,调用SendMouseMoveEvent发送给cef;
layer重定向主窗口的窗口过程,检测到键盘事件时,调用SendKeyEvent转发给cef;
主程退出时,发送退出消息给cef,并等待cef退出自身循环,调用CefShutdown释放cef环境。
本发明实施例中cocos2dx和cef交互主要时序图,其中cocos2dx主线程的流程为:
(1)初始化,创建显示网页层layer;
(2)创建子线程用来执行cef主循环;
(3)ScheduleUpdate开启layer的update定时器,每帧刷新前检查缓存队列中是否有网页数据;
(4)调用CefBrowserHost::CreateBrowser创建浏览器对象;
(5)在update回调中检测缓存队列中是否有数据;若没有数据,则重复检测;若有数据,取出一帧图像,初始时创建纹理和背景精灵,以数据初始化纹理,后续直接更新纹理;
(6)检测是否有鼠标、键盘事件触发,若有,则重组成windows消息,发送给cef处理;若没有,则重复第(5)步。
cef子线程的流程为:
(1)初始化cef环境,开启离屏渲染,创建消息循环对象,创建ClientApp对象,调用CefInitialize完成初始化;
(2)调用cef消息循环,进入循环,分发处理消息;
(3)检测是否有位图数据回调,若有,则返回给cocos2dx主线程,主线程将数据进行缓存;
(4)检测是否退出,若是,则停止cef消息循环,释放cef环境,退出子线程。
本发明实施例提供的cocos2dx嵌入cef实现透明网页的方法,cef启用离屏渲染功能,注册render回调。加载网页成功后,通过其渲染功能,会将网页内容渲染成RGBA的位图数据,通过render的OnPaint回调接口,将该位图数据回调给cocos2dx的layer层。layer拿到该位图数据后,先缓存到内存队列尾部,然后在cocos2dx主线程中开启update定时器,在每一帧渲染前,在定时器回调中获取队列起始位图数据,更新到layer的背景精灵的纹理中,更新完后删除队首位图数据。
对于交互事件的处理过,对于鼠标事件,在cocos2dx的layer注册mouse的down,move和up事件的监听,在回调接口中获取鼠标的坐标,然后将坐标包装成Windows的鼠标事件,调用cef的发送鼠标接口传递给cef内部响应。对于键盘事件,通过win32 APISetWindowLong重新设置cocos2dx主窗口的窗口过程函数为新的接口,在该接口中检测键盘事件,若是键盘事件,直接调用cef的发送键盘消息接口将键盘事件传递给cef内部处理。
以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。