《球球大作戰》原始碼解析(8):訊息廣播
系列文章
《球球大作戰》原始碼解析——(1)執行起來
《球球大作戰》原始碼解析:伺服器與客戶端架構
《球球大作戰》原始碼解析:移動演算法
《球球大作戰》原始碼解析(6):碰撞處理
《球球大作戰》原始碼解析(7):遊戲迴圈
《球球大作戰》原始碼解析(8):訊息廣播
服務端程式中有3個定時器函式,前幾篇分別解析了處理玩家移動的moveloop方法、以及處理排行榜、食物生成等遊戲邏輯的gameloop。最後一個定時器函式為sendUpdates,呼叫語句是:setInterval(sendUpdates, 1000 / c.networkUpdateFactor),其中networkUpdateFactor預設值為40,即是每秒執行40次sendUpdates,處理訊息的廣播。sendUpdates會對每個玩家都做操作,具體的結構如下。
- function sendUpdates() {
- users.forEach( function(u) {
- ……
- }
- }
同步食物列表
那麼看看foreach裡面的內容,先獲取對該使用者可見的食物資訊,這裡通過範圍判斷,獲取該使用者視野範圍內的食物,然後組合成visibleFood列表。後面只要把visibleFood的資訊傳送給該使用者就好了,其他看不見的就不管了。
- var visibleFood = food
- .map(function(f) {
- if ( f.x > u.x - u.screenWidth/2 - 20 &&
- f.x < u.x + u.screenWidth/2 + 20 &&
- f.y > u.y - u.screenHeight/2 - 20 &&
- f.y < u.y + u.screenHeight/2 + 20) {
- return f;
- }
- })
- .filter(function(f) { return f; });
同步病毒列表
使用同樣的方法計算可見的病毒,產生同步列表visibleVirus。
- var visibleVirus = virus
- .map(function(f) {
- if ( f.x > u.x - u.screenWidth/2 - f.radius &&
- f.x < u.x + u.screenWidth/2 + f.radius &&
- f.y > u.y - u.screenHeight/2 - f.radius &&
- f.y < u.y + u.screenHeight/2 + f.radius) {
- return f;
- }
- })
- .filter(function(f) { return f; });
同步massFood列表
使用同樣的方法計算可見的massFood,產生同步列表visibleMass。
- var visibleMass = massFood
- .map(function(f) {
- if ( f.x+f.radius > u.x - u.screenWidth/2 - 20 &&
- f.x-f.radius < u.x + u.screenWidth/2 + 20 &&
- f.y+f.radius > u.y - u.screenHeight/2 - 20 &&
- f.y-f.radius < u.y + u.screenHeight/2 + 20) {
- return f;
- }
- })
- .filter(function(f) { return f; });
同步其他玩家
用類似的方法計算玩家可以看到的其他玩家,因為其他玩家可能有多個分身,這裡對每個分身做處理。如果分身在可見範圍內,就把相關的資訊放到visibleCells 列表裡面。列表裡包括玩家自己的資訊和其他玩家的資訊,如果是其他玩家,還要加上他們的名字和id。
- var visibleCells = users
- .map(function(f) {
- for(var z=0; z<f.cells.length; z++)
- {
- if ( f.cells[z].x+f.cells[z].radius > u.x - u.screenWidth/2 - 20 &&
- f.cells[z].x-f.cells[z].radius < u.x + u.screenWidth/2 + 20 &&
- f.cells[z].y+f.cells[z].radius > u.y - u.screenHeight/2 - 20 &&
- f.cells[z].y-f.cells[z].radius < u.y + u.screenHeight/2 + 20) {
- z = f.cells.lenth;
- if(f.id !== U.ID) {
- return {
- id: f.id,
- x: f.x,
- y: f.y,
- cells: f.cells,
- massTotal: Math.round(f.massTotal),
- hue: f.hue,
- name: f.name
- };
- } else {
- //console.log("Nombre: " + f.name + " Es Usuario");
- return {
- x: f.x,
- y: f.y,
- cells: f.cells,
- massTotal: Math.round(f.massTotal),
- hue: f.hue,
- };
- }
- }
- }
- })
- .filter(function(f) { return f; });
傳送資料
最後就是傳送資料了,服務端傳送serverTellPlayerMove協議,並且把可見食物、可見其他玩家部位、可見的mass和病毒發過去。如果排行榜發生了變化,還通過leaderboard協議把排行榜資料傳送出去。客戶端收到協議後,更新畫面。
- sockets[U.ID].emit('serverTellPlayerMove', visibleCells, visibleFood, visibleMass, visibleVirus);
- if (leaderboardChanged) {
- sockets[U.ID].emit('leaderboard', {
- players: users.length,
- leaderboard: leaderboard
- });
- }
- });
- leaderboardChanged = false;
還是放個廣告吧,筆者出版的一本書《Unity3D網路遊戲實戰》充分的講解怎樣開發一款網路遊戲,特別對網路框架設計、網路協議、資料處理等方面都有詳細的描述,相信會是一本好書的。
作者:羅培羽
原地址:https://zhuanlan.zhihu.com/p/29733789
相關文章
- 《球球大作戰》原始碼解析——(9)訊息處理原始碼
- 《球球大作戰》原始碼解析(7):遊戲迴圈原始碼遊戲
- 《球球大作戰》原始碼解析(6):碰撞處理原始碼
- 《球球大作戰》原始碼解析:移動演算法原始碼演算法
- 《球球大作戰》原始碼解析——(1)執行起來原始碼
- 《球球大作戰》原始碼解析:伺服器與客戶端架構原始碼伺服器客戶端架構
- 《球球大作戰》優化之路(上)優化
- 《球球大作戰》優化之路(下)優化
- 尋找伊犁鼠兔,巨人網路《球球大作戰》發起野生動物保護公益行動
- C#廣播訊息收發C#
- RocketMQ系列(五)廣播與延遲訊息MQ
- Laravel 6.x 公共廣播訊息筆記Laravel筆記
- Zookeeper的核心:ZAB原子訊息廣播協議協議
- 【XMPP】Smack原始碼之訊息接收與解析Mac原始碼
- Laravel + 微信小程式 websocket 搭建廣播訊息系統Laravel微信小程式Web
- Laravel 使用 Easywechat 書寫自定義模板訊息丶廣播訊息頻道Laravel
- 買球賽的軟體哪個好 手機線上球賽買球appAPP
- Dubbo原始碼解析之服務端接收訊息原始碼服務端
- Handler訊息處理機制原始碼解析 上原始碼
- 程式設計思路-球連球組成的群程式設計
- [原始碼解析] 深度學習分散式訓練框架 horovod (15) --- 廣播 & 通知原始碼深度學習分散式框架
- Python寫個“點球大戰”小遊戲Python遊戲
- [原始碼解析] 訊息佇列 Kombu 之 基本架構原始碼佇列架構
- js重力球效果程式碼例項JS
- 【開源遊戲】Legends-Of-Heroes 基於ET 7.2的雙端C#(.net7 + Unity3d)多人線上英雄聯盟風格的球球大作戰遊戲。遊戲C#Unity3D
- SpringBoot 實戰 (十六) | 整合 WebSocket 基於 STOMP 協議實現廣播訊息Spring BootWeb協議
- 【科普】Scrum——從橄欖球爭球到敏捷開發Scrum敏捷
- Laravel Broadcast——廣播系統原始碼剖析LaravelAST原始碼
- Flutter 安卓 Platform 與 Dart 端訊息通訊方式 Channel 原始碼解析Flutter安卓PlatformDart原始碼
- 華瑞IT校園籃球賽:熱血少年,球場爭鋒
- 合法買球的app 網上app買球算犯法嗎APP
- Android原始碼解析之一 非同步訊息機制Android原始碼非同步
- 貪吃蛇大作戰JavaFx版完整原始碼Java原始碼
- tkinter飛機大戰測試程式by李興球
- SpringCloud 2020.0.4 系列之 Stream 訊息廣播 與 訊息分組 的實現SpringGCCloud
- 解析原生IP和廣播IP
- 買球賽用什麼APP 正規買球平臺排行APP
- ACM 找球號(一)ACM