天天看點

Java 多玩家 libgdx 教程 【已翻譯100%】

Java 多玩家 libgdx 教程 【已翻譯100%】

我們如何去做?

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

使用 appwarp cloud将它轉化為2個玩家的實時遊戲.

本遊戲将比對玩家并且使用者需要到達城堡來赢得遊戲的勝利.

使用者将獲得其他使用者成績的實時回報以增加了遊戲的刺激性。

eclipse 項目設定

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

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

Java 多玩家 libgdx 教程 【已翻譯100%】

為了建立多玩家,我使用了 appwarp java sdk (1.5 as of now)

關于libgdx的依賴

正如 libgdx的官網上提到的,這個示例依賴于libgbx。如果你試圖運作libgbx網站上的superjumper示例程式,你會得到關于gdx,gdx-backend-lwjgl, gdx-jnigen, gdx-openal的錯誤。你需要将這些工程設定為你的應用(superjumper)的依賴庫工程來解決這些錯誤。

但我已經将這些庫包含在了superjumper git倉庫中的libs檔案夾下。觀看這個視訊或閱讀這個教程來了解更多關于libgdx工程的安裝設定。

取得你的appwarp application keys

如果你要與appwarp雲服務內建,你需要從shephertz開發者面闆apphq取得你的application keys.這些key能夠在shephertz雲服務中識别的你應用空間,而且appwarp雲需要用它們隔離不同應用間的消息。

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

現在打開superjumper示例工程中的 warpcontroller.java 檔案并在其中添加這些值。例如:

運作多使用者sample

既然你已經準備好了, 我們可以實際運作并觀察這個遊戲了。因為這個遊戲有單人或多人遊戲的選項,為了玩多人遊戲你需要在2個模拟器/裝置上同時運作它。

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

Java 多玩家 libgdx 教程 【已翻譯100%】

現在你需要在第二個模拟器/裝置上做同樣的操作,appwarp的比對api會将第二個玩家連接配接到相同的遊戲房間,然後遊戲開始。玩家需要到達城堡來完成這個遊戲。同時使用者會發現他們的對手在實時地運動。這個遊戲内實時通信正是appwarp的強大之處。

Java 多玩家 libgdx 教程 【已翻譯100%】

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

使用者離開:當一個玩家離開遊戲時,另一個玩家被判定為勝利者。因為他的對手已經離開的遊戲。

闖關成功:到達城堡的玩家成為勝利者

遊戲結束:如果玩家碰到了松鼠或者玩家掉了下來那另一個玩家會成為勝利者。

Java 多玩家 libgdx 教程 【已翻譯100%】

怎樣與appwarp內建

開始遊戲

首先你需要用你的應用密鑰初始化warpclient單例(warpcontroller.java).

warpclient.initialize(apikey, secretkey);

接下你需要連接配接到appwarp雲端并且加入一個遊戲房間(warpcontroller.java)

注意: appwarp sdk 提供通過異步api提供它的功能。這意味着你隻需簡單的将請求監聽器添加到warpclient執行個體中區接受響應和通知即可。

這個檔案 (warpcontroller.java) 有我們這步所需的所有代碼。它建立連接配接請求,房間請求,區域請求(如果有必要建立一個房間)。是以我們添加相關監聽器到onstart()方法中。

設定好listener後我們可以繼續建立連接配接。使用者需要傳入一個惟一使用者名(username)以連接配接到appwarp雲。在示例中我隻是使用了一個随機字元串(你也可以從使用者或像facebook的第三方服務處取得來惟一辨別使用者)。随機字元串是在mainmenuscreen.java檔案中生成的。

連接配接的結果會交給以下回調函數。

如果連接配接成功,我們會試着加入一個房間。我們也可以選擇初始化udp(稍後的遊戲玩家會用到)。為了加入房間,我們使用joinroominrange方法并傳入參數(1,1),它會請求伺服器将用戶端加入隻有一個使用者的房間。如果失敗我們會建立并加入一個容納兩個玩家的房間。

一旦加入某個房間(不管是現在還是建立新房間之後),用戶端需要訂閱這個房間來接收房間的通知(這在遊戲中是必須的)。這裡詳細解釋了這些概念。訂閱之後我們要調用getliveroominfo來檢查房間是否有兩個玩家了,如果是我們就開始遊戲,否則就等待其他玩家加入這個房間。

進行遊戲的代碼在multiplayergamescreen.java檔案中。如果使用者進入了這個界面,那就意味着有兩個使用者在這個房間中且遊戲開始了。玩家玩這個遊戲,并且他也要更新其他玩家的狀态。其他玩家在你的界面上顯示成綠色小怪物。

随着玩家在界面上移動以完成遊戲關卡,需要繪制它的移動軌迹,也要将位置更新發送給遠端玩家。參見worldrenderer.java(multiplayer)

消息通過我們在這個示例中所寫的工具方法來發送。warpclient允許用戶端将位元組數組廣播給它所在的房間。可以使用tcp(預設)或udp來發送。記住我們已經在成功連接配接到雲服務後的第一個界面中初始化了udp。

發送給房間的消息是通過onupdatepeersreceived的回調方法提供的。在這個回調中我們要解析這個消息并識别發送者,消息類型和與此消息綁定的資料。我們根據這些消息做相應的處理。

遊戲結束

當遊戲結束後我們隻需要更新房間的屬性。其他玩家收到通知後需要根據此消息更新他們的ui。

當兩個遠端玩家同玩遊戲時,他們有可能會同時結束遊戲,而這會引起資源競争。這種情況最好交由伺服器解決,是以我們使用了lockproperties api。是以當遊戲結束時使用者向伺服器發送一個lockproperties請求将結果屬性鎖定。一旦這個結果被某個使用者鎖定,伺服器會放棄處理後續對同一個屬性的lockproperties請求。點選此處以了解更多此appwarp仲裁方式。

随着遊戲的結束,其他使用者得到通知,startmultiplayerscreen.java根據以下代碼将遊戲結束的原因顯示到界面上。

我們也要離開并取消訂閱此房間,并且取消監聽器;如果遊戲不在運作狀态我們也要删除房間。由于在這個遊戲中我們使用的是appwarp 動态房間,在使用完後最好立即删除(盡管空動态房間在60分鐘後都會被自動删除)。

使用者可以在這裡點選并傳回mainmenuscreen,然後我們可以重新進行這個過程。但這次我們隻需要找到一個房間就可以開始了(因為我們已經連接配接到了伺服器)。

總結

這篇文章中我們看到如何用appwarp開發多人遊戲。 我們在一個現成的libgdx超級跳躍例子基礎上用 appwarp cloud 特性進行拓展。我們同樣看到用戶端怎樣連接配接到appwarp上,怎樣加入遊戲房間。繼承概念不受libgdx的影響,并且可以應有與其他任何java程式中。

使用robovm釋出到ios

你可以使用 robovm 來将超級跳躍遊戲釋出到ios上. 下面是幾步是任何其它項目中都需要做的。另外你需要做如下改變。

将這些屬性添加到 robovm.xml

使用如下代碼從背景中改變螢幕。

這裡另有要求, 我們得到如下錯誤,因為appwarp的回調不在ui線程中。

超級跳躍中聲音不可用了,這是因為ios中的聲音是使用robovm。

繼續閱讀