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