我正在使用cocos2d-javascript创建一个跨平台的游戏,并希望创建一个看起来很原生的PC版本。我明白,经过一点修改,我可以在浏览器中运行我的cocos2d-javascript程序,但我想让程序在自己的(非浏览器)窗口中运行,能够创建多个窗口,具有本机访问权限没有通过浏览器安全控件等等到文件系统。基本上,我想让我的Python程序提供一个javascript引擎以及cocos2d-html5可以运行的canvas标签。一个非常简化的浏览器,如果你愿意的话。
我的问题是,在跨平台(即PC,Mac和Linux)方式中,实现这一目标的最简单方法是什么?我可以使用python-spidermonkey或python-v8作为javascript引擎,但我不确定如何最好地提供可以绘制的canvas标记。
答案 0 :(得分:1)
如果您正在寻找最简单的“我编写最少代码”,那么嵌入完整浏览器实际上比从头开始编写精简浏览器更容易。
因此,最简单的解决方案可能是使用QWebView
。
在幕后,这与您可以获得的简单(或“精简”)相差甚远:您正在使用功能强大,复杂的跨平台GUI库,该库具有深度集成的WebKit包装器,可以公开URL,甚至网页之类的自定义对象,一直到对象模型。
但是从您的代码中,只需将Web视图粘贴到窗口中,创建一个带有canvas
标记的HTML页面和您的JS应用程序,并将所有内容挂钩。
一个缺点是学习曲线。 Qt很大,在你做任何有用的事情之前,你必须至少学习基本的概念。幸运的是,如果你已经完成了ObjC编程,信号和插槽,QObject模型等应该都非常熟悉......但不完全相同。
另一个缺点是分配。您需要要求Qt和PySide(或PyQt)以及Python(这是一项非常重要的要求,除非您只关心Linux用户),或者了解包装PySide
与cx_freeze
的细节。 } / py2exe
/ py2app
/等
从外面与画布或JS代码交谈是非常容易的。 QWebView
包含QWebPage
,其中包含QWebFrame
,这是一个由QWebElement
包装器组成的完整DOM:
frame = view.page().mainFrame()
canvas = frame.findFirstElement("#cocos-canvas')
然后,您可以在DOM本身或任何元素上调用evaluateJavaScript
,就像您从ObjC的WebKit包装器中发现的那样。
换句话说,虽然可以执行注入JS或评估回调代码的函数定义的相同技巧,但您也可以将QAction
附加到a网页,您可以使用与正常操作(菜单项,按钮点击等)相同的方式进行连接。当然,JS可以像用户一样轻松地触发它们。
或者您可以通过调用addToJavaScriptWindow
直接向JS公开任何QObject
子类,这允许您的JS代码调用对象上的方法,包括附加回调的方法。有关详细信息,请参阅The QtWebKit Bridge。