原來以為象戰車大戰、超級瑪莉之類的小遊戲,開始畫面裡面的磚塊字是靜態圖片,現在才知道原來都是動態貼圖貼出來的,下面用HTML5 的繪圖功能,咱也太做一個坦克大決戰的開始畫面,順便研究一下點陣字。
一、點陣字
貼圖其實和點陣字沒有太大差別,唯一的差別就是把點用小圖片代替了而已,下面是一個點陣字的小程序,你可以輸入漢字或英文字母,然後程式就會分析並產生文字的點陣,然後把它顯示出來。至於怎麼分析並產生點陣,想法如下:
1、將文字用ctx.fillText 方法畫到一塊記憶體畫布上,前景色為黑,背景色為白
##2、讀取畫布的每一個像素,並用對應的符號代替,組成這裡有一個問題,記憶體畫布應該多大?我的解決方法是,盡可能大,保證無論什麼字體都不會出界。 在分析完像素的過程中,同時可以記錄下文字的寬度和高度,等分析完成以後,再一次產生一塊新的畫布,這次可以和文字大小更好相等。 還有一個問題就是文字太小的時候,字體就有點失真,這應該就是一個分辨率的問題,小字體人的肉眼看不清的,程式一樣也分析不清楚。 所以小尺寸的字體需要經過專門的設計,就像坦克大戰上的字體。二、磚塊字
知道了點陣子的原理,實作磚塊字就很簡單了,這裡是一副資源圖片,磚塊就是從裡面截取的: 磚塊很小,在圖片的中間靠右下方,我們玩的坦克大戰遊戲裡面每一關的下面是磚塊字的點陣數據,這裡只有一部分,剛好組成遊戲開機畫面裡面的:BATTLE CITY 與遊戲結束畫面裡面的三、程式碼
因為時間比較緊張,程式碼寫的比較醜,程式碼裡面用到了一個jsgame.js,這是我自己對HTML5 2D 功能進行了一個簡單的包裝,模仿了pygame 的部分介面樣式。 經過封裝以後,可以看出來,繪圖相關的程式碼就非常簡單了,其他主要都是運算邏輯程式碼。
代码 Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript" language="javascript" src="jsgame.js"></script> </head> <body> <canvas id="html5_08_1" width="180" height="180" style=" background-color: black"> 你的浏览器不支持 Canvas 标签,请使用 Chrome 浏览器 或者 FireFox 浏览器 </canvas> 文本:<input type="text" id="text" value="博客园" /> 字号:<input type="text" id="size" value="16" size="2" /> 字体:<select id="fontName"> <option>宋体</option> <option>楷体_GB2312</option> <option>隶书</option> <option>Kristen ITC</option> <option>Harrington</option> </select> <input type="checkbox" id="ckBold" />黑体 <input type="checkbox" id="ckitalic" />斜体 <input type="button" id="btnStart" disabled value="处理" onclick="draw_pixel_text()" /> <br/><textarea wrap="off" rows="20" cols="120" id="txtResult" ></textarea> <p/> <img alt="坦克大战的资源图片" src="http://images.cnblogs.com/cnblogs_com/myqiao/sprites.gif"/><br/> <canvas id="html5_08_2" width="480" height="200" style=" background-color: black"> 你的浏览器不支持 Canvas 标签,请使用 Chrome 浏览器 或者 FireFox 浏览器 </canvas><br/> <input type="button" id="btn_draw" value="绘制砖块字" onclick="draw_brick_text()" /> <script type="text/javascript"> draw_pixel_text(); function draw_pixel_text(){ var display= Display.attach(document.getElementById("html5_08_1")); document.getElementById("btnStart").setAttribute("disabled","true"); document.getElementById("txtResult").value=""; display.clear(); var text=document.getElementById("text").value var size=document.getElementById("size").value var font=new Font(); font.bold=document.getElementById("ckBold").checked; font.italic=document.getElementById("ckitalic").checked; font.name=document.getElementById("fontName").value; var sur=font.render(text,size); display.draw(sur,10,10); var str=''; for(var y=0;y<sur.height;y++){ for(var x=0;x<sur.width;x++){ if((sur.get_pixel(x,y)[0]<255)) str=str+'龍'; else str=str+' '; } str=str+'\n'; } document.getElementById("txtResult").value=str; document.getElementById("btnStart").removeAttribute("disabled"); } ///====================================================================== ///下面的代码是绘制砖块字 //截断字符,每 7 个一组 function chunk(str,len){ var count=0; var list=[]; var temp=[]; var times=0; for(var i=0;i<str.length;i++){ if(count<len){ temp.push(str[i]) count++; }else{ count=0; list[times]=temp; temp=[]; temp.push(str[i]) count++; times++; } } list[times]=temp; return list; } //字母和对应的点阵数据 var keys="abcegilmortvy"; var values=["0011100011011011000111100011111111111000111100011", "1111110110001111000111111110110001111000111111110", "0011110011001111000001100000110000001100110011110", "1111110110000011000001111100110000011000001111110", "0011111011000011000001100111110001101100110011111", "1111110001100000110000011000001100000110001111110", "1100000110000011000001100000110000011000001111110", "1100011111011111111111111111110101111000111100011", "0111110110001111000111100011110001111000110111110", "1111110110001111000111100111111110011011101100111", "1111110001100000110000011000001100000110000011000", "1100011110001111000111110111011111000111000001000", "1100110110011011001100111100001100000110000011000"]; var game2=new JsGame(); //载入图片 var img=new Image(); img.src="data:image/gif;base64,......";//省略四个字节 var bricks=[]; img.onload=function(){ //图片载入后,将砖块的部分从中间截取出来,并分为四小部分 var temp= new Surface(img).subsurface(56,64,8,8) bricks[0]=temp.subsurface(0,0,4,4) bricks[1]=temp.subsurface(4,0,4,4) bricks[2]=temp.subsurface(0,4,4,4) bricks[3]=temp.subsurface(4,4,4,4) } //检测资源是否装载完毕 game2.is_ready(function(){ return img.complete }); //开始绘制 function draw_brick_text(){ //如果正在绘制,则停止 game2.stop() //绑定画布 var display= new Display.attach(document.getElementById("html5_08_2")); //清空画布 display.clear(); //要绘制的字符串 var text='BATTLECITY'.toLowerCase(); //将每个字符的点阵数据截成 7 段,即每个字符都是 7*7 的点阵,方便绘制 var alph_bits=[]; for(var i=0;i<text.length;i++) for(var index=0;index<keys.length;index++) if(keys[index]==text[i]) alph_bits.push(chunk(values[index],7)); var which=0; var p_row=0; var p_col=0; var surface= new Surface(28,28); game2.loop(function(){ if(alph_bits[which][p_row][p_col]==1){ var temp=null; if((p_row%2)==0){ if((p_col%2)==0) temp=bricks[0]; else temp=bricks[1]; } else{ if((p_col%2)==0) temp=bricks[2]; else temp=bricks[3]; } surface.draw(temp,p_col*4,p_row*4) display.save() display.scale(2,2) if(which<6) display.draw(temp,which*32+p_col*4+20,p_row*4+20); else display.draw(temp,(which-5)*32+p_col*4+20,p_row*4+56); display.restore() } p_col++ if((p_col%7)==0){ p_col=0 p_row++ if((p_row%7)==0){ p_row=0; p_col=0; which++; if(which==text.length) game2.stop() } } }) } </script> </body> </html>
#
以上是HTML5邊玩邊學(八)-磚塊貼圖點陣字的詳細內容。更多資訊請關注PHP中文網其他相關文章!