当前位置: 首页 > 科技观察

Java多人libgdx教程

时间:2023-03-15 01:34:12 科技观察

我们怎么做呢?修改libgdx主页上的libgdx示例“superjumper”。使用AppWarpCloud将其变成一个2人实时游戏。该游戏将匹配玩家,用户需要到达城堡才能赢得游戏胜利。用户将获得有关其他用户成就的实时反馈,增加了游戏的趣味性。Eclipse项目设置接下来,您需要从此git存储库下载libgdx游戏示例(superjumper)项目。.在Eclipse中打开下载的superjumper解决方案。您将看到如下项目:为了创建多人游戏,我使用了AppWarpJavaSDK(截至目前为1.5)对libgdx的依赖如libgdx官网所述,此示例依赖于libgbx。如果您尝试从libgbx网站运行superjumper示例程序,您将收到有关gdx、gdx-backend-lwjgl、gdx-jnigen、gdx-openal的错误。您需要将这些项目设置为您的应用程序(superjumper)的依赖项以解决这些错误。但我已将这些库包含在superjumpergit存储库的libs文件夹中。观看此视频或阅读此教程以了解有关安装libgdx项目的更多信息。获取您的AppWarp应用程序密钥如果您想与AppWarp云服务集成,您需要从ShepHertz开发人员面板AppHq获取您的应用程序密钥。这些密钥可以在ShepHertz云服务中识别您的应用程序空间,AppWarp云需要使用它们来隔离不同应用程序之间的消息。按照AppWarp网站上的步骤注册(免费)并获取您的应用程序密钥。现在打开superjumper示例项目中的WarpController.java文件并在其中添加这些值。例如:publicstaticStringAppKey="14a611b4b3075972be364a7270d9b69a5d2b24898ac483e32d4dc72b2df039ef";publicstaticStringSecretKey="55216a9a165b08d93f9390435c9be4739888d971a17170591979e5837f618059";运行多用户sample既然你已经准备好了,我们可以实际运行并观察这个游戏了。Becausethisgamehassingleplayerormultiplayeroptions,inordertoplaymultiplayeryouneedtoruniton2emulators/设备同时。当您按下多人游戏按钮时,游戏会连接到AppWarp并加入游戏室。进入游戏室后,客户端会在游戏开始前等待第二个玩家加入房间。现在你需要在第二个模拟器/设备上做同样的事情,AppWarp的配对API会将第二个玩家连接到同一个游戏房间,然后游戏就会开始。玩家需要到达城堡才能完成游戏。同时用户会发现他们的对手实时移动。这种游戏内实时通信是AppWarp的强大之处。游戏将在这三种情况下完成用户离开:当一名玩家离开游戏时,另一名玩家被判定为获胜者。因为他的对手已经离开了游戏。成功:到达城堡的玩家成为赢家。游戏结束:如果玩家碰到松鼠或玩家摔倒,则另一玩家成为赢家。#p#如何与AppWarp集成以启动游戏首先,您需要使用应用程序密钥(WarpController.java)初始化Warpclient单例。WarpClient.initialize(apiKey,secretKey);接下来,您需要连接到AppWarp云并加入游戏室(WarpController.java)注意:AppWarpSDK通过异步API提供其功能。这意味着您只需将请求侦听器添加到您的WarpClient实例以接收响应和通知。此文件(WarpController.java)包含此步骤所需的所有代码。它创建连接请求、房间请求、区域请求(如果需要创建房间)。所以我们在OnStart()方法中添加相关的监听器。publicWarpController(){initAppwarp();warpClient.addConnectionRequestListener(newConnectionListener(this));warpClient.addChatRequestListener(newChatListener(this));warpClient.addZoneRequestListener(newZoneListener(this));warpClient.addRoomRequestListener(newRoom)Listener(this)Listener;addNotificationListener(newNotificationListener(this));}privatevoidinitAppwarp(){try{WarpClient.initialize(apiKey,secretKey);warpClient=WarpClient.getInstance();}catch(Exceptione){e.printStackTrace();我们可以继续并建立联系。用户需要传入唯一的用户名(用户名)才能连接到AppWarp云。在示例中,我只使用了一个随机字符串(您也可以从用户或Facebook等第三方服务获取它来唯一标识用户)。随机字符串在MainMenuScreen.java文件中生成。WarpClient.connectWithUserName(用户名);连接的结果将提供给下面的回调函数。publicvoidonConnectDone(ConnectEvente){if(e.getResult()==WarpResponseResultCode.SUCCESS){callBack.onConnectDone(true);}else{callBack.onConnectDone(false);}}publicvoidonConnectDone(booleanstatus){if(status){warpClient.初始化UDP();warpClient.joinRoomInRange(1,1,false);}else{isConnected=false;处理错误();如果连接成功,我们将尝试加入一个房间。我们也可以选择初始化UDP(后面游戏玩家会用到)。要加入一个房间,我们使用JoinRoomInRange方法并传入参数(1,1),这将请求服务器将客户端加入一个只有一个用户的房间。如果失败,我们创建一个新房间并为两个玩家添加一个房间。publicvoidonJoinRoomDone(RoomEventevent){if(event.getResult()==WarpResponseResultCode.SUCCESS){//成功案例this.roomId=event.getData().getId();warpClient.subscribeRoom(roomId);}elseif(event.getResult()==WarpResponseResultCode.RESOURCE_NOT_FOUND){//nosuchroomfoundHashMapdata=newHashMap();data.put("结果","");warpClient.createRoom("superjumper","shephertz",2,data);}else{warpClient.disconnect();处理错误();一旦加入房间(现在或创建新房间后),客户端需要订阅此房间以接收房间通知(这在游戏中是必需的)。此处详细解释了这些概念。订阅后,我们需要调用getLiveRoomInfo来查看房间内是否有两个玩家。如果是,我们开始游戏,否则我们等待其他玩家加入房间。WarpClient.getLiveRoomInfo(roomId);publicvoidonGetLiveRoomInfo(String[]liveUsers){if(liveUsers!=null){if(liveUsers.length==2){startGame();}else{waitForOtherUser();}}else{warpClient.断开();处理错误();启动游戏和玩游戏的代码在MultiplayerGameScreen.java文件中。如果用户进入这个画面,则表示房间内有两个用户,游戏已经开始。一个玩家玩游戏,他也更新其他玩家的状态。其他玩家在您的界面上显示为绿色小怪物。当玩家在界面上移动以完成游戏关卡时,需要绘制其移动轨迹并将位置更新发送给远程玩家。参见WorldRenderer.java(多人游戏)privatevoidrenderBob(){{......if(side<0){batch.draw(keyFrame,world.local_bob.position.x+0.5f,world.local_bob.position。y-0.5f,side*1,1);sendLocation(world.local_bob.position.x+0.5f,world.local_bob.position.y-0.5f,side*1,1);}else{batch.draw(keyFrame,world.local_bob.position.x-0.5f,world.local_bob.position.y-0.5f,side*1,1);sendLocation(world.local_bob.position.x-0.5f,world.local_bob.position.y-0.5f,side*1,1);消息通过我们在这个例子中编写的实用方法发送。WarpClient允许客户端将字节数组广播到它所在的房间。可以使用TCP(默认)或UDP发送。记得我们在连接云服务成功后在第一个界面初始化了UDP。privatevoidsendLocation(floatx,floaty,floatwidth,floaheight){try{JSONObjectdata=newJSONObject();data.put("x",x);data.put("y",y);data.put("宽度",宽度);data.put("高度",高度);WarpController.getInstance().sendGameUpdate(data.toString());}catch(Exceptione){//exceptioninsendLocation}}消息发送到房间是通过提供的onUpdatePeersReceived回调方法。在此回调中,我们解析消息并识别发件人、消息类型和绑定到此消息的数据。我们相应地处理这些消息。publicvoidonUpdatePeersReceived(UpdateEventevent){callBack.onGameUpdateReceived(newString(event.getUpdate()));}尝试{JSONObjectdata=newJSONObject(消息);floatx=(浮动)data.getDouble("x");floaty=(浮动)数据。getDouble("y");floatwidth=(float)data.getDouble("width");floatheight=(float)data.getDouble("高度");renderer.updateEnemyLocation(x,y,width,height);}catch(Exceptione){//exception}#p#游戏结束当游戏结束时,我们只需要更新房间的属性即可。其他玩家收到通知后需要根据此消息更新自己的UI。publicvoidupdateResult(intcode,Stringmsg){if(isConnected){STATE=COMPLETED;HashMapproperties=newHashMap();properties.put("结果",代码);warpClient.lockProperties(属性);}}lockProperties两个远程玩家一起玩时,可能会同时结束游戏,会造成资源竞争。这种情况最好留给服务器处理,所以我们使用lockPropertiesAPI。因此,当游戏结束时,用户向服务器发送一个lockProperties请求以锁定生成的属性。一旦结果被用户锁定,服务器将放弃处理后续对同一属性的lockProperties请求。单击此处了解有关此AppWarp仲裁方法的更多信息。随着游戏的结束,通知其他用户,StartMultiplayerScreen.java根据以下代码在界面上显示游戏结束的原因。publicvoidonGameFinished(intcode){if(code==WarpController.GAME_WIN){this.msg=game_loose;}elseif(code==WarpController.GAME_LOOSE){this.msg=game_win;}elseif(code==WarpController.ENEMY_LEFT){这个.msg=enemy_left;}更新();游戏.setScreen(这个);我们也离开并取消订阅这个房间,并取消听众;如果游戏没有运行,我们也会删除房间。由于我们在这个游戏中使用的是AppWarp动态房间,所以它们会在使用后立即删除(尽管空的动态房间会在60分钟后自动删除)。publicvoidhandleLeave(){if(isConnected){warpClient.unsubscribeRoom(roomId);warpClient.leaveRoom(roomId);if(STATE!=STARTED){warpClient.deleteRoom(roomId);}warpClient.disconnect();}}privatevoiddisconnect(){warpClient.removeConnectionRequestListener(newConnectionListener(this));warpClient.removeChatRequestListener(newChatListener(this));warpClient.removeZoneRequestListener(newZoneListener(this));warpClient.removeRoomRequestListener(newRoomListener(this));warpClient.removeNotificationListener(newNotificationListener(this));warpClient.disconnect();}用户可以点击这里返回MainMenuScreen,我们可以重做这个过程。但是这次我们只需要找到一个房间就可以开始了(因为我们已经连接到服务器了)。总结在本文中,我们了解了如何使用AppWarp开发多人游戏。我们以现有的libgdxhyperjump示例为基础,并使用AppWarpCloud功能对其进行扩展。我们还看到了客户端如何连接到AppWarp并加入游戏室。继承的概念不受libgdx的影响,可以在任何其他Java程序中使用。使用Robovm发布到iOS您可以使用Robovm将SuperJump游戏发布到iOS。以下是您需要在任何其他项目中执行的几个步骤。此外,您需要进行以下更改。1.将这些属性添加到robovm.xmlorg.apache.harmony.xnet.provider.jsse.OpenSSLProviderorg.apache.harmony.security.provider.cert.DRLCertFactorypattern>com.android.org.bouncycastle.jce.provider.BouncyCastleProviderorg.apache.harmony.security.provider.crypto.CryptoProviderorg.apache.harmony.xnet.provider.jsse.JSSEProvidercom.android.org.bouncycastle.jce.provider.JCEMac$SHA12.使用以下代码将屏幕从的背景。Gdx.app.postRunnable(newRunnable(){@Overridepublicvoidrun(){game.setScreen(newMultiplayerGameScreen(game,StartMultiplayerScreen.this));}});这里还有其他要求,我们得到以下错误,因为AppWarp回调不在UI线程中间。线程“MessageDispatchThread”中的异常java.lang.IllegalArgumentException:编译shader3时出错。超跳中的声音是没有的,因为iOS中的声音使用的是RoboVm。英文原文:JavaMultiplayerlibgdx教程翻译链接:http://www.oschina.net/translate/java-multiplayer-libgdx-tutorial

猜你喜欢