大家好,今天小编来为大家解答坦克大战电脑版下载这个问题,很多人还不知道,现在让我们一起来看看吧!
原游戏使用网页前端技术进行开发,主要使用React进行页面展现,使用Immutable.js作为数据结构工具库,使用redux管理游戏状态,以及使用redux-saga/little-saga处理复杂的游戏逻辑。
本文使用JCEF浏览器和原游戏网页整合,通过GraalVM打包成独立的桌面应用,运行效果:
游戏程序和源码下载地址:https://21doc.net/java/javagui
javag整合游戏的代码,主要是使用JCEF加载React编译后的网页文件,源码如下
packagecom.penngo.gui;\n\nimportme.friwi.jcefmaven.*;\nimportorg.cef.CefApp;\nimportorg.cef.CefApp.CefAppState;\nimportorg.cef.CefClient;\nimportorg.cef.browser.CefBrowser;\nimportorg.cef.browser.CefFrame;\nimportorg.cef.browser.CefMessageRouter;\nimportorg.cef.handler.CefDisplayHandlerAdapter;\nimportorg.cef.handler.CefFocusHandlerAdapter;\n\nimportjavax.swing.*;\nimportjava.awt.*;\nimportjava.awt.event.*;\nimportjava.io.File;\nimportjava.io.IOException;\n\npublicclassBattleCityextendsJFrame{\nprivatestaticfinallongserialVersionUID=-5570653778104813836L;\nprivatefinalJTextFieldaddress_;\nprivatefinalCefAppcefApp_;\nprivatefinalCefClientclient_;\nprivatefinalCefBrowserbrowser_;\nprivatefinalComponentbrowerUI_;\nprivatebooleanbrowserFocus_=true;\n\nprivateBattleCity(StringstartURL,booleanuseOSR,booleanisTransparent,String[]args)throwsUnsupportedPlatformException,CefInitializationException,IOException,InterruptedException{\n\nCefAppBuilderbuilder=newCefAppBuilder();\nbuilder.getCefSettings().windowless_rendering_enabled=useOSR;\nbuilder.setAppHandler(newMavenCefAppHandlerAdapter(){\n@Override\npublicvoidstateHasChanged(org.cef.CefApp.CefAppStatestate){\nif(state==CefAppState.TERMINATED)System.exit(0);\n}\n});\n\nif(args.length>0){\nbuilder.addJcefArgs(args);\n}\ncefApp_=builder.build();\nclient_=cefApp_.createClient();\nCefMessageRoutermsgRouter=CefMessageRouter.create();\nclient_.addMessageRouter(msgRouter);\n\nbrowser_=client_.createBrowser(startURL,useOSR,isTransparent);\nbrowerUI_=browser_.getUIComponent();\n\naddress_=newJTextField(startURL,100);\naddress_.addActionListener(e->browser_.loadURL(address_.getText()));\n\nclient_.addDisplayHandler(newCefDisplayHandlerAdapter(){\n@Override\npublicvoidonAddressChange(CefBrowserbrowser,CefFrameframe,Stringurl){\naddress_.setText(url);\n}\n});\n\naddress_.addFocusListener(newFocusAdapter(){\n@Override\npublicvoidfocusGained(FocusEvente){\nif(!browserFocus_)return;\nbrowserFocus_=false;\nKeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();\naddress_.requestFocus();\n}\n});\n\nclient_.addFocusHandler(newCefFocusHandlerAdapter(){\n@Override\npublicvoidonGotFocus(CefBrowserbrowser){\nif(browserFocus_)return;\nbrowserFocus_=true;\nKeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();\nbrowser.setFocus(true);\n}\n\n@Override\npublicvoidonTakeFocus(CefBrowserbrowser,booleannext){\nbrowserFocus_=false;\n}\n});\n\ngetContentPane().add(browerUI_,BorderLayout.CENTER);\npack();\nsetTitle(&34;);\nsetSize(1050,750);\nsetLocationRelativeTo(null);\nsetVisible(true);\n\naddWindowListener(newWindowAdapter(){\n@Override\npublicvoidwindowClosing(WindowEvente){\nCefApp.getInstance().dispose();\ndispose();\n}\n});\n}\n\npublicstaticvoidmain(String[]args)throwsUnsupportedPlatformException,CefInitializationException,IOException,InterruptedException{\nbooleanuseOsr=false;\nFilefile=newFile(&34;);\nnewBattleCity(&34;+file.getAbsolutePath(),useOsr,false,args);\n}\n}\n
GraalVM编译后的文件:
[捂脸]不过原网页游戏1M体积,整合JCEF后打包体积达到100M。
但是整合JCEF,也是方便实现桌面游戏的方法之一。
参考资料:
graalvm原生编译:https://github.com/graalvm/graalvm-ce-builds/releases
原游戏地址:https://github.com/shinima/battle-city
JCEF浏览器:https://github.com/chromiumembedded/java-cef
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!