上一篇,主要讲了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!

Tag H5 dalam HTML adalah tajuk peringkat kelima yang digunakan untuk menandakan tajuk atau sub-tajuk yang lebih kecil. 1) Tag H5 membantu memperbaiki hierarki kandungan dan meningkatkan kebolehbacaan dan SEO. 2) Digabungkan dengan CSS, anda boleh menyesuaikan gaya untuk meningkatkan kesan visual. 3) Gunakan tag H5 dengan munasabah untuk mengelakkan penyalahgunaan dan memastikan struktur kandungan logik.

Kaedah membina laman web di HTML5 termasuk: 1. Gunakan tag semantik untuk menentukan struktur laman web, seperti, dan sebagainya; 2. Kandungan Multimedia, Penggunaan dan Tag Multimedia; 3. Memohon fungsi lanjutan seperti pengesahan bentuk dan penyimpanan tempatan. Melalui langkah -langkah ini, anda boleh membuat laman web moden dengan struktur yang jelas dan ciri -ciri yang kaya.

Struktur kod H5 yang munasabah membolehkan halaman menonjol di antara banyak kandungan. 1) Gunakan label semantik seperti, dan lain -lain untuk mengatur kandungan untuk menjadikan struktur jelas. 2) Kawal kesan rendering halaman pada peranti yang berbeza melalui susun atur CSS seperti Flexbox atau Grid. 3) Melaksanakan reka bentuk responsif untuk memastikan halaman menyesuaikan diri dengan saiz skrin yang berbeza.

Perbezaan utama antara HTML5 (H5) dan versi lama HTML termasuk: 1) H5 memperkenalkan tag semantik, 2) menyokong kandungan multimedia, dan 3) menyediakan fungsi penyimpanan luar talian. H5 meningkatkan fungsi dan ekspresi laman web melalui tag dan API baru, seperti dan tag, meningkatkan pengalaman pengguna dan kesan SEO, tetapi perlu memberi perhatian kepada isu keserasian.

Perbezaan antara H5 dan HTML5 ialah: 1) HTML5 adalah standard halaman web yang mentakrifkan struktur dan kandungan; 2) H5 adalah aplikasi web mudah alih berdasarkan HTML5, sesuai untuk pembangunan dan pemasaran pesat.

Ciri -ciri teras HTML5 termasuk tag semantik, sokongan multimedia, peningkatan bentuk, penyimpanan luar talian dan penyimpanan tempatan. 1. Tag semantik seperti, meningkatkan kebolehbacaan kod dan kesan SEO. 2. Sokongan multimedia memudahkan proses membenamkan kandungan media melalui dan tag. 3. Peningkatan bentuk memperkenalkan jenis input dan sifat pengesahan baru, memudahkan pembangunan bentuk. 4. Storan luar talian dan penyimpanan tempatan meningkatkan prestasi laman web dan pengalaman pengguna melalui ApplicationCache dan LocalStorage.

Htmltml5isamAjreisionoftheHtHtStistHatreSVolutionizSSWebelopmentBelBelBelBelByanceteranceteranceteranceteranc.1) itenhancescodeRabilabilabilabilabilabiletewIkSiKikiiKikiiKikiSikiKikiiSiki

Petua lanjutan untuk H5 termasuk: 1. Gunakan grafik kompleks untuk menarik, 2. Gunakan pekerja web untuk meningkatkan prestasi, 3. Meningkatkan pengalaman pengguna melalui WebStorage, 4. Melaksanakan reka bentuk responsif, 5. Gunakan WebRTC untuk mencapai komunikasi masa nyata, 6 Melaksanakan pengoptimuman prestasi dan amalan terbaik. Petua ini membantu pemaju membina aplikasi web yang lebih dinamik, interaktif dan cekap.


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

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Pelayar Peperiksaan Selamat
Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

PhpStorm versi Mac
Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

SublimeText3 versi Inggeris
Disyorkan: Versi Win, menyokong gesaan kod!
