Double Buffer 在《Sprite》介紹了連續圖像的高速繪圖技巧,適用於 2D 遊戲的開發,像是 RPG 的主角在地圖上移動、或者超級馬力歐兄弟在橫向捲動地圖上跑跑跳跳。 然而該範例有個缺點,就是它直接在畫面上描繪 Sprite,在電腦效能低落的情況下,玩家有可能會看到畫面出現描繪 Sprite 時留下的痕跡,導致畫面閃爍不好看。 因此請進一步探究本章節所要介紹的 Double Buffer,它其實很簡單,純粹只是再建立一個畫面,專門在私底下做繪圖的動作,畫好之後再把結果複製到主要畫面,這樣就能避免留下繪圖的痕跡1。除此之外,這種做法會像卡通連續顯示所有畫好的畫面一樣,畫面會變得相當流暢。 原始碼 // 全域變數 let count = 0; let position = 0; // 載入背景圖片 let background = new Image(); background.src = 'background.png'; // 載入前景圖片 let sprite = new Image(); sprite.src = 'sprite.png'; // 建立畫布 let backbuffer = document.createElement('canvas'); let primarysurface = document.createElement('canvas'); document.body.appendChild(primarysurface); // 調整畫布大小 backbuffer.width = 600; backbuffer.height = 300; primarysurface.width = 600; primarysurface.height = 300; // 將圖片描繪到畫布 function draw() { let backcontext = backbuffer.getContext('2d'); backcontext.drawImage(background, 0, 0); switch (count) { case 0: backcontext.drawImage(sprite, 0, 0, 96, 141, 272, position, 96, 141); count++; break; case 1: backcontext.drawImage(sprite, 96, 0, 96, 141, 272, position += 9, 96, 141); count++; break; case 2: backcontext.drawImage(sprite, 0, 0, 96, 141, 272, position, 96, 141); count++; break; case 3: count = 0; backcontext.drawImage(sprite, 288, 0, 96, 141, 272, position += 9, 96, 141); } let primarycontext = primarysurface.getContext('2d'); primarycontext.drawImage(backcontext.canvas, 0, 0); } // 每 0.25 秒執行 draw() setInterval(draw, 250); 範例下載 19690525A.7z