摘要:文章首發于我的博客前言上一篇文章小恐龍游戲源碼探究三進入街機模式實現了開場動畫和街機模式。
文章首發于我的 GitHub 博客前言
上一篇文章:《Chrome 小恐龍游戲源碼探究三 -- 進入街機模式》 實現了開場動畫和街機模式。這一篇文章中,將實現云朵的隨機繪制。
云朵類 Cloud定義云朵類 Cloud:
/** * 云朵類 * @param {HTMLCanvasElement} canvas 畫布 * @param {Object} spritePos 圖片在雪碧圖中的位置信息 * @param {Number} containerWidth 容器的寬度 */ function Cloud(canvas, spritePos, containerWidth) { this.canvas = canvas; this.ctx = canvas.getContext("2d"); this.spritePos = spritePos; this.containerWidth = containerWidth; // 坐標 this.xPos = containerWidth; this.yPos = 0; // 該云朵是否需要刪除 this.remove = false; // 隨機云朵之間的間隙 this.cloudGap = getRandomNum(Cloud.config.MIN_CLOUD_GAP, Cloud.config.MAX_CLOUD_GAP); this.init(); }
相關的配置參數:
Cloud.config = { WIDTH: 46, HEIGHT: 14, MIN_CLOUD_GAP: 100, // 云之間的最小間隙 MAX_CLOUD_GAP: 400, // 云之間的最大間隙 MIN_SKY_LEVEL: 71, // 云的最小高度 MAX_SKY_LEVEL: 30, // 云的最大高度 BG_CLOUD_SPEED: 0.2, // 云的速度 CLOUD_FREQUENCY: 0.5, // 云的頻率 MAX_CLOUDS: 6 // 云的最大數量 };
補充本篇文章中會用到的數據:
Runner.spriteDefinition = { LDPI: { // ... + CLOUD: {x: 86, y: 2}, }, };
繪制和更新云朵的方法定義如下:
Cloud.prototype = { // 初始化云朵 init: function () { this.yPos = getRandomNum(Cloud.config.MAX_SKY_LEVEL, Cloud.config.MIN_SKY_LEVEL); this.draw(); }, // 繪制云朵 draw: function () { this.ctx.save(); var sourceWidth = Cloud.config.WIDTH; var sourceHeight = Cloud.config.HEIGHT; var outputWidth = sourceWidth; var outputHeight = sourceHeight; this.ctx.drawImage( Runner.imageSprite, this.spritePos.x, this.spritePos.y, sourceWidth, sourceHeight, this.xPos, this.yPos, outputWidth, outputHeight ); this.ctx.restore(); }, // 更新云朵 update: function (speed) { if (!this.remove) { this.xPos -= speed; this.draw(); // 云朵移出 canvas,將其刪除 if (!this.isVisible()) { this.remove = true; } } }, // 云朵是否移出 canvas isVisible: function () { return this.xPos + Cloud.config.WIDTH > 0; }, }; /** * 獲取 [min, max] 之間的隨機數 * @param {Number} min 最小值 * @param {Number} max 最大值 * @return {Number} */ function getRandomNum(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }
然后需要通過 Horizon 類調用 Cloud 類。首先在 Horizon 類中添加與云朵相關的屬性:
- function Horizon(canvas, spritePos) { + function Horizon(canvas, spritePos, dimensions) { this.canvas = canvas; this.ctx = this.canvas.getContext("2d"); this.spritePos = spritePos; + this.dimensions = dimensions; + // 云的頻率 + this.cloudFrequency = Cloud.config.CLOUD_FREQUENCY; + // 云 + this.clouds = []; + this.cloudSpeed = Cloud.config.BG_CLOUD_SPEED; // 地面 this.horizonLine = null; this.init(); }
修改在 Runner 中調用 Horizon 類時傳入的參數:
Runner.prototype = { init: function () { // ... + // 加載背景類 Horizon - this.horizon = new Horizon(this.canvas, this.spriteDef); + this.horizon = new Horizon(this.canvas, this.spriteDef, + this.dimensions); // ... }, };
添加生成云朵的方法,將生成的云朵存入數組 clouds:
Horizon.prototype = { // 添加新的云朵 addCloud: function () { this.clouds.push(new Cloud(this.canvas, this.spritePos.CLOUD, this.dimensions.WIDTH)); }, };
調用 addCloud 方法來初始化云朵:
Horizon.prototype = { init: function () { + this.addCloud(); this.horizonLine = new HorizonLine(this.canvas, this.spritePos.HORIZON); }, };
添加更新云朵的方法:
Horizon.prototype = { // 更新 canvas 上的云朵 updateCloud: function (deltaTime, speed) { var cloudSpeed = Math.ceil(deltaTime * this.cloudSpeed * speed / 1000); var numClouds = this.clouds.length; if (numClouds) { for (var i = numClouds - 1; i >= 0; i--) { this.clouds[i].update(cloudSpeed); } var lastCloud = this.clouds[numClouds - 1]; // 檢查是否需要添加新的云朵 // 添加云朵的條件:云朵數量少于最大數量、 // 最后一個云朵后面的空間大于它的間隙、 // 云朵出現頻率符合要求 if (numClouds < Cloud.config.MAX_CLOUDS && (this.dimensions.WIDTH - lastCloud.xPos) > lastCloud.cloudGap && this.cloudFrequency > Math.random()) { this.addCloud(); } // 刪除 remove 屬性為 true 的云朵 this.clouds = this.clouds.filter(function (item) { return !item.remove; }); } else { this.addCloud(); } }, };
調用 updateCloud 方法,來實現對云朵的更新:
Horizon.prototype = { update: function (deltaTime, currentSpeed) { this.horizonLine.update(deltaTime, currentSpeed); + this.updateCloud(deltaTime, currentSpeed); }, };
運行效果如下:
查看添加或修改的代碼:戳這里
Demo 體驗地址:https://liuyib.github.io/blog/demo/game/google-dino/add-cloud/
上一篇 | 下一篇 | Chrome 小恐龍游戲源碼探究三 -- 進入街機模式 | Chrome 小恐龍游戲源碼探究五 -- 隨機繪制障礙 |
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/103882.html
摘要:首先是繪制靜態的地面。上一篇下一篇無小恐龍游戲源碼探究二讓地面動起來 文章首發于我的 GitHub 博客 目錄 Chrome 小恐龍游戲源碼探究一 -- 繪制靜態地面 Chrome 小恐龍游戲源碼探究二 -- 讓地面動起來 Chrome 小恐龍游戲源碼探究三 -- 進入街機模式 Chrome 小恐龍游戲源碼探究四 -- 隨機繪制云朵 Chrome 小恐龍游戲源碼探究五 -- 隨機繪...
摘要:文章首發于我的博客前言上一篇文章小恐龍游戲源碼探究四隨機繪制云朵實現了云朵的隨機繪制,這一篇文章中將實現仙人掌翼龍障礙物的繪制游戲速度的改變障礙物的類型有兩種仙人掌和翼龍。 文章首發于我的 GitHub 博客 前言 上一篇文章:《Chrome 小恐龍游戲源碼探究四 -- 隨機繪制云朵》 實現了云朵的隨機繪制,這一篇文章中將實現:1、仙人掌、翼龍障礙物的繪制 2、游戲速度的改變 障礙物...
摘要:文章首發于我的博客前言上一篇文章小恐龍游戲源碼探究二讓地面動起來實現了地面的移動。街機模式的效果就是游戲開始后,進入全屏模式。例如可以看到,進入街機模式之前,有一段開場動畫。 文章首發于我的 GitHub 博客 前言 上一篇文章:《Chrome 小恐龍游戲源碼探究二 -- 讓地面動起來》 實現了地面的移動。這一篇文章中,將實現效果:1、瀏覽器失焦時游戲暫停,聚焦游戲繼續。 2、開場動...
摘要:文章首發于我的博客前言上一篇文章小恐龍游戲源碼探究五隨機繪制障礙實現了障礙物仙人掌和翼龍的繪制。在游戲中,小恐龍移動的距離就是游戲的分數。 文章首發于我的 GitHub 博客 前言 上一篇文章:《Chrome 小恐龍游戲源碼探究五 -- 隨機繪制障礙》 實現了障礙物仙人掌和翼龍的繪制。這一篇將實現當前分數、最高分數的記錄和繪制。 在游戲中,小恐龍移動的距離就是游戲的分數。分數每達 1...
摘要:例如,將函數修改為小恐龍眨眼這樣小恐龍會不停的眨眼睛。小恐龍的開場動畫下面來實現小恐龍對鍵盤按鍵的響應。接下來還需要更新動畫幀才能實現小恐龍的奔跑動畫。 文章首發于我的 GitHub 博客 前言 上一篇文章:《Chrome 小恐龍游戲源碼探究七 -- 晝夜模式交替》實現了游戲晝夜模式的交替,這一篇文章中,將實現:1、小恐龍的繪制 2、鍵盤對小恐龍的控制 3、頁面失焦后,重新聚焦會重置...
閱讀 3698·2021-11-11 10:58
閱讀 2484·2021-09-22 15:43
閱讀 2873·2019-08-30 15:44
閱讀 2194·2019-08-30 13:08
閱讀 1826·2019-08-29 17:28
閱讀 891·2019-08-29 10:54
閱讀 680·2019-08-26 11:46
閱讀 3510·2019-08-26 11:43