摘要:游戲主要功能用用戶數據報協議實現穩定的多人聯機飛行器隕石小游戲。除了飛船和飛船相撞不會損毀,其余組合都會有一方被損毀。多人聯網游戲,活到最后的飛船得一分。過程并沒有任何新的飛船被創建。
計量經濟本科在讀,斷斷續續學編程一段時間了,還是個編程小白,一直沒有什么連續的輸出,不能完全解決問題,很有挫敗感。立個flag,希望寫出來的東西通熟易懂,每天進步一點點。如有錯誤,請多多指正。
開始之前,需要大家大致知道IP Address(IP 地址), ports(通信端口), sockets的概念。打一個比喻,你要去一棟大樓里面辦護照,然后你通過IP地址找到了它,然后辦護照的辦公室在201(port 想象成一個電腦上實現某個功能的application),你去到那個辦公室以后遞交了申請護照所需的材料,然后領導了護照的過程(socket 溝通的過程)。IP地址被用來給Internet上的電腦一個編號。通常每臺聯網的PC上都需要有IP地址,才能正常通信。一個進程通過internet socket,將它的輸入與輸出,與一個特定的傳輸協議,一個通信端口,與IP地址,關系起來。這個關系動作,稱為綁定(binding),在這之后,就可以通過網絡提交與接收數據(這里我們用的是接收發送datagram packtes)。
游戲主要功能用UDP(User Datagram Protocol)用戶數據報協議實現穩定的多人聯機飛行器隕石小游戲。
主要功能菜單:
-單機玩小游戲
-能夠Host聯機多人游戲,同步更新
-能夠旁觀(Spectator)多人游戲
-能夠臨時加入游戲,或者離開游戲
-Score board.
游戲規則:子彈,飛船,隕石三件套。除了飛船和飛船相撞不會損毀,其余組合都會有一方被損毀。多人聯網游戲,活到最后的飛船得一分。單人游戲按摧毀隕石數目得分。
每一個用戶有一個用戶名,不同用戶飛船顏色不同
High score persistence. 得分存到數據庫,然后Score board會從高倒低排序。
主要涉及的知識點有networking between the server and the client 和multi-threads.
程序結構設計main package asteroids有3個packages(net, gui, userTypes, model)和一個main class.
net package有五個class,主要用于networking。
-server 包含了三個class: ClientAccepter, ShipReceiver, ModelSender分別用來接收注冊用戶,Host接收飛船, Host傳送整個Game Model給clients。
-client 包含了兩個class:ShipSender, ModelReceiver
gui package 包含了三個class (AsteroidsPanel, Asteroids Frame, Player), 主要用來畫游戲框架,飛船,隕石一類的游戲物件,這些物件會根據玩家按鍵來操作。
userTypes 有一個abstract super-class 叫做User,User有四個sub-class 分別是玩家種類(SinglePlayer, Joiner, Spectator, Host),也用到了gui package的player class。
設計模式MVC: 用來分開GameModel, View(AsteroidsFrame, AsteroidsPanel)和Controller(Player)
Factory Pattern: 用在構造Asteroids, Spaceship和Bullets物件。都是super-class GameObject的subclass。這樣做的好處在于我們的client在創建對象時,并不需要知道具體要創建對象的哪個class。
Observer pattern: 因為存在對象間的one-to-many relationships。所以一個對象狀態改變,我們想要其它與之關聯的對象也自動變化。在這里,Player是我們的Subject class,User是我們的Observer class (包含了Joiner, Host, Spectator和SinglePlayer).
其它Patterns: 有些pattern并沒有完全用到。很多已經被封裝在server的實現里。比如說Transfer Object pattern 和 Command pattern。
Database (Score.java)用了ObjectDB。也用到Factory Pattern的概念(EntityManagerFactory)。
網絡設計如果一個client想要參與游戲,他需要輸入自己的用戶名和Host的IP地址。接著,用戶名,IP地址,client port number還有client的種類(也就是User 的種類)被Host Game的ClientAccepter接收,如果client是Joiner,緊接著一艘有著那個用戶名的飛船就被創建了。Host的ModelSender就知道具體哪個IP地址需要被Broadcast整個Host的Game Model。
這里ModelSender, ModelReceiver共用一個port(想象成一個傳輸游戲組建的application);ShipSender, ShipReceiver共用一個port; ClientAccepter用一個port (ClientRegister被包含在了Joiner class里)。
如果client是joiner,他會接收Host傳輸來的GameModel,然后他會通過ShipSender把用戶按鍵信息傳送回Host。Host會通過ShipReceiver接收,然后計算期中的邏輯關系,更新作圖(畫新的飛船然后根據用戶傳輸過來的按鍵信息讓飛船移動)。client并不參與任何涉及游戲邏輯(運動)的計算,只有HostGame class會進行所有的計算。
如果client是Spectator, 他就只會從Host的Modelsender接收到信息(ModelReceiever)。過程并沒有任何新的飛船被創建。
需要指出ClientRegister 和 ClientAccpeter的過程只在加入游戲前創立連接。但其它過程如發送、接收游戲model, 即飛船相關創建、運動(按鍵更新運動)的信息會通過網絡不斷傳輸、接收和更新。
代碼有人閱讀的話,我就貼上代碼,繼續更。
游戲組件 畫框架和飛船 網絡實現 單機 主機 聯機 觀看 數據庫連接文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72248.html
摘要:謝耳朵愛玩的游戲,石頭剪子布的升級版。擁有最高點數的玩家獲勝,其點數必須等于或低于點。在編寫這個游戲的過程中第一次引入了類概念。宇宙空間中微小的摩擦力和隕石撞擊后受到的力,都要考慮并且編入游戲中。 人人都應該學編程嗎?隨著每個人的工作與電腦連結愈發緊密,也許這是真的。 我是游戲設計師,在分工細致的國內網游業界,不需要研發或美術背景也能擔當游戲設計重任的角色多了起來。有時候他們甚至只需...
摘要:流行的編程語言是一項用于開發應用程序的技術,可以讓變得更有意思和更實用。年月,由于甲骨文對于社區的不友善,因此揚言將退出。在運行時,平臺中的解釋器對這些字節碼進行解釋執行,執行過程中需要的類在聯接階段被載入到運行環境中。 流行的編程語言Java Java 是一項用于開發應用程序的技術,可以讓 Web 變得更有意思和更實用。 Java 與 javascript 并不相同,后者是一種用于創...
摘要:概述本系列文章將從開發者角度梳理開發實時聯網游戲后臺服務過程中可能面臨的挑戰,并針對性地提供相應解決思路,期望幫助開發者依據自身游戲特點做出合理的技術選型。多路復用避免了讀寫阻塞,減少了上下文切換,提升了利用率和系統吞吐率。 概述:本系列文章將從開發者角度梳理開發實時聯網游戲后臺服務過程中可能面臨的挑戰,并針對性地提供相應解決思路,期望幫助開發者依據自身游戲特點做出合理的技術選型。 關...
摘要:和標志,用于表示飛船是否正在移動,用于實現飛船在不松開按鍵下連續移動。重寫了函數,用于繪制飛船模塊該模塊主要是集中處理游戲中發生的各種事件。函數用于監聽游戲的事件,比如,它表示游戲推出事件和分別表示鍵盤按下與松開事件。 《Python編程:從入門到實踐》筆記。本章主要學習如何使用pygame編寫一個簡單的小飛機打外星人的游戲,由于本人對用python寫游戲并不是特別感興趣,所以主要是看...
摘要:現在開始創建多行外星人。小結本篇講述了如何在游戲中添加大量相同的元素如何用嵌套循環來創建元素網格如何控制對象在屏幕上移動的方向以及響應事件如何檢測和響應元素碰撞如何在游戲中跟蹤統計信息如何使用標志來判斷游戲是否結束。 《Python編程:從入門到實踐》筆記。本章主要是對上一篇的繼續,添加外星人,外星人與飛船的交互。 1. 回顧項目 開發較大的項目時,進入每個開發階段前回顧一下開發計劃,...
閱讀 1123·2021-11-08 13:13
閱讀 1707·2019-08-30 15:55
閱讀 2762·2019-08-29 11:26
閱讀 2426·2019-08-26 13:56
閱讀 2549·2019-08-26 12:15
閱讀 2125·2019-08-26 11:41
閱讀 1394·2019-08-26 11:00
閱讀 1530·2019-08-23 18:30