日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java多玩家libgdx教程

我們?nèi)绾稳プ?

  • 在 libgdx的主頁修改libgdx樣本“superjumper".

    創(chuàng)新互聯(lián)建站服務(wù)項目包括濉溪網(wǎng)站建設(shè)、濉溪網(wǎng)站制作、濉溪網(wǎng)頁制作以及濉溪網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,濉溪網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到濉溪省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

  • 使用 AppWarp Cloud將它轉(zhuǎn)化為2個玩家的實時游戲.

  • 本游戲?qū)⑵ヅ渫婕也⑶矣脩粜枰竭_城堡來贏得游戲的勝利.

  •  用戶將獲得其他用戶成績的實時反饋以增加了游戲的刺激性。

Eclipse 項目設(shè)置

 接下來,您需要從這個git repository下載libgdx游戲樣本(superjumper) 項目。.

在Eclipse中打開下載的superjumper解決方案。你將看到項目如下:

為了創(chuàng)建多玩家,我使用了 AppWarp Java SDK (1.5 as of now)

關(guān)于libgdx的依賴
 

正如 libgdx的官網(wǎng)上提到的,這個示例依賴于libgbx。如果你試圖運行l(wèi)ibgbx網(wǎng)站上的superjumper示例程序,你會得到關(guān)于gdx,gdx-backend-lwjgl, gdx-jnigen, gdx-openal的錯誤。你需要將這些工程設(shè)置為你的應(yīng)用(superjumper)的依賴庫工程來解決這些錯誤。

但我已經(jīng)將這些庫包含在了superjumper git倉庫中的libs文件夾下。觀看這個視頻或閱讀這個教程來了解更多關(guān)于libgdx工程的安裝設(shè)置。

取得你的AppWarp application keys

如果你要與AppWarp云服務(wù)集成,你需要從ShepHertz開發(fā)者面板AppHq取得你的application keys.這些key能夠在ShepHertz云服務(wù)中識別的你應(yīng)用空間,而且AppWarp云需要用它們隔離不同應(yīng)用間的消息。

在AppWarp網(wǎng)站上按步驟注冊(免費)并取得你的application keys.

現(xiàn)在打開superjumper示例工程中的 WarpController.java 文件并在其中添加這些值。例如:

 
 
  1. public static String AppKey = "14a611b4b3075972be364a7270d9b69a5d2b24898ac483e32d4dc72b2df039ef";
  2. public static String SecretKey = "55216a9a165b08d93f9390435c9be4739888d971a17170591979e5837f618059";

運行多用戶sample
 

既然你已經(jīng)準備好了, 我們可以實際運行并觀察這個游戲了。因為這個游戲有單人或多人游戲的選項,為了玩多人游戲你需要在2個模擬器/設(shè)備上同時運行它。

當你按了multiplayer按扭, 這個游戲會連接AppWarp并加入一個游戲房間。一旦進入這個游戲房間, 這個客戶端在游戲開始前會一直等待第二個玩家加入該房間。

現(xiàn)在你需要在第二個模擬器/設(shè)備上做同樣的操作,AppWarp的匹配API會將第二個玩家連接到相同的游戲房間,然后游戲開始。玩家需要到達城堡來完成這個游戲。同時用戶會發(fā)現(xiàn)他們的對手在實時地運動。這個游戲內(nèi)實時通信正是AppWarp的強大之處。

游戲會在這三個條件下完成

  1. 用戶離開:當一個玩家離開游戲時,另一個玩家被判定為勝利者。因為他的對手已經(jīng)離開的游戲。

  2. 闖關(guān)成功:到達城堡的玩家成為勝利者

  3. 游戲結(jié)束:如果玩家碰到了松鼠或者玩家掉了下來那另一個玩家會成為勝利者。

#p#

怎樣與AppWarp集成
 

開始游戲

首先你需要用你的應(yīng)用密鑰初始化Warpclient單例(WarpController.java).

 
 
  1. WarpClient.initialize(apiKey, secretKey);

接下你需要連接到AppWarp云端并且加入一個游戲房間(WarpController.java)

注意:AppWarp SDK 提供通過異步API提供它的功能。這意味著你只需簡單的將請求監(jiān)聽器添加到WarpClient實例中區(qū)接受響應(yīng)和通知即可。

這個文件 (WarpController.java) 有我們這步所需的所有代碼。它創(chuàng)建連接請求,房間請求,區(qū)域請求(如果有必要創(chuàng)建一個房間)。因此我們添加相關(guān)監(jiān)聽器到OnStart()方法中。

 
 
  1. public WarpController()
  2. {
  3.     initAppwarp();
  4.     warpClient.addConnectionRequestListener(new ConnectionListener(this));
  5.     warpClient.addChatRequestListener(new ChatListener(this));
  6.     warpClient.addZoneRequestListener(new ZoneListener(this));
  7.     warpClient.addRoomRequestListener(new RoomListener(this));
  8.     warpClient.addNotificationListener(new NotificationListener(this));
  9. }
 
 
  1. private void initAppwarp(){
  2.     try {
  3.         WarpClient.initialize(apiKey, secretKey);
  4.         warpClient = WarpClient.getInstance();
  5.     } catch (Exception e) {
  6.         e.printStackTrace();
  7.     }
  8. }

設(shè)置好listener后我們可以繼續(xù)創(chuàng)建連接。用戶需要傳入一個惟一用戶名(username)以連接到AppWarp云。在示例中我只是使用了一個隨機字符串(你也可以從用戶或像facebook的第三方服務(wù)處取得來惟一標識用戶)。隨機字符串是在MainMenuScreen.java文件中生成的。

 
 
  1. WarpClient.connectWithUserName(userName);

連接的結(jié)果會交給以下回調(diào)函數(shù)。

 
 
  1. public void onConnectDone(ConnectEvent e) {
  2.     if(e.getResult()==WarpResponseResultCode.SUCCESS){
  3.         callBack.onConnectDone(true);
  4.     }else{
  5.         callBack.onConnectDone(false);
  6.     }
  7. }
 
 
  1. public void onConnectDone(boolean status){
  2.     if(status){
  3.         warpClient.initUDP();
  4.         warpClient.joinRoomInRange(1, 1, false);
  5.     }else{
  6.         isConnected = false;
  7.         handleError();
  8.     }
  9. }

如果連接成功,我們會試著加入一個房間。我們也可以選擇初始化UDP(稍后的游戲玩家會用到)。為了加入房間,我們使用JoinRoomInRange方法并傳入?yún)?shù)(1,1),它會請求服務(wù)器將客戶端加入只有一個用戶的房間。如果失敗我們會新建并加入一個容納兩個玩家的房間。

 
 
  1. public void onJoinRoomDone(RoomEvent event){
  2.     if(event.getResult()==WarpResponseResultCode.SUCCESS){// success case
  3.         this.roomId = event.getData().getId();
  4.         warpClient.subscribeRoom(roomId);
  5.     }else if(event.getResult()==WarpResponseResultCode.RESOURCE_NOT_FOUND){// no such room found
  6.         HashMap data = new HashMap();
  7.         data.put("result", "");
  8.         warpClient.createRoom("superjumper", "shephertz", 2, data);
  9.     }else{
  10.         warpClient.disconnect();
  11.         handleError();
  12.     }
  13. }

一旦加入某個房間(不管是現(xiàn)在還是創(chuàng)建新房間之后),客戶端需要訂閱這個房間來接收房間的通知(這在游戲中是必須的)。這里詳細解釋了這些概念。訂閱之后我們要調(diào)用getLiveRoomInfo來檢查房間是否有兩個玩家了,如果是我們就開始游戲,否則就等待其他玩家加入這個房間。

 
 
  1. WarpClient.getLiveRoomInfo(roomId);
 
 
  1. public void onGetLiveRoomInfo(String[] liveUsers){
  2.     if(liveUsers!=null){
  3.         if(liveUsers.length==2){
  4.             startGame();    
  5.         }else{
  6.             waitForOtherUser();
  7.         }
  8.         }else{
  9.             warpClient.disconnect();
  10.             handleError();
  11.     }
  12. }

開始游戲

進行游戲的代碼在MultiplayerGameScreen.java文件中。如果用戶進入了這個界面,那就意味著有兩個用戶在這個房間中且游戲開始了。玩家玩這個游戲,并且他也要更新其他玩家的狀態(tài)。其他玩家在你的界面上顯示成綠色小怪物。

隨著玩家在界面上移動以完成游戲關(guān)卡,需要繪制它的移動軌跡,也要將位置更新發(fā)送給遠程玩家。參見WorldRenderer.java(multiplayer)

 
 
  1. private void renderBob () {
  2. {
  3. ...
  4. ...
  5.     if (side < 0){
  6.         batch.draw(keyFrame, world.local_bob.position.x + 0.5f, world.local_bob.position.y - 0.5f, side * 1, 1);
  7.         sendLocation(world.local_bob.position.x + 0.5f, world.local_bob.position.y - 0.5f, side * 1, 1);
  8.     }else{
  9.         batch.draw(keyFrame, world.local_bob.position.x - 0.5f, world.local_bob.position.y - 0.5f, side * 1, 1);
  10.         sendLocation(world.local_bob.position.x - 0.5f, world.local_bob.position.y - 0.5f, side * 1, 1);
  11.     }
  12. }

消息通過我們在這個示例中所寫的工具方法來發(fā)送。WarpClient允許客戶端將字節(jié)數(shù)組廣播給它所在的房間。可以使用TCP(默認)或UDP來發(fā)送。記住我們已經(jīng)在成功連接到云服務(wù)后的***個界面中初始化了UDP。

 
 
  1. private void sendLocation(float x, float y, float width, float height){
  2.   try {
  3.     JSONObject data = new JSONObject();
  4.     data.put("x", x);
  5.     data.put("y", y);
  6.     data.put("width", width);
  7.     data.put("height", height);
  8.     WarpController.getInstance().sendGameUpdate(data.toString());
  9.     } catch (Exception e) {
  10.         // exception in sendLocation
  11.     }
  12.   }

發(fā)送給房間的消息是通過onUpdatePeersReceived的回調(diào)方法提供的。在這個回調(diào)中我們要解析這個消息并識別發(fā)送者,消息類型和與此消息綁定的數(shù)據(jù)。我們根據(jù)這些消息做相應(yīng)的處理。

 
 
  1. public void onUpdatePeersReceived(UpdateEvent event) {
  2.     callBack.onGameUpdateReceived(new String(event.getUpdate()));
  3. }
 
 
  1. try {
  2.     JSONObject data = new JSONObject(message);
  3.     float x = (float)data.getDouble("x");
  4.     float y = (float)data.getDouble("y");
  5.     float width = (float)data.getDouble("width");
  6.     float height = (float)data.getDouble("height");
  7.     renderer.updateEnemyLocation(x, y, width, height);
  8. } catch (Exception e) {
  9.     // exception 
  10. }

#p#

游戲結(jié)束

當游戲結(jié)束后我們只需要更新房間的屬性。其他玩家收到通知后需要根據(jù)此消息更新他們的UI。

 
 
  1. public void updateResult(int code, String msg){
  2.     if(isConnected){
  3.         STATE = COMPLETED;
  4.         HashMap properties = new HashMap();
  5.         properties.put("result", code);
  6.         warpClient.lockProperties(properties);
  7.     }
  8. }

lockProperties

當兩個遠程玩家同玩游戲時,他們有可能會同時結(jié)束游戲,而這會引起資源競爭。這種情況***交由服務(wù)器解決,所以我們使用了lockProperties API。所以當游戲結(jié)束時用戶向服務(wù)器發(fā)送一個lockProperties請求將結(jié)果屬性鎖定。一旦這個結(jié)果被某個用戶鎖定,服務(wù)器會放棄處理后續(xù)對同一個屬性的lockProperties請求。點擊此處以了解更多此AppWarp仲裁方式。

隨著游戲的結(jié)束,其他用戶得到通知,StartMultiplayerScreen.java根據(jù)以下代碼將游戲結(jié)束的原因顯示到界面上。

 
 
  1. public void onGameFinished (int code) {
  2.     if(code==WarpController.GAME_WIN){
  3.         this.msg = game_loose;
  4.     }else if(code==WarpController.GAME_LOOSE){
  5.         this.msg = game_win;
  6.     }else if(code==WarpController.ENEMY_LEFT){
  7.         this.msg = enemy_left;
  8.     }
  9.     update();
  10.     game.setScreen(this);
  11. }

我們也要離開并取消訂閱此房間,并且取消監(jiān)聽器;如果游戲不在運行狀態(tài)我們也要刪除房間。由于在這個游戲中我們使用的是AppWarp 動態(tài)房間,在使用完后***立即刪除(盡管空動態(tài)房間在60分鐘后都會被自動刪除)。

 
 
  1. public void handleLeave(){
  2.     if(isConnected){
  3.         warpClient.unsubscribeRoom(roomId);
  4.         warpClient.leaveRoom(roomId);
  5.         if(STATE!=STARTED){
  6.             warpClient.deleteRoom(roomId);
  7.         }
  8.         warpClient.disconnect();
  9.     }
  10. }
 
 
  1. private void disconnect(){
  2.     warpClient.removeConnectionRequestListener(new ConnectionListener(this));
  3.     warpClient.removeChatRequestListener(new ChatListener(this));
  4.     warpClient.removeZoneRequestListener(new ZoneListener(this));
  5.     warpClient.removeRoomRequestListener(new RoomListener(this));
  6.     warpClient.removeNotificationListener(new NotificationListener(this));
  7.     warpClient.disconnect();
  8. }

用戶可以在這里點擊并返回MainMenuScreen,然后我們可以重新進行這個過程。但這次我們只需要找到一個房間就可以開始了(因為我們已經(jīng)連接到了服務(wù)器)。

總結(jié)

這篇文章中我們看到如何用AppWarp開發(fā)多人游戲。 我們在一個現(xiàn)成的libgdx超級跳躍例子基礎(chǔ)上用 AppWarp Cloud 特性進行拓展。我們同樣看到客戶端怎樣連接到AppWarp上,怎樣加入游戲房間。繼承概念不受libgdx的影響,并且可以應(yīng)有與其他任何Java程序中。

使用Robovm發(fā)布到iOS

你可以使用 Robovm 來將超級跳躍游戲發(fā)布到iOS上. 下面是幾步是任何其它項目中都需要做的。另外你需要做如下改變。

1. 將這些屬性添加到 robovm.xml

 
 
  1.   org.apache.harmony.xnet.provider.jsse.OpenSSLProvider
  2.   org.apache.harmony.security.provider.cert.DRLCertFactory
  3.   com.android.org.bouncycastle.jce.provider.BouncyCastleProvider
  4.   org.apache.harmony.security.provider.crypto.CryptoProvider
  5.   org.apache.harmony.xnet.provider.jsse.JSSEProvider
  6.   com.android.org.bouncycastle.jce.provider.JCEMac$SHA1

2. 使用如下代碼從背景中改變屏幕。

 
 
  1. Gdx.app.postRunnable(new Runnable() {
  2.   @Override
  3.   public void run () {
  4.       game.setScreen(new MultiplayerGameScreen(game, StartMultiplayerScreen.this));
  5.   }
  6. });

這里另有要求, 我們得到如下錯誤,因為AppWarp的回調(diào)不在UI線程中。

    Exception in thread "MessageDispatchThread" java.lang.IllegalArgumentException:     Error compiling shader

3. 超級跳躍中聲音不可用了,這是因為iOS中的聲音是使用RoboVm。

英文原文: Java Multiplayer libgdx Tutorial

譯文鏈接:http://www.oschina.net/translate/java-multiplayer-libgdx-tutorial


分享題目:Java多玩家libgdx教程
標題路徑:http://www.dlmjj.cn/article/djopjop.html