上一篇,主要讲了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",大家随便找一个比较大的图就可以;
快运行,看看效果吧!
Atas ialah kandungan terperinci Html5 Canvas Image的图文代码详解(二) . Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Amalan terbaik untuk kod H5 termasuk: 1. Gunakan pengisytiharan dan pengekodan watak yang betul; 2. Gunakan tag semantik; 3. Mengurangkan permintaan HTTP; 4. Gunakan pemuatan asynchronous; 5. Mengoptimumkan imej. Amalan ini dapat meningkatkan kecekapan, penyelenggaraan dan pengalaman pengguna halaman web.

Piawaian dan teknologi web telah berkembang dari HTML4, CSS2 dan JavaScript mudah setakat ini dan telah menjalani perkembangan yang ketara. 1) HTML5 memperkenalkan API seperti kanvas dan webstorage, yang meningkatkan kerumitan dan interaktiviti aplikasi web. 2) CSS3 menambah fungsi animasi dan peralihan untuk menjadikan halaman lebih berkesan. 3) JavaScript meningkatkan kecekapan pembangunan dan kebolehbacaan kod melalui sintaks moden node.js dan ES6, seperti fungsi anak panah dan kelas. Perubahan ini telah mempromosikan pembangunan pengoptimuman prestasi dan amalan terbaik aplikasi web.

H5 bukan sekadar singkatan HTML5, ia mewakili ekosistem teknologi pembangunan web moden yang lebih luas: 1. H5 termasuk HTML5, CSS3, JavaScript dan API dan Teknologi yang berkaitan; 2. Ia menyediakan pengalaman pengguna yang lebih kaya, interaktif dan lancar, dan boleh berjalan dengan lancar pada pelbagai peranti; 3. Menggunakan timbunan teknologi H5, anda boleh membuat laman web responsif dan fungsi interaktif yang kompleks.

H5 dan HTML5 merujuk kepada perkara yang sama, iaitu HTML5. HTML5 adalah versi kelima HTML, membawa ciri -ciri baru seperti tag semantik, sokongan multimedia, kanvas dan grafik, penyimpanan luar talian dan penyimpanan tempatan, meningkatkan ekspresi dan interaktiviti laman web.

H5referstohtml5, apivotaltechnologyinwebdevelopment.1) html5introducesnewelementsandapisforrich, dynamicwebapplications.2) itsupp ortsmultimediawithoutplugins, enhancusexperienceaceacrossdevices.3) SemantikelementsImproveContentstructureandseo.4) H5'srespo

Alat dan kerangka yang perlu dikuasai dalam pembangunan H5 termasuk Vue.js, React dan Webpack. 1.vue.js sesuai untuk membina antara muka pengguna dan menyokong pembangunan komponen. 2. Leact mengoptimumkan rendering halaman melalui DOM maya, sesuai untuk aplikasi yang kompleks. 3.WebPack digunakan untuk pembungkusan modul dan mengoptimumkan beban sumber.

Html5hassignificlylylectransformedwebdevelopmentbyintroducingsemanticelements, enhancingmultimediasupport, andimprovingperformance.1) itmadewebebsitesmoreaccessibleandseo-friendlywithSemhyViVeShive, dan

H5 meningkatkan kebolehaksesan laman web dan kesan SEO melalui unsur -unsur semantik dan atribut ARIA. 1. Gunakan, dan lain -lain untuk mengatur struktur kandungan dan meningkatkan SEO. 2. Atribut Aria seperti ARIA-Label meningkatkan kebolehcapaian, dan pengguna teknologi bantuan boleh menggunakan laman web dengan lancar.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

MantisBT
Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

Penyesuai Pelayan SAP NetWeaver untuk Eclipse
Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular