1. 程式人生 > >如何構建一個多人(.io) Web 遊戲,第 1 部分

如何構建一個多人(.io) Web 遊戲,第 1 部分

![](https://img2020.cnblogs.com/blog/436453/202101/436453-20210118101515985-43576177.png) 原文:[How to Build a Multiplayer (.io) Web Game, Part 1]( https://victorzhou.com/blog/build-an-io-game-part-1) GitHub: https://github.com/vzhou842/example-.io-game 深入探索一個 `.io` 遊戲的 Javascript client-side(客戶端)。 如果您以前從未聽說過 `.io` 遊戲:它們是免費的多人 web 遊戲,易於加入(無需帳戶), 並且通常在一個區域內讓許多玩家相互競爭。其他著名的 `.io` 遊戲包括 `Slither.io` 和 `Diep.io`。 * Slither.io:[http://slither.io](http://slither.io) * Diep.io:[https://diep.io](https://diep.io) 在本文中,我們將**瞭解如何從頭開始構建.io遊戲**。 您所需要的只是 Javascript 的實用知識: 您應該熟悉 `ES6` 語法,`this` 關鍵字和 `Promises`之類的內容。 即使您對 Javascript 並不是最熟悉的,您仍然應該可以閱讀本文的大部分內容。 ## 一個 `.io` 遊戲示例 為了幫助我們學習,我們將參考 https://example-io-game.victorzhou.com。 ![](https://img2020.cnblogs.com/blog/436453/202101/436453-20210118101537510-1873511507.png) 這是一款非常簡單的遊戲:你和其他玩家一起控制競技場中的一艘船。 你的飛船會自動發射子彈,你會試圖用自己的子彈擊中其他玩家,同時避開他們。 ## 目錄 這是由兩部分組成的系列文章的第 1 部分。我們將在這篇文章中介紹以下內容: 1. 專案概況/結構:專案的高階檢視。 2. 構建/專案設定:開發工具、配置和設定。 3. Client 入口:index.html 和 index.js。 4. Client 網路通訊:與伺服器通訊。 5. Client 渲染:下載 image 資源 + 渲染遊戲。 6. Client 輸入:讓使用者真正玩遊戲。 7. Client 狀態:處理來自伺服器的遊戲更新。 ## 1. 專案概況/結構 我建議下載示例遊戲的原始碼,以便您可以更好的繼續閱讀。 我們的示例遊戲使用了: * Express,Node.js 最受歡迎的 Web 框架,以為其 Web 伺服器提供動力。 * socket.io,一個 websocket 庫,用於在瀏覽器和伺服器之間進行通訊。 * Webpack,一個模組打包器。 專案目錄的結構如下所示: ``` public/ assets/ ... src/ client/ css/ ... html/ index.html index.js ... server/ server.js ... shared/ constants.js ``` `public/` 我們的伺服器將靜態服務 `public/` 資料夾中的所有內容。 `public/assets/` 包含我們專案使用的圖片資源。 `src/` 所有原始碼都在 `src/` 資料夾中。 `client/` 和 `server/` 很容易說明,`shared/` 包含一個由 client 和 server 匯入的常量檔案。 ## 2. 構建/專案設定 如前所述,我們正在使用 Webpack 模組打包器來構建我們的專案。讓我們看一下我們的 Webpack 配置: webpack.common.js ```js const path = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports = { entry: { game: './src/client/index.js', }, output: { filename: '[name].[contenthash].js', path: path.resolve(__dirname, 'dist'), }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: "babel-loader", options: { presets: ['@babel/preset-env'], }, }, }, { test: /\.css$/, use: [ { loader: MiniCssExtractPlugin.loader, }, 'css-loader', ], }, ], }, plugins: [ new MiniCssExtractPlugin({ filename: '[name].[contenthash].css', }), new HtmlWebpackPlugin({ filename: 'index.html', template: 'src/client/html/index.html', }), ], }; ``` * `src/client/index.js` 是 Javascript (JS) 客戶端入口點。Webpack 將從那裡開始,遞迴地查詢其他匯入的檔案。 * 我們的 Webpack 構建的 JS 輸出將放置在 `dist/` 目錄中。我將此檔案稱為 JS bundle。 * 我們正在使用 Babel,特別是 `@babel/preset-env` 配置,來為舊瀏覽器編譯 JS 程式碼。 * 我們正在使用一個外掛來提取 JS 檔案引用的所有 CSS 並將其捆綁在一起。我將其稱為 CSS bundle。 您可能已經注意到奇怪的 `'[name].[contenthash].ext'` 捆綁檔名。 它們包括 Webpack 檔名替換:`[name]` 將替換為入口點名稱(這是`game`),[contenthash]將替換為檔案內容的雜湊。 我們這樣做是為了優化快取 - 我們可以告訴瀏覽器永遠快取我們的 JS bundle,因為如果 JS bundle 更改,其檔名也將更改(`contenthash` 也會更改)。最終結果是一個檔名,例如:`game.dbeee76e91a97d0c7207.js`。 `webpack.common.js` 檔案是我們在開發和生產配置中匯入的基本配置檔案。例如,下面是開發配置: webpack.dev.js ```js const merge = require('webpack-merge'); const common = require('./webpack.common.js'); module.exports = merge(common, { mode: 'development', }); ``` 我們在開發過程中使用 `webpack.dev.js` 來提高效率,並在部署到生產環境時切換到 `webpack.prod.js` 來優化包的大小。 ### 本地設定 我建議在您的本地計算機上安裝該專案,以便您可以按照本文的其餘內容進行操作。 設定很簡單:首先,確保已安裝 `Node` 和 `NPM`。 然後, ```sh $ git clone https://github.com/vzhou842/example-.io-game.git $ cd example-.io-game $ npm install ``` 您就可以出發了! 要執行開發伺服器,只需 ```sh $ npm run develop ``` 並在網路瀏覽器中訪問 `localhost:3000`。 當您編輯程式碼時,開發伺服器將自動重建 JS 和 CSS bundles - 只需重新整理即可檢視更改! ## 3. Client 入口 讓我們來看看實際的遊戲程式碼。首先,我們需要一個 `index.html` 頁面, 這是您的瀏覽器訪問網站時首先載入的內容。我們的將非常簡單: index.html ```html An example .io game ``` 我們有: * 我們將使用 HTML5 Canvas(``)元素來渲染遊戲。 * `` 包含我們的 CSS bundle。 * `

相關推薦

如何構建一個(.io) Web 遊戲 1 部分

![](https://img2020.cnblogs.com/blog/436453/202101/436453-20210118101515985-43576177.png) 原文:[How to Build a Multiplayer (.io) Web Game, Part 1]( https://

如何構建一個(.io) Web 遊戲 2 部分

![](https://img2020.cnblogs.com/blog/436453/202101/436453-20210119131353846-3275826.png) 原文:[How to Build a Multiplayer (.io) Web Game, Part 2](https://vi

Java Web 高效能開發 1 部分: 前端的高效能

原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-javawebhiperf1/ 引言 前端的高效能部分,主要是指減少請求數、減少傳輸的資料以及提高使用者體驗,在這個部分,圖片的優化顯得至關重要。許多網站的美化,都是靠絢麗的圖片達到的,圖

【轉】虛擬機遷移技術漫談 1 部分

遷移方法 電力 list ews IT 全面 dev 處理器 自動化工具 如何在虛擬機和物理機以及虛擬機和虛擬機之間的遷移系統 郭 晉兵 和 吳 超鳳2010 年 9 月 09 日發布

IBM p 系列管理員認證(Test 191)指南系列 1 部分

本文將介紹啟動過程,以及您可能在系統初始化階段碰到的一些常見問題。本文還介紹用於處理與啟動過程相關聯的基本要素的一些常見命令。本文是摘自 IBM 紅皮書《IBM Certification Study Guide - pSeries AIX System Adm

探索推薦引擎內部的祕密 1 部分: 推薦引擎初探

簡介: 隨著 Web 技術的發展,使得內容的建立和分享變得越來越容易。每天都有大量的圖片、部落格、視訊釋出到網上。資訊的極度爆炸使得人們找到他們需要的資訊將變得越來越難。傳統的搜尋技術是一個相對簡單的幫助人們找到資訊的工具,也廣泛的被人們所使用,但搜尋引擎並不能完全滿足使用者對資訊發現的

SAS Programming for R Users, Part 1 針對R使用者的SAS程式設計1部分 Lynda課程中文字幕

SAS Programming for R Users, Part 1 中文字幕 針對R使用者的SAS程式設計,第1部分 中文字幕SAS Programming for R Users, Part 1 SAS是擁有數百萬使用者的非常受歡迎的資料分析平臺 R是大資料的語言 在本課程中

Advanced SAS Programming for R Users, Part 1 針對R使用者的高階SAS程式設計1部分 Lynda課程中文字幕

Advanced SAS Programming for R Users, Part 1 中文字幕 針對R使用者的高階SAS程式設計,第1部分 中文字幕Advanced SAS Programming for R Users, Part 1 SAS是世界上使用最廣泛的資料分析平臺之

精通 Eclipse V3.4 1 部分: Eclipse 工作臺

第 1 部分適用於 Eclipse 的新使用者,將向 Eclipse 新手解釋一些通常很難理解的 Eclipse 術語,並介紹 Eclipse IDE 的各個部分。本文將說明 Eclipse 工作臺是什麼;並探究專案與工作空間(Eclipse 組織原始碼的方法)之間的差別及其之間的關係。最後,本文將

遷移 Linux 系統 1 部分 如何遷移備份和裸機恢復 Linux 系統

當硬體升級,更換儲存裝置或是遇到硬體故障時,需要遷移原來的作業系統及應用軟體到新的硬體裝置上。這個過程包含系統的遷移備份和裸機恢復,本文詳細描述了整個過程的細節。 災 難恢復 , 指自然或人為災害後,重新啟用資訊系統的資料、硬體及軟體裝置,恢復正常商業運作的過程。災難恢復是

Cassandra 分散式資料庫詳解 1 部分:配置、啟動與叢集

瞭解一個軟體的配置項的意義是使用這個軟體的前提,這裡詳細介紹 Cassandra 的配置檔案(storage-config.xml)中各個配置項的意義,這其中包含有很多配置引數,我們可以對其進行調整以達到理想的效能。為了節省篇幅這裡沒有列出 storage-config.xml 檔案的內容,你可以對照著這

整合 MDM Server 與企業資訊系統(使用 SAP 作為示例) 1 部分: 向 SAP 提供客戶記錄

您將學到的知識 IBM InfoSphere Master Data Management Server 是一種儲存庫,它能集中和管理一個組織中至關重要的主資料實體,例如客戶、產品、供應商等。這些實體的集中能打造單一的客戶和產品檢視,從而改善服務、提高客戶滿意度,加強與合作

探索 Pexpect 1 部分:剖析 Pexpect

概述 Pexpect 是 Don Libes 的 Expect 語言的一個 Python 實現,是一個用來啟動子程式,並使用正則表示式對程式輸出做出特定響應,以此實現與其自動互動的 Python 模組。 Pexpect 的使用範圍很廣,可以用來實現與 ssh、ftp 、te

Tomcat 系統架構與設計模式 1 部分: 工作原理

本文以 Tomcat 5 為基礎,也兼顧最新的 Tomcat 6 和 Tomcat 4。Tomcat 的基本設計思路和架構是具有一定連續性的。 Tomcat 的結構很複雜,但是 Tomcat 也非常的模組化,找到了 Tomcat 最核心的模組,您就抓住了 Tomcat 的“七寸”。下面是 Tomcat 的

Java 執行時監控 1 部分: Java 系統執行時效能和可用性監控

簡介 當今的許多 Java 應用程式都依賴於一組複雜的分散式依賴關係和移動部件。很多外部因素都可能對應用程式的效能和可用性造成影響。這些影響基本上都無法完全消除或解決,且難以在預生成環境中準確模擬。Stuff happens。但是,您可以建立並維護一個全面的系統來監控應用程式的整個生態系

使用 ftrace 除錯 Linux 核心 1 部分-debugfs掛載和除錯介面

ftrace 是內建於 Linux 核心的跟蹤工具,從 2.6.27 開始加入主流核心。使用 ftrace 可以除錯或者分析核心中發生的事情。ftrace 提供了不同的跟蹤器,以用於不同的場合,比如跟蹤核心函式呼叫、對上下文切換進行跟蹤、檢視中斷被關閉的時長、跟蹤核心態中的延遲以及效能問題等。系統開發人員

Linux 中的零拷貝技術 1 部分

文章內容 引言 傳統的 Linux 作業系統的標準 I/O 介面是基於資料拷貝操作的,即 I/O 操作會導致資料在作業系統核心地址空間的緩衝區和應用程式地址空間定義的緩衝區之間進行傳輸。這樣做最大的好處是可以減少磁碟 I/O 的操作,因為如果所請求的資料已經存放在作業系統的高速緩衝儲存器

核心 API 1 部分:從核心呼叫使用者空間應用程式

呼叫特定的核心函式(系統呼叫)是 GNU/Linux 中軟體開發的原本就有的組成部分。但如果方向反過來呢,核心空間呼叫使用者空間?確實有一些有這種特性的應用程式需要每天使用。例如,當核心找到一個裝置,這時需要載入某個模組,程序如何處理?動態模組載入在核心通過 usermo

[轉]淺析 Linux 中的時間程式設計和實現原理 1 部分: Linux 應用層的時間程式設計

引子 我們都生活在時間中,但卻無法去思考它。什麼是時間呢?似乎這是一個永遠也不能被回答的問題。然而作為一個程式設計師,在工作中,總有那麼幾次我必須思考什麼是時間。比如,需要知道一段程式碼運行了多久;要在 log 檔案中記錄事件發生時的時間戳;再比如需要一個定時器以便能夠定期做某些計算機操作。我發現,在計算機

Perf -- Linux下的系統性能調優工具 1 部分【轉】

出了 結構 頻率 重復 左右 points return time das 轉自:https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/ Perf 簡介 Perf 是用來進行軟件性能分析的工具。 通過它,應用程序