上一篇,主要講了canvas提供的基本的Image API;
本篇我們使用canvas提供的Image Api及變換,來實現一些實例:小車的簡單運動、簡單遊戲地圖、圖像的平移縮放;
以下應用程式中所使用到的圖片:
圖片1:tanks--[32*32]*8--tanks.png | 圖片2:map--[32*32]*4--map.png |
#我們在Canvas上(50,50)的位置上顯示tanks的前1/8部分(第一個tank),如何做呢?我們用part of image api;
context.drawImage(tanks,0,0,32,32,50,50,32,32);
如果要讓目前的tank旋轉90度如何實現呢?
Canvas中旋轉操作不管是針對shape、text還是image都是一樣的;
首先,要把canvas的current state壓入堆疊:context.save();
然後啟動變換:context.setTransform(1,0,0,1,0 ,0);
我們要以tank自己為中心旋轉90度,所以,要把原點平移到tank的中心;
tank的位置(x,y)是(50,50),大小size(w,h)是(32,32);所以它的中心點為(x+w/2,y+h/2);
平移原點:context.translate(50 + 16, 50 + 16);
旋轉:context.rotate(90*Math.PI /180);
且記:本來是要在canvas的(50,50)位置繪製圖片,平移原點後,該位置座標就變成(-16,-16 );
繪製圖片:context.drawImage(tanks, 0, 0, 32, 32, -16, -16, 32, 32);
#图片旋转---完整代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Images</title> <script type="text/javascript" src="../script/modernizr-latest.js"></script> <script type="text/javascript"> window.addEventListener("load", eventWindowLoaded, false); function eventWindowLoaded() { canvasApp(); } function canvasSupport() { return Modernizr.canvas; } function canvasApp() { if(!canvasSupport()) { return; } var theCanvas = document.getElementById("canvasOne"); var context = theCanvas.getContext("2d"); var tanks = new Image(); tanks.addEventListener('load', eventLoaded, false); tanks.src = "tanks.png"; var x = 50; var y = 50; function eventLoaded() { drawScreen(); } function drawScreen() { context.fillStyle = "#aaaaaa"; context.fillRect(0, 0, 500, 500); context.save(); context.setTransform(1, 0, 0, 1, 0, 0) context.translate(x + 16, y + 16); var angleInRadians = 90 * Math.PI / 180; context.rotate(angleInRadians); context.drawImage(tanks, 0, 0, 32, 32, -16, -16, 32, 32); context.restore(); } } </script> </head> <body> <div style="position: absolute; top: 50px; left: 50px;"> <canvas id="canvasOne" width="500" height="500"> Your browser does not support HTML5 Canvas. </canvas> </div> </body> </html>
輪子轉動動畫
#tanks一共有8個tank,每個圖片大小為(32,32);
如果我們要在(50,50)的位置上顯示第2個tank,如果要做呢?
第2個:context.drawImage(tanks, 32*(2-1), 0, 32, 32, -16, -16, 32, 32);
第3個:context.drawImage(tanks, 32*(3-1), 0, 32, 32, -16, -16, 32, 32);
#依序類別推,第8個:context.drawImage(tanks, 32*(8-1), 0, 32, 32, -16, -16, 32, 32);
每個tank圖片的不同之處,就在於其輪子部位,如果我們用定時器100ms來輪流顯示這1到8個tank圖片,就會看到一個tank輪子轉動動畫;
tank轮子转动动画--完整代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Images</title> <script type="text/javascript" src="../script/modernizr-latest.js"></script> <script type="text/javascript"> window.addEventListener("load", eventWindowLoaded, false); function eventWindowLoaded() { canvasApp(); } function canvasSupport() { return Modernizr.canvas; } function canvasApp() { if(!canvasSupport()) { return; } var theCanvas = document.getElementById("canvasOne"); var context = theCanvas.getContext("2d"); var tanks = new Image(); tanks.addEventListener('load', eventLoaded, false); tanks.src = "tanks.png"; //控制取第几个tank var animationFrames = [0,1,2,3,4,5,6,7]; var frameIndex = 0;//当前动画帧 //tank的显示位置 var x = 50; var y = 50; function eventLoaded() { startUp(); } function drawScreen() { context.fillStyle = "#aaaaaa"; context.fillRect(0, 0, 500, 500); context.save(); context.setTransform(1, 0, 0, 1, 0, 0) context.translate(x + 16, y + 16); var angleInRadians = 90 * Math.PI / 180; context.rotate(angleInRadians); var sourceX = animationFrames[frameIndex] * 32;//每次取图片的X位置 context.drawImage(tanks, sourceX, 0, 32, 32, -16, -16, 32, 32); context.restore(); frameIndex++; //循环动画控制 if(frameIndex == animationFrames.length) { frameIndex = 0; } } //计时器 function startUp() { setInterval(drawScreen, 100); } } </script> </head> <body> <div style="position: absolute; top: 50px; left: 50px;"> <canvas id="canvasOne" width="500" height="500"> Your browser does not support HTML5 Canvas. </canvas> </div> </body> </html>
tank的水平移動效果實現起來就易如反掌啦,只要每次改變每一幀動畫中, tank圖片的顯示的x位置就ok;
fcuntion drawScreen(){x=x+1;…………} 大家運行,看看效果! ! !
我們定義一個320*320大小的Canvas,用圖片map來繪製一個簡單的遊戲地圖;
圖片map共有四副小圖,皆是32*32:主背景、障礙、頂部底部磚塊、左邊右邊磚塊;
首先,我們把Canvas分成10*10的小格子,每個小格子的大小分別是32*32,剛好跟圖片大小相同;
然後我們來定義一個二維數組來存放每一個小格子所要顯示的圖片的索引;
再用一個二層循環繪製圖片,地圖出來了;
先看看效果圖:
#
简单的游戏地图--完整代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Images</title> <script type="text/javascript" src="../script/modernizr-latest.js"></script> <script type="text/javascript"> window.addEventListener("load", eventWindowLoaded, false); function eventWindowLoaded() { canvasApp(); } function canvasSupport() { return Modernizr.canvas; } function canvasApp() { if(!canvasSupport()) { return; } var theCanvas = document.getElementById("canvasOne"); var context = theCanvas.getContext("2d"); var tileSheet = new Image(); tileSheet.addEventListener('load', eventLoaded, false); tileSheet.src = "map.png"; var mapRows = 10; var mapCols = 10; var Map = [ [3, 2, 2, 2, 0, 2, 2, 2, 2, 3], [0,0,0,0,0,0,0,0,0, 0], [3,0, 1,0, 1,0, 1,0,0, 3], [3, 1,0,0, 1,0,0, 1,0, 3], [3,0,0,0, 1, 1,0, 1,0, 3], [3,0,0, 1,0,0,0, 1,0, 3], [3,0,0,0,0,0,0, 1,0, 3], [0,0, 1,0, 1,0, 1,0,0, 0], [3,0,0,0,0,0,0,0,0, 3], [3, 2, 2, 2,0, 2, 2, 2, 2, 3] ]; function eventLoaded() { drawScreen() } function drawScreen() { for(var rowCtr = 0; rowCtr < mapRows; rowCtr++) { for(var colCtr = 0; colCtr < mapCols; colCtr++) { var cur = Map[rowCtr][colCtr]; var sourceX = cur * 32; context.drawImage(tileSheet, sourceX, 0, 32, 32, colCtr * 32, rowCtr * 32, 32, 32); } } } } </script> </head> <body> <div style="position: absolute; top: 50px; left: 50px;"> <canvas id="canvasOne" width="320" height="320"> Your browser does not support HTML5 Canvas. </canvas> </div> </body> </html>
再分享一個Image Api的應用:
#图像的平移缩放 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Pan</title> <script type="text/javascript" src="../script/modernizr-latest.js"></script> <script type="text/javascript"> window.addEventListener("load", eventWindowLoaded, false); function eventWindowLoaded() { canvasApp(); } function canvasSupport() { return Modernizr.canvas; } function canvasApp() { if(!canvasSupport()) { return; } var theCanvas = document.getElementById("canvasOne"); var context = theCanvas.getContext("2d"); var panImg = new Image(); panImg.addEventListener('load', eventPhotoLoaded, false); panImg.src = "pan.jpg"; var windowWidth = 500; var windowHeight = 500; var windowX = 0; var windowY = 0; var currentScale = 1; var minScale = .2 var maxScale = 3; var scaleIncrement = 0.1; function eventPhotoLoaded() { startUp(); } function drawScreen() { context.fillStyle = "#ffffff"; context.fillRect(0, 0, 500, 500); context.drawImage(panImg, windowX, windowY, windowWidth, windowHeight, 0, 0, windowWidth * currentScale, windowHeight * currentScale); } function startUp() { setInterval(drawScreen, 100); } document.onkeydown = function(e) { e = e ? e : window.event; switch (e.keyCode) { case 38: //up windowY -= 10; if(windowY < 0) { windowY = 0; } break; case 40: //down windowY += 10; if(windowY > photo.height - windowHeight) { windowY = photo.height - windowHeight; } break; case 37: //left windowX -= 10; if(windowX < 0) { windowX = 0; } break; case 39: //right windowX += 10; if(windowX > photo.width - windowWidth) { windowX = photo.width - windowWidth; } break; case 109: //- currentScale -= scaleIncrement; if(currentScale < minScale) { currentScale = minScale; } break; case 107: //+ currentScale += scaleIncrement; if(currentScale > maxScale) { currentScale = maxScale; } } } } </script> </head> <body> <div style="position: absolute; top: 50px; left: 50px; padding:5px solid #000000"> <canvas id="canvasOne" width="500" height="500"> Your browser does not support HTML5 Canvas. </canvas> </div> </body> </html>
该代码中,有一个图片"pan.jpg",大家随便找一个比较大的图就可以;
快运行,看看效果吧!
以上是Html5 Canvas Image的圖文程式碼詳解(二)的詳細內容。更多資訊請關注PHP中文網其他相關文章!