我正在創建一個遊戲引擎!
這場偉大的冒險簡介
幾週以來,我一直在定期從事一個我認為可能很有趣的項目,即基於 canvas 使用 JavaScript 和 HTML5 創建我的視頻遊戲引擎。
您可能想知道為什麼選擇 HTML5 和 JavaScript 來創建視訊遊戲?答案沒有問題那麼酷,是我的學校(Zone01 Normandie)所需的項目的競爭以及這些語言擁有執行該項目所需的一切的事實,促使我選擇了這些技術
。但實際上這些並不是我會選擇作為基礎的語言,在完成這個任務後我一定會用不同的語言開始其他類似的冒險。
建築學
所以我開始設計我的電玩引擎,它將由幾個類別組成,包括至少兩個主要類別:Game 類別將管理整個遊戲區域,而GameObject 類別允許您生成物件我們的遊戲並讓它們互相互動。
對於這些類,我將添加 CollideBox 類,它將允許我管理所有物件的碰撞框。
Game 類別有一個 GameLoop 方法,將在遊戲的每個畫面(圖片)執行,還有一個 Draw 方法,將在每個遊戲循環期間呼叫。
對於GameObject類,它有一個Step方法和一個Draw方法。
第一個執行每輪遊戲循環,第二個每次呼叫 GameLoop 類別的 Draw 方法時執行。
理論上,您可以透過將引擎模組匯入到專案中來創建遊戲。
為了顯示精靈,我選擇使用 HTML5 內建的canva API(內建意味著它預設附帶)
它將允許我顯示所有精靈並重新剪切圖像以創建對我來說非常有用的動畫!
幾天后,我能夠以給定的速度顯示動畫,並透過我的 CollideBox 偵測碰撞。
還有很多其他好東西,我會讓你在下面看到:
GameObject 類別
class GameObject{ constructor(game) { // Initialize the GameObject this.x = 0 this.y = 0 this.sprite_img = {file: undefined, col: 1, row: 1, fw: 1, fh: 1, step: 0, anim_speed: 0, scale: 1} this.loaded = false this.game = game this.kill = false this.collision = new CollideBox() game.gObjects.push(this) }; setSprite(img_path, row=1, col=1, speed=12, scale=1) { var img = new Image(); img.onload = () => { console.log("image loaded") this.sprite_img = {file: img, col: col, row: row, fw: img.width / col, fh: img.height / row, step: 0, anim_speed: speed, scale: scale} this.onSpriteLoaded() }; img.src = img_path } onSpriteLoaded() {} draw(context, frame) { // Draw function of game object if (this.sprite_img.file != undefined) { let column = this.sprite_img.step % this.sprite_img.col; let row = Math.floor(this.sprite_img.step / this.sprite_img.col); // context.clearRect(this.x, this.y, this.sprite_img.fw, this.sprite_img.fh); context.drawImage( this.sprite_img.file, this.sprite_img.fw * column, this.sprite_img.fh * row, this.sprite_img.fw, this.sprite_img.fh, this.x, this.y, this.sprite_img.fw * this.sprite_img.scale, this.sprite_img.fh * this.sprite_img.scale ); if (frame % Math.floor(60 / this.sprite_img.anim_speed) === 0) { // Mise à jour de step seulement à 12 fps if (this.sprite_img.step box.x && this.collision.y box.y ) } onStep() {}; }
遊戲類
class Game { constructor(width = 1400, height = 700) { this.gObjects = []; this.toLoad = []; this.timers = []; this.layers = []; this.canvas = document.getElementsByTagName("canvas")[0] this.canvas.width = width this.canvas.height = height this.context = this.canvas.getContext("2d") this.context.globalCompositeOperation = 'source-over'; this.inputs = {}; this.mouse = {x: 0, y: 0} document.addEventListener('keydown', (e) => { this.inputs[e.key] = true; }, false); document.addEventListener('keyup', (e) => { this.inputs[e.key] = false; }, false); document.addEventListener('mousemove', (e) => { this.mouse.x = e.x; this.mouse.y = e.y; }) document.addEventListener('mouseevent', (e) => { switch (e.button) { } }) } draw(frame) { this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); console.log( this.canvas.width, this.canvas.heigh) for(let i = 0; i { clock += 1 for(let i = 0; i <p>當然有很多最佳化或其他錯誤,但一切都正常,<br> 「完美的!」你能告訴我嗎? <br> 那就太簡單了。 </p> <h3> 憂慮 </h3> <p>完成此任務並開始嘗試使用此引擎創建遊戲後,我在與同事的談話中得知了一些可怕的消息。 </p> <p>我想您還記得所做的技術選擇是為了符合我的 Zone01 學校的要求......<br> 確實,選擇的語言很好,但我不知道有一條指令會嚴重阻礙該項目......<br> 我們被禁止使用 Canva 函式庫! </p> <p>提醒一下,這是我們用來顯示圖像的函式庫。 </p> <h3> 接下來是什麼? </h3> <p>當我寫這篇文章時,我也開始完全重新設計這個遊戲引擎,而不使用canva。 </p> <p>本開發日誌已經完成,您很快就會看到這個故事的其餘部分,別擔心。 <br> 對於下一個開發日誌,我一定會嘗試新的格式。 </p> <p> 希望這些內容對您有所幫助,給您帶來樂趣,或至少在一些主題上對您進行了教育。祝您一天愉快,程式設計愉快。 </p> <h2> DevLogs 1.1:引擎完成了,它是如何運作的? </h2> <h3> 之前 </h3> <p>幾個月前,我開始創建我的電玩引擎,我完成了它......不久前,在Zone01 的幾位同事的幫助下,我們甚至成功地創建了一款受《超級瑪利歐兄弟》啟發的遊戲,可以在我的網站上找到Itch.io 頁面。 </p> <p>決定申請這個開發日誌的格式花了很多時間,我承認我稍微推遲了甚至完全推遲了寫這篇文章的截止日期。 <br> 透過耐心地以我猶豫不決為藉口不從事這個主題,我現在發現自己在計劃發布日期兩個月後在魯昂汽車站的休息區寫作,而取消的火車迫使我多等一個小時。 </p><p> 因此,讓我們忽略架構的所有細節,自我的開發日誌的第一部分以來,這個架構的變化很小(除了透過避免使用畫布進行的調整之外)。 <br> 因此,我們將討論所進行的專案、我們作為團隊的工作方式以及我們遇到的問題。 <br> 將此視為對該專案的反饋,我希望您能夠從本文中吸取一些教訓,這將對您的專案之一有所幫助。 </p> <h3> 專案 </h3> <p>這個專案是用 JavaScript 重新創建一個超級瑪利歐兄弟,並從頭開始,至少在程式碼方面是如此。 </p> <p>規格很簡單,我們必須有一個具有多個等級的馬裡奧遊戲,這是一種簡單地創建新等級的方法。 <br> 此外,我們還必須建立一個記分板和一個選單來調整選項。 </p> <p>這個項目的困難是:</p>
- 螢幕上元素的水平捲動
- 優化螢幕上不存在的元素
捲動,因為它要求所有元素在背景中相對於玩家的位置滾動。
並且優化螢幕上未顯示的元素可以減少運行遊戲所需的資源,而不會損失效能。
解決了這些困難後,我們在我的 itch.io 頁面上發布了這個遊戲,您甚至可以去測試它。
本開發日誌就這樣結束了,現在完成了,我將能夠撰寫有關其他項目和/或其他主題的內容。
如果你對我告訴你的內容有一點興趣,你可以在 github 上查看我的不同項目(包括本開發日誌中的項目)。
祝你今天休息愉快!
以上是開發日誌 - 我正在創建一個遊戲引擎!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Atom編輯器mac版下載
最受歡迎的的開源編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)