2013-04-29 78 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

相關問題