用HTML5把Canvas緩衝區內容輸出到屏幕

2020-12-19 IT168

  【IT168技術】歡迎來到我的HTML5遊戲編程小教程。我會儘量簡要說明如何使用HTML5 canvas元素和JavaScript創建簡單的遊戲。本教程將省略一些代碼,但絕非故意。您可以隨時查看我的遊戲演示。

  HTML5有許多的神奇功能,諸如:

  畫布元素

  視頻和音頻的支持

  本地存儲

  離線Web應用程式

  地理定位

  …

  這篇文章不打算覆蓋所有的HTML5規範,有關HTML5的更多信息,請參考HTML5:http://diveintohtml5.org/.

  之前,我們使用使用HTML編寫網頁遊戲,現在卻在使用HTML5。那麼兩者有區別嗎?元素用來創建客戶端遊戲時非常方便。針對客戶端遊戲編程,Canvas和JavaScript使用起來非常簡單。

  典型的遊戲類

  在開始我們的遊戲實現和畫布元素之前,我想很快向您展示典型的遊戲類結構:

function Game() {
this.Initialize
= function () {
// initialize all game variables
}
this.LoadContent
= function () {
// load content – graphics, sound etc.
// since all content is loaded run main game loop
// Calls RunGameLoop method every 『draw interval』
this.GameLoop
= setInterval(this.RunGameLoop, this.DrawInterval);
}

this.RunGameLoop
= function (game) {
this.Update();
this.Draw();
}

this.Update
= function () {
// update game variables, handle user input, perform calculations etc.
}

this.Draw
= function () {
// draw game frame
}
}

  這是一個典型的JavaScript遊戲骨架。有趣的是「setInterval」方法。當完成所有資源的加載後,我們可以開始主要的遊戲循環,收集用戶輸入,執行計算,並每隔X毫秒渲染我們的遊戲。這種方式特別適用於哪些後臺有計算程序,人工智慧運動、動畫等相關的遊戲。對於哪些只基於用戶輸入而重畫遊戲內容的靜態遊戲,可以修改這個框架類和去除遊戲循環。

function Game() {
this.Initialize
= function () {
// initialize all game variables
}

this.LoadContent
= function () {
// load content – graphics, sound etc.
var ourGame
= this;
$(document).bind(
'keyup', function (event) {
ourGame.Update(event);
ourGame.Draw();
});

}

this.Update
= function (event) {
// update game variables, handle user input, perform calculations etc.
}

this.Draw
= function () {
// draw game frame
}
}

  這兩個遊戲更新和重畫操作均只發生於用戶輸入。這種方法有效減少了CPU負載,只適用於簡單的遊戲。

  我要給你示例一個大家熟知的非常簡單的經典遊戲Sokoban。幾乎每個遊戲平臺都有不同版本的sokoban,但是我還沒有看到任何使用canvas元素的應用。

${PageNumber}

  canvas入門

  讓我們僅使用單個canvas元素,開始創建我們的HTML5頁面。

<html>
<head>
<title>Sokoban</title>
</head>
<body>
<canvas id="canvas" width="800" height="500">
Canvas
not supported.
</canvas>
</body>
</html>

  就是這樣!現在我們可以看到一個支持Canvas元素的空白頁面,出現在支持的瀏覽器:Chrome、Firefox和Safari。IE 8以及相應的舊版本不支持Canvas。

  在我們開始利用畫布繪畫前,我們需要得到繪圖上下文。Canvas公開一個或多個繪圖上下文,但是我們將專注於最受歡迎的一個——「2 d」上下文。

  讓我們添加一個引用JavaScript文件後直接我們關閉canvas標記:

<script type="text/javascript" src="../Scripts/test01.js"></script>

  這就是部分的JavaScript文件。

var _canvas = document.getElementById('canvas');
var _canvasContext = null;
//check whether browser supports getting canvas context
if (_canvas && _canvas.getContext) {
_canvasContext
= _canvas.getContext('2d');
// ... drawing here ...
}

  在本教程中,我將快速講解canvas上下文相關的繪畫方法,他們是:

rawImage(img,x,y);
•    fillRect(x,y,width、height);
•    strokeRect(x,y, width、height);
•    fillText(「text」,x,y);

  重要提示:Canvas的開始坐標 (0,0)位於左上角。

  這些方法非常簡單。drawImage要麼繪製指定Image對象,要麼根據x,y坐標,繪畫

元素。fillRect和strokeRect都用於繪圖的矩形。唯一的區別是,fillRect是畫一個填充色彩的矩形,而strokeRect是畫一個空矩形,邊框為彩色。fillText用於在畫布上放置文本。

  點擊以下連結,瀏覽演示內容:

  http://demo2.felinesoft.com/Sokoban/Home/Test01 

  關於渲染2個矩形,文本和圖像的JavaScript源文件,可以在這裡找到:

  http://demo2.felinesoft.com/Sokoban/Scripts/Test01.js 

  這就是測試頁面:

  雙緩衝

  因為我們現在有一個遊戲骨架,我們也知道如何利用Canvas繪圖。在實現真正的遊戲之前,唯一剩下的是雙緩衝技術。不過我們不會活靈活現地演示這種技術,因為我們沒有閃爍的動畫效果。但是,既然這篇文章是你學習Canvas遊戲的起點,我尋思著應該向您展示如何利用雙緩衝技術在Canvas快速繪畫。

  雙緩衝技術背後的想法是減少閃爍:首先基於內存緩衝區繪畫,然後將內存中渲染完成的圖像,刷入到屏幕上。

  我們只需要稍微修改我們的Canvas的JavaScript:

_canvas = document.getElementById('canvas');
if (_canvas && _canvas.getContext) {
_canvasContext
= _canvas.getContext('2d');
_canvasBuffer = document.createElement('canvas');
_canvasBuffer.width = _canvas.width;
_canvasBuffer.height
= _canvas.height;
_canvasBufferContext
= _canvasBuffer.getContext('2d');
}

  現在,我們就調用_canvasBufferContext 而非_canvasContext對象繪圖了。如下:

  _canvasContext.drawImage(_canvasBuffer, 0, 0);

  這樣就把Canvas緩衝區的內容輸出到屏幕。就這麼簡單!

相關焦點

  • html中繪製圖形標籤的詳細介紹
    本篇將介紹的是html中<canvas>標籤的用法,感興趣的朋友可以一起研究一下!在html5中,新增了很多實用的標籤,今天為大家介紹的是html5新增標籤<canvas>,<canvas>標籤只是一個容器,對內容並沒有樣式的更改。那它在html中有什麼用,接下來我們就一起來看看吧!
  • HTML5常用的標籤
    表單驗證繪圖應用canvas用canvas繪製圖形用canvas繪製漸變色用canvas繪製變形圖形繪製圖像動畫效果用canvas繪製圖形——繪製矩形獲取canvas元素獲取2d圖形(獲取上下文)設定繪圖樣式fillStyle,strokeStyle設定線寬lineWidth用canvas繪製圖形——繪製路徑獲取canvas元素獲取2d圖形(獲取上下文)創建路徑beginPath
  • html5 canvas畫布繪製矩形和圓形
    html5為我們提供了非常有特色的標籤,canvas標籤為我們可以實現在網頁中畫畫提供了便利,接下來我們列舉他的常用操作。新建一個html5的文檔,建立一個canvas畫布,設置長寬,這裡需要特別注意,canvas標籤可以在標籤內設置width,height,也能通過css來設置,但是通過css來設置的標籤,當繪製圖形的時候會變形,所以我們建議直接在標籤內設置。
  • HTML5調用攝像頭並拍照
    利用html5特性,調用攝像頭,並利用canvas拍照先簡單的添加需要的控制項<video id="video" autoplay=""style='width:640px;height:480px'></video><button id='picture
  • File、Blob、dataURL 和 canvas 的應用與轉換
    (2) File 對象是特殊類型的 Blob,且可以用在任意的 Blob 類型的 context 中。比如:FileReader, URL.createObjectURL(), createImageBitmap(), 及 XMLHttpRequest.send() 都能處理 Blob 和 File。2.
  • 開發者值得關注的HTML5新特性Canvas
    Canvas使用的是Canvas 2D API去繪製圖形的,這個API功能十分強大,而且大部分的瀏覽器都支持 2D canvas ——包括 Opera, Firefox, Konqueror 和 Safari。而且某些版本的 Opera 還支持 3D canvas ,firefox 也可以通過插件形式支持 3D canvas 。下面馬上來看Canvas的例子。
  • 讓IE瀏覽器支持HTML5標準的方法
    這個html5的js文件是作者把他放在Google code project上提供給大家可以直接調用的,當然,如果覺得這樣會影響你的網頁打開速度,你可以把html5的js文件直接下載下來讓後上傳到自己的伺服器單獨調用。
  • 【佳瑾學習】如何從Flash轉換到HTML5
    ,用Flash開發的e-Learning課件曾經是最為普遍接受的一種課件形式。最終這一需求導向了html5,因為html5能夠提供靈活而強大的學習體驗。 從Flash轉換到HTML5的五大關鍵點 1.萃取要啟動轉換過程,首先要確保你拿到所有必須的內容、媒體和支持材料。沒有它們你無法順利轉換。集合完整的材料,會讓整個轉換過程減少一些繁瑣細節,更及時,更少錯誤。
  • 緩衝區的輸入與輸出
    BufferedReader因為需要緩存字符,需要一個字符緩衝區。當通過構造方法BufferedReader(Reader in, int sz)sz指定該字符緩衝區大小,一般保持默認。newLine():表示換行,從一個新行開始寫入BufferedWriter對象因為要實現高效寫入,需要一個字符緩衝區,所以在構造方法BufferedWriter(Writer out, int sz) 中sz用於指定字符緩存區大小,一般可以不指定,默認足夠大。其實它的實現方法和輸入流相差不大。我們照貓畫虎都能做出來。
  • html5學得好不好,看掌握多少標籤
    如果你還是入門階段的話,或者還是一知半解的話 ,那麼我們專門為你們收集的html5常用的標籤大全對你就很有幫助了,你需要了解了html5有哪些標籤你才能夠更好的。駕馭html5這門火熱而又充滿神秘的語言技術。下面是一些常用的html5標籤。按字母順序排列的標籤列表 ?4: 指示在 HTML 4.01 中定義了該元素 ?
  • 用一天入門 canvas 和 JavaScript
    HTML canvas 用最簡單的方式,使web 開發者能夠通過JavaScript在網頁上繪製圖形。這樣,HTML 元素變得更加有趣。<canvas> 元素只是個容器,你總是需要使用 JavaScript 來準確繪製圖形。有人可能會說,我們總是可以添加這些點,也可以添加SVG,但這又會多麼有趣?
  • HTML5新標籤——canvas
    canvas簡介HTML5 標籤用於繪製圖像(通過腳本,通常是 JavaScript)。不過, 元素本身並沒有繪製能力(它僅僅是圖形的容器) - 您必須使用腳本來完成實際的繪圖任務。設置或返回用於填充繪畫的顏色、漸變或模式strokeStyle作用:設置或返回用於填充繪畫的顏色、漸變或模式lineWidth作用:設置或返回當前的線條寬度font作用:設置或返回文本內容的當前字體屬性
  • Java NIO 緩衝區學習筆記
    在面向流的I/O中,您將數據直接寫入或者將數據直接讀到Stream對象中。在NIO庫中,所有數據都是用緩衝區處理的。在讀取數據時,它是直接讀到緩衝區中的。在寫入數據時,它是寫入到緩衝區中的。任何時候訪問NIO中的數據,您都是將它放到緩衝區中。緩衝區實質上是一個數組。通常它是一個字節數組,但是也可以使用其他種類的數組。但是一個緩衝區不僅僅是一個數組。
  • 小議緩衝區溢出
    什麼是緩衝區溢出        通常就是內存的覆蓋,由於緩衝區分為 棧 和 堆,因此緩衝區溢出分為 棧溢出 和 堆溢出。因為 C/C++ 很多函數早期都不檢查內存邊界,所有的內存邊界檢查都由程式設計師自己去完成。這樣就有可能因為疏忽造成緩衝區的溢出。
  • 前端HTML5面試官和應試者一問一答
    <input name="da" type="text" form="form1" required/><form id="form1"> <input type="submit" value="提交"/></form>formaction特性:每個表單都會通過action特性把表單內容提交到另外一個頁面
  • html5中nav標籤(導航連結)的詳細介紹
    本篇將介紹html5中nav標籤(導航連結)的詳細用法,有興趣的朋友可以了解一下!在html5版本中,新增了很多語義標籤,比如:header標籤、footer標籤、aside標籤、nav標籤等等。這些語義標籤沒有實際的顯示效果,只是起到語義的作用。今天小編要介紹的就是其中一個,即nav標籤。
  • Python基本輸出函數print()用法小結
    Python內置函數print()是基本輸出函數,可以使用help()函數查看其詳細用法和參數含義:>>> help
  • 用友iUAP馬太航:HTML5多媒體特性分析
    一是視頻截圖,video標籤本身並不支持視頻截圖功能,必須通過HTML5的canvas標籤實現,類似代碼如下:<video id="html5-video" width="500" height="380" controls autoplay><source src="video.mp4" type='video/mp4'></source>
  • html2canvas - 動態生成海報的優質js庫
    如何把網頁上的內容用javascript來實現截圖?今天分享的html2canvas就可以。介紹在微信項目中經常會遇到動態生成海報的需求,Web前端合成圖片往往會使用canvas。canvas雖然強大,但用來合成海報非常繁瑣,一不小心就幾百行代碼了。