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