2013-04-29 32 views
2

我正在使用cocos2d-javascript创建一个跨平台的游戏,并且希望创建一个看起来很原生的PC版本。我明白,几乎没有修改,我可以在浏览器中运行我的cocos2d-javascript程序,但我想让程序在其自己的(非浏览器)窗口中运行,能够创建多个窗口,具有本地访问权限到文件系统而不需要通过浏览器安全控制等。基本上,我希望我的Python程序提供一个JavaScript引擎以及cocos2d-html5可以运行的画布标签。一个非常简洁的浏览器,如果你愿意的话。最简单的方法来包装一个画布标签+ JavaScript的Python程序?

我的问题是,以跨平台(即PC,Mac和Linux)方式完成此操作的最简单方法是什么?我可以在JavaScript引擎中使用python-spidermonkey或python-v8,但我不确定如何最好地提供可以绘制的画布标签。

+0

如果您从头开始,显然只是模拟HTML画布将比模拟整个HTML DOM简单得多。但是如果你正在寻找预先存在的代码,我不知道前者有什么,后者有多种可能性。显而易见的是WebKit/Chromium,并且有几种不同的包装。那是你要的吗? – abarnert 2013-04-29 19:35:55

+0

嗯,是的,我正在寻找最简单的“我写作的最少代码”。我还需要能够将JS代码挂接到Python代码中(例如,在相同的地方,这些挂钩将会插入本机的Objective-C代码中),例如 – Claudiu 2013-04-29 19:48:29

回答

1

如果您正在寻找最简单的“我写作最少的代码”,嵌入一个完整的浏览器实际上比从头开始编写精简的浏览器更容易。

所以,最简单的解决方案可能是使用QWebView。下面简单介绍一下,你可以得到如下的简单(或“精简”):你正在使用一个功能强大,复杂的跨平台GUI库,它有一个深度集成的WebKit包装器,暴露自定义对象,例如URL甚至是网页,直到对象模型。

但是从您的代码中,只需要将Web视图粘贴到窗口中,使用canvas标记和您的JS应用创建HTML页面,并将所有内容都挂钩。

一个缺点是学习曲线。 Qt很大,在你做任何有用的事情之前,你必须至少学习基本概念。幸运的是,如果你已经完成了ObjC编程,signal-and-slots,QObject模型等应该都很熟悉......但不完全一样。

另一个缺点是分布。您可能需要与Python一起使用Qt和PySide(或PyQt)(这是一项繁重的要求,除非您只关心Linux用户),或需要了解包装PySidecx_freeze/py2exe/py2app/etc的内容。


从外面与画布或JS代码交谈是非常容易的。该QWebView包含QWebPage,其中包含了QWebFrame,这是QWebElement包装由一个完整的DOM:

frame = view.page().mainFrame() 
canvas = frame.findFirstElement("#cocos-canvas') 

然后,您可以拨打evaluateJavaScript在DOM本身或任何元素,以同样的方式你从ObjC的WebKit包装器中找到熟悉的。

对于走另一条路,而你可以做注射JS或评估再打到你的代码的函数定义的同样的招数,你也可以只重视QAction s到一个网页,你可以再挂钩跟正常操作一样(菜单项,按钮点击等)。当然,JS可以像用户一样轻松触发它们。

或者您可以通过调用addToJavaScriptWindow将任何QObject子类直接暴露给JS,这允许您的JS代码调用对象的方法,包括附加回调的方法。详情请参阅The QtWebKit Bridge

+0

+1,以便使用该库的提示。但是,我能够在webview的javascript引擎和我的python代码之间进行通信吗? – Claudiu 2013-04-29 19:55:39

+0

@Claudiu:是的。你可以做同样的inject-and-eval-JS,听起来你已经习惯了... iOS可能吗?但更简单的是,您可以直接将'QAction'分配给Web DOM元素,这可以通过JS触发,就像带鼠标的用户一样容易。查看链接页面上的示例。 (不幸的是,它们是C++而不是Python,但是如果你编写ObjC,JS和Python,我猜你至少可以阅读C++。)如果你需要一个更详细/特定的例子,我可以搜索一个。 – abarnert 2013-04-29 19:59:12

+0

嗯看起来很有希望!我会在网站上做一些探索,但这可能是一条路。不是这个,就是重新实现pygame中的图形引擎或者PC版本的图形引擎,但是这看起来更容易。 – Claudiu 2013-04-29 20:06:38

相关问题