【HTML5遊戲開發小技巧】RPG情景對話中,令文本逐字輸出

來源:互聯網
上載者:User

以前用javascript實現過令文本逐字輸出的效果,今天我來用html5中的canvas實現一下。canvas裡的內容可不像<p>那樣好操作,首先,你需要懂得一些html5的API才能操作canvas,而<p>可以用DOM直接操作,相對而言,canvas還是要比<p>複雜些。那麼本篇就為大家講述入股令文本逐字輸出。

首先我先說明,本篇我不打算用任何引擎,因為今天我們是來研究技巧和原理的。

一,原理

做一個富有技巧的程式我們首先得搞清楚原理,而令文本逐字輸出的原理很簡單。

假如我們有一串字元,我們可以把它們分成一個個字元,然後裝入數組。例入有一個字串yorhom,那麼我們可以把他分成

 

var arr = ['y','o','r','h','o','m'];

的形式,這樣要輸出文字的話就可以編曆這個數組,然後每隔一段時間就把當前遍曆的那個字元輸出。這樣一來就可以將文字逐漸輸出。

 

光說還不行,我們還得去實現,否則就是紙上談兵。

二,實現

首先我們看看代碼:

 

<!DOCTYPE html><html><head><meta charset="utf-8" /><title>html5輸出文字類</title><script type="text/javascript">function type(){//畫布的idvar canvasId = "mycanvas";//用於輸出文字的變數var sub = 0;var arr = [];var time = 0;//設定文字顏色,字型,大小,x和y座標var x = 0;var y = 50;var color = "red";var size = "20";var font = "宋體";//設制文字內容var tosplitFont = "I'm yorhom,這是個令文本逐字顯示的小程式";sub = 0; arr = tosplitFont.split('');var c = document.getElementById(canvasId);var ctx = c.getContext("2d");ctx.font = size+"px"+" "+font;ctx.fillStyle = color;ctx.clearRect(0,0,c.width,c.height);//迴圈輸出for(var i=0;i<arr.length;i++){setTimeout(function(){ctx.fillText(arr[sub],x,y);x += ctx.measureText(arr[sub]).width;sub += 1;},time);time += 100;}}</script></head><body onload="type()"><canvas width="500",height="300" id="mycanvas"></canvas></body></html>

這就是包括html和javascript的所有代碼,只有46行,看來不怎麼難。接下來我將講解 一下這些纖纖渣渣的代碼。

 

html裡的代碼不解釋,我們直接跳到javascript部分。看看type函數:

 

function type(){//畫布的idvar canvasId = "mycanvas";//用於輸出文字的變數var sub = 0;var arr = [];var time = 0;//設定文字顏色,字型,大小,x和y座標var x = 0;var y = 50;var color = "red";var size = "20";var font = "宋體";//設制文字內容var tosplitFont = "I'm yorhom,這是個令文本逐字顯示的小程式";sub = 0; arr = tosplitFont.split('');var c = document.getElementById(canvasId);var ctx = c.getContext("2d");ctx.font = size+"px"+" "+font;ctx.fillStyle = color;ctx.clearRect(0,0,c.width,c.height);//迴圈輸出for(var i=0;i<arr.length;i++){setTimeout(function(){ctx.fillText(arr[sub],x,y);x += ctx.measureText(arr[sub]).width;sub += 1;},time);time += 100;}}

在這裡,我解釋一下變數sub,time和arr。首先sub是遍曆數組的下標,也許你會說可以用控制迴圈的變數作為下標,其實我也試過,如果用控制迴圈的變數的來作下標,會出現錯誤。因為在javascript中的迴圈會先迴圈完,然後再慢慢執行裡的內容。所以如果你用控制迴圈的變數的來作下標,那麼輸出的就一直是最後一個。因此我設定了sub變數,讓它在迴圈內部增加,這樣即使迴圈裡最後慢慢執行,那也無妨。

 

arr是裝滿被分開的文字的數組,通過split方法賦值。如下:

 

arr = tosplitFont.split('');

split用法是沒遇見參數字元,就將這個字元前面的那一個加到數組中。我表述可能不大清楚,還是讓專業人士w3cschool為你解答吧: http://www.w3school.com.cn/js/jsref_split.asp

 

time是個控制等待時間的變數,因為setTimeout是在某一個時刻做某事,所以我們需要不斷改這個時刻。

接下來我們看輸出部分:

 

//迴圈輸出for(var i=0;i<arr.length;i++){setTimeout(function(){ctx.fillText(arr[sub],x,y);x += ctx.measureText(arr[sub]).width;sub += 1;},time);time += 100;}

首先我們先遍曆了上述的arr,接下來我們在裡面通過setTimeout在某個時刻輸出文字。

 

fillText是什嗎?我想我只能告訴你是html5中輸出文字的東東,看看專業人士的又一講解:http://www.w3school.com.cn/html5/canvas_filltext.asp

由於html5中如果不是一次性輸出文字,文字座標且不改變,那麼文字將疊在一起。所以我們只有改變座標,由於我們用變數x和y控制文字位置,所以我們只用改變x就能將文字移到它該去的位置。我首先想到了可以將x設定為當前字元傳的長度。

但怎麼才能算出這個字元傳的長度呢?我無意間看到了measureText方法,它可以取出當前字串的長度,所以我們就利用這個玩意兒算出上個字元長度,然後用x加上這個長度,就可以算出下一個文字該去的位置。measureText怎麼用呢,看看這裡吧:http://www.w3school.com.cn/html5/canvas_measuretext.asp

就這樣,逐字輸出就搞定了。

三,源碼下載

源碼在這裡:http://files.cnblogs.com/ducle/html5-%E8%BE%93%E5%87%BA%E6%96%87%E5%AD%97.rar

貼幾張demo圖,不想看代碼只想看效果的朋友可以看看:

今天是清明節,但由於這個節日太xx了,所以我就不祝大家清明節快樂了。

 

----------------------------------------------------------------

歡迎大家轉載我的文章。

轉載請註明:轉自Yorhom's Game Box

歡迎繼續關注我的部落格

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.