摘要:原文鏈接譯文來自我的博客簡介如果你想用做個游戲,那么來對地方了。現在可以看到字母在屏幕上移動了,恭喜你,你已經快入門了。
原文鏈接
譯文來自我的博客
簡介如果你想用canvas做個游戲,那么來對地方了。
但是但是你至少知道javascript怎么拼寫(╯‵□′)╯︵┻━┻
既然沒問題,那先來玩一下或者下載
創建canvas標簽廢話不多說,我們必須創建一個canvas標簽,簡單起見,用一下不喜歡的jQuery
var CANVAS_WIDTH = 480; var CANVAS_HEIGHT = 320; var canvasElement = $(""); var canvas = canvasElement.get(0).getContext("2d"); canvasElement.appendTo("body");游戲循環
為了能夠讓游戲平滑動畫,我們用30幀的頻率。
var FPS = 30; setInterval(function() { update(); draw(); }, 1000/FPS);
現在我們可以先給這兩個函數放置play,重要的是setInterval函數會定期照顧他們的。
hello world現在我們有了這個循環,讓我們開始畫東西吧~
function draw() { canvas.fillStyle = "#000"; // Set color to black canvas.fillText("Sup Bro!", 50, 50); }
注意:確認修改之后刷新一下,萬一哪里不對,代碼變的少還能看出哪里不對。
如果沒錯,那么顯示的是靜止的字母,雖然好看,但我們已經有了動畫循環,所以我們應該很容易讓他動起來。
var textX = 50; var textY = 50; function update() { textX += 1; textY += 1; } function draw() { canvas.fillStyle = "#000"; canvas.fillText("Sup Bro!", textX, textY); }
現在如果沒出錯,那么字母應該在移動,但是有殘影出現。想想為什么會這樣,因為我們沒有清除之前的畫面呢,so 我們加點清除畫布的代碼。
function draw() { canvas.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT); canvas.fillStyle = "#000"; canvas.fillText("Sup Bro!", textX, textY); }
現在可以看到字母在屏幕上移動了,恭喜你,你已經快入門了。讓我們繼續。
創建玩家接下來創建一個物體用來給玩家控制,我們創建了一個簡單的object:
var player = { color: "#00A", x: 220, y: 270, width: 32, height: 32, draw: function() { canvas.fillStyle = this.color; canvas.fillRect(this.x, this.y, this.width, this.height); } };
我們簡單地著色了這個物體,當我們清除畫布的時候,畫上這個物體。
function draw() { canvas.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT); player.draw(); }鍵盤控制
使用jQuery HotKeys
使用jQuery HotKeys,這個插件提供了簡單的鍵盤輸入檢測
我們可以這么綁定事件
$(document).bind("keydown", "left", function() { ... });
不用想哪個按鍵是哪個號碼真舒服,我們剛才實現了“當玩家按上的時候,做一些事情”,碉堡的插件!
玩家的移動
鍵盤輸入檢測已經完成了,但我們還要處理鍵盤輸入之后要做什么。
你可能會想使用事件驅動的方式去處理鍵盤輸入,但是這樣做系統不一,按鍵效果不一樣,而且脫離了動畫循環呢,這樣做就可以跨系統了,保證了一致性,也讓游戲更平滑了。
有一個好消息,我們有一個key_status.js的文件,提供了類似keydown.left等等。去下載的文件里找
現在我們可以去查詢是否有按鍵了,然后我們就這么寫:
function update() { if (keydown.left) { player.x -= 2; } if (keydown.right) { player.x += 2; } }
這樣玩家可以控制了。
你可能注意到玩家可以跑出屏幕,讓我們限制一下玩家的位置,而且似乎控制速度有點慢,我們順便加加速。
function update() { if (keydown.left) { player.x -= 5; } if (keydown.right) { player.x += 5; } player.x = player.x.clamp(0, CANVAS_WIDTH - player.width); }
clamp這個函數可以在下載的util.js里看到
然后我們加點炮彈進去。
function update() { if (keydown.space) { player.shoot(); } if (keydown.left) { player.x -= 5; } if (keydown.right) { player.x += 5; } player.x = player.x.clamp(0, CANVAS_WIDTH - player.width); } player.shoot = function() { console.log("Pew pew"); // :) Well at least adding the key binding was easy... };添加更多物體
子彈
我們需要一個數組放子彈
var playerBullets = [];
接下來我們創建一個子彈原型
function Bullet(I) { I.active = true; I.xVelocity = 0; I.yVelocity = -I.speed; I.width = 3; I.height = 3; I.color = "#000"; I.inBounds = function() { return I.x >= 0 && I.x <= CANVAS_WIDTH && I.y >= 0 && I.y <= CANVAS_HEIGHT; }; I.draw = function() { canvas.fillStyle = this.color; canvas.fillRect(this.x, this.y, this.width, this.height); }; I.update = function() { I.x += I.xVelocity; I.y += I.yVelocity; I.active = I.active && I.inBounds(); }; return I; }
但玩家射擊時,我們應該實例子彈,然后添加到子彈數組中.
player.shoot = function() { var bulletPosition = this.midpoint(); playerBullets.push(Bullet({ speed: 5, x: bulletPosition.x, y: bulletPosition.y })); }; player.midpoint = function() { return { x: this.x + this.width/2, y: this.y + this.height/2 }; };
我們需要把子彈的動畫添加到沒幀的動畫里,為了能讓子彈變成無限的效果,我們過濾了子彈數組,只保留了激活的子彈.同時刪除了已經撞到敵人的子彈.
function update() { ... playerBullets.forEach(function(bullet) { bullet.update(); }); playerBullets = playerBullets.filter(function(bullet) { return bullet.active; }); }
最后一步就是畫子彈了.
function draw() { ... playerBullets.forEach(function(bullet) { bullet.draw(); }); }
敵人
現在我們要像添加子彈一樣添加敵人.
enemies = []; function Enemy(I) { I = I || {}; I.active = true; I.age = Math.floor(Math.random() * 128); I.color = "#A2B"; I.x = CANVAS_WIDTH / 4 + Math.random() * CANVAS_WIDTH / 2; I.y = 0; I.xVelocity = 0 I.yVelocity = 2; I.width = 32; I.height = 32; I.inBounds = function() { return I.x >= 0 && I.x <= CANVAS_WIDTH && I.y >= 0 && I.y <= CANVAS_HEIGHT; }; I.draw = function() { canvas.fillStyle = this.color; canvas.fillRect(this.x, this.y, this.width, this.height); }; I.update = function() { I.x += I.xVelocity; I.y += I.yVelocity; I.xVelocity = 3 * Math.sin(I.age * Math.PI / 64); I.age++; I.active = I.active && I.inBounds(); }; return I; }; function update() { ... enemies.forEach(function(enemy) { enemy.update(); }); enemies = enemies.filter(function(enemy) { return enemy.active; }); if(Math.random() < 0.1) { enemies.push(Enemy()); } }; function draw() { ... enemies.forEach(function(enemy) { enemy.draw(); }); }加載和添加圖片
雖然目前這些方塊飛來飛去看起來很酷,但有圖片就更酷了。我們使用了一個叫sprite.js的文件,可以從下載的文件里看到。
player.sprite = Sprite("player"); player.draw = function() { this.sprite.draw(canvas, this.x, this.y); }; function Enemy(I) { ... I.sprite = Sprite("enemy"); I.draw = function() { this.sprite.draw(canvas, this.x, this.y); }; ... }碰撞檢測
我們已經有了很多敵人飛來飛去了,但他們沒有交互呢mb打不到他們,我們是時候加點碰撞檢測了.
讓我們使用一個簡單的方法檢測:
function collides(a, b) { return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y; }
我們需要檢測如下兩種碰撞:
玩家子彈和敵方飛船
玩家和敵方飛船
讓我們給update加入處理碰撞之后的處理
function handleCollisions() { playerBullets.forEach(function(bullet) { enemies.forEach(function(enemy) { if (collides(bullet, enemy)) { enemy.explode(); bullet.active = false; } }); }); enemies.forEach(function(enemy) { if (collides(enemy, player)) { enemy.explode(); player.explode(); } }); } function update() { ... handleCollisions(); }
現在我們需要給敵方飛船和玩家添加爆炸效果,爆炸的同時會移除
function Enemy(I) { ... I.explode = function() { this.active = false; // Extra Credit: Add an explosion graphic }; return I; }; player.explode = function() { this.active = false; // Extra Credit: Add an explosion graphic and then end the game };聲音
為了可玩性,我們將要添加聲音效果進去,我們用到sound.js這個文件,讓事情變得非常簡單。
player.shoot = function() { Sound.play("shoot"); ... } function Enemy(I) { ... I.explode = function() { Sound.play("explode"); ... } }
使用這些API就能很快地完成一個簡單的游戲.
告別再說一下游戲地址,也可以下載
well,我希望你開始喜歡用js和html5寫簡單的游戲,隨著學習的深入,將來會有更多地挑戰呢.
參考文獻HTML5 Canvas Cheat Sheet
HTML5 Game EnginesSF怎么自動讀取gist的信息。。我在SF刪了這個鏈接
第一次完整的翻譯一篇文章,真蛋疼有些句子感覺不好翻,就隨便糊弄一下,BTW,我也按這個教程寫了例子,好像寫完還有很多問題呢(逃
順便吐槽一下,SF編輯器怎么沒有刪除線,╭(╯^╰)╮
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77932.html
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學習即將閱讀的一些優秀經典前端后端書籍。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學習、即將閱讀)的一些優秀經典前端/Java后端書籍。全文為純原創,且將持續更新,未經許可,不得進行轉載。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 基礎 基礎書籍 進階 進階階段,深入學習的書...
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學習即將閱讀的一些優秀經典前端后端書籍。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學習、即將閱讀)的一些優秀經典前端/Java后端書籍。全文為純原創,且將持續更新,未經許可,不得進行轉載。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 基礎 基礎書籍 進階 進階階段,深入學習的書...
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學習即將閱讀的一些優秀經典前端后端書籍。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學習、即將閱讀)的一些優秀經典前端/Java后端書籍。全文為純原創,且將持續更新,未經許可,不得進行轉載。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 基礎 基礎書籍 進階 進階階段,深入學習的書...
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學習即將閱讀的一些優秀經典前端后端書籍。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學習、即將閱讀)的一些優秀經典前端/Java后端書籍。全文為純原創,且將持續更新,未經許可,不得進行轉載。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 基礎 基礎書籍 進階 進階階段,深入學習的書...
摘要:正在失業中的課多周刊第期我們的微信公眾號,更多精彩內容皆在微信公眾號,歡迎關注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動力。是一種禍害譯本文淺談了在中關于的不好之處。淺談超時一運維的排查方式。 正在失業中的《課多周刊》(第3期) 我們的微信公眾號:fed-talk,更多精彩內容皆在微信公眾號,歡迎關注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大的...
閱讀 3043·2021-11-25 09:43
閱讀 1626·2021-11-24 11:15
閱讀 2359·2021-11-22 15:25
閱讀 3501·2021-11-11 16:55
閱讀 3240·2021-11-04 16:10
閱讀 2773·2021-09-14 18:02
閱讀 1685·2021-09-10 10:50
閱讀 1070·2019-08-29 15:39