源代碼目錄介紹:canvas
模塊分解:瀏覽器
Director.js 微信
DataStore.js 微信開發
ResoureLoader.jsapp
Resources.js ide
Sprite.js 函數
background.js 工具
總結 : Sprite 精靈類是小遊戲核心的概念。能夠進行旋轉 、變換 、縮放,能夠處理不少動做,包含不少內部邏輯,建立一個父類,讓全部元素都繼承住它。 Director :邏輯的變化,場景的切換。 ResoureLoader :若是沒加載好就循環,畫面會是一張白布。動畫
map語法 this
this.map = new Map(Resources)//初始化資源
將 初始化成===>
weapp-adapter.js 由於適配器文件已經 建立了canvas 因此你本身再去建立的話沒有效果,也實現不了任何的動做。
1. 這是由於沒有給script 添加type='module'(ES6)
2. 這是由於文件導入的時候沒有加.js完整後綴名。然而在微信開發者工具裏 不加後綴名是對的。
3. 沒有提供一個名爲Resources的導出 跑過去一看 .............. Resources少了個s...
extends基於Sprite.js 的構造器是不能使用this的 只能使用super
4.地板不動怎麼辦:
//requestAnimationFrame() 告訴瀏覽器——你但願執行一個動畫,而且要求瀏覽器在下次重繪以前調用指定的回調函數更新動畫。該方法須要傳入一個回調函數做爲參數,該回調函數會在瀏覽器下一次重繪以前執行 requestAnimationFrame(()=>{this.run()})
5.手機調試報錯: 見區別 三、4
//直接報錯
1.wx.setPreferredFramesPerSecond(number fps) 能夠修改渲染幀率。默認渲染幀率爲 60 幀每秒。修改後,requestAnimationFrame 的回調頻率會發生改變。 低於60幀肉眼能夠看見
能夠修改原生 number requestAnimationFrame(function callback) 在下次進行重繪時執行
ES6: 外部文件想要引用類Class或者是類中的方法乃至變量的話,咱們必定要在前面加上export關鍵字
1.extends中的 constructor中的super 方法
constructor
中必須調用 super
方法,由於子類沒有本身的 this
對象,而是繼承父類的 this
對象,而後對其進行加工,而 super
就表明了父類的構造函數。super
雖然表明了父類 A 的構造函數,可是返回的是子類 B 的實例,即 super
內部的 this
指的是 B,所以 super()
在這裏至關於 ```A.prototype.constructor.call(this, props)``
import { Sprite } from "../base/Sprite.js"; //循環渲染三隻小鳥,實際上是 循環渲染圖片的三個部分(canvas特性) 不用精靈圖(能夠省去resource 和resourceloader)是爲了提升開發效率 export class Birds extends Sprite{ constructor() { const image = Sprite.getImage('birds'); super(image, 0, 0, image.width, image.height, 0, 0, image.width, image.height); //小鳥上下邊距 左右邊距是9 寬34 高24 this.clippingX = [ 9, 9 + 34 + 18, 9 + 34 + 18 + 34 + 18];//沒有第三個是翅膀 this.clippingY = [10, 10, 10]; this.clippingWidth = [34, 34, 34]; this.clippingHeight = [24, 24, 24]; //const 對外不可見 const birdX = window.innerWidth / 4;//單隻小鳥初始X座標 this.birdsX = [birdX, birdX, birdX];//三隻小鳥初始X座標 this.birdY = window.innerHeight / 2;//初始Y座標 this.birdsY = [this.birdY, this.birdY, this.birdY]; this.y = [this.birdY, this.birdY, this.birdY];//每隻小鳥的Y座標 //判斷小鳥屬於第幾只 this.index = 0; this.count = 0; //循環小鳥個數 小鳥從0位=> 1位 => 2位 => 0位 this.time = 0;//自由落體公式會涉及到時間. } draw() { //切換三隻小鳥的速度 const speed = 0.2; this.count = this.count + speed; if (this.index >= 2) { this.count = 0; } //減速器的做用 向下取整 this.index = Math.floor(this.count); //受重力做用 const offsetUp = 30; const g = 0.98 / 2.5; const offsetY = (g * this.time * (this.time - offsetUp) ) / 2; for (let i = 0; i <= 2; i++){ this.birdsY[i] = this.y[i] + offsetY; } this.time++; console.log('test====',this.y[0],this.birdsY[0]); //渲染小鳥 super.draw( this.img, this.clippingX[this.index], this.clippingY[this.index], this.clippingWidth[this.index], this.clippingHeight[this.index], this.birdsX[this.index], this.birdsY[this.index], this.clippingWidth[this.index], this.clippingHeight[this.index]); } }
// 精靈的基類,負責初始化精靈加載的資源的大小以及位置. import { DataStore } from './DataStore.js' export class Sprite{ constructor(img = null,//默認值 srcX = 0,// srcY = 0,// srcW = 0,// srcH = 0,// x = 0, y = 0,// width = 0 , height = 0) {// this.dataStore = DataStore.getInstance() this.ctx = this.dataStore.ctx; this.img = img;//要繪製的圖片對象 this.srcX = srcX;// 剪裁的X座標 this.srcY = srcY;// 剪裁的Y座標 this.srcW = srcW;// 剪裁的寬度 this.srcH = srcH;// 剪裁的高度 this.x = x; this.y = y;//資源在canvas上的擺放位置 this.width = width; this.height = height; } /** * img 傳入Image對象 * srcX 要剪裁的起始X座標 * srcY 要剪裁的起始Y座標 * srcW 剪裁的寬度 * srcH 剪裁的高度 * x 放置的x座標 * y 放置的y座標 * width 要使用的寬度 * height 要使用的高度 */ //讓Sprite獲取Image 靜態方法直接獲取實例 不須要this了 static getImage(key) { return DataStore.getInstance().res.get(key); } //動畫循環 每秒60幀 60次 draw(img = this.img, srcX = this.srcX, srcY = this.srcY, srcW = this.srcW, srcH = this.srcH, x = this.x, y = this.y, width = this.width, height = this.height) { this.ctx.drawImage( img, srcX, srcY, srcW, srcH, x, y, width, height ) } } // let image = new Image(); // image.src = '../resource/background.png'; // image.onload = () => { // this.ctx.drawImage( // image, // 0,//起始位置 // 0,//起始位置 // image.width,//裁剪的大小 // image.height,//裁剪的大小 // 0,//放置在畫布上的位置 // 0,//放置在畫布上的位置 // image.width,//使用的圖片大小 // image.height,//使用的圖片大小 // ); // }
.