Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterung des Grafikcodes von Html5 Canvas Image (2)

Detaillierte Erläuterung des Grafikcodes von Html5 Canvas Image (2)

黄舟
黄舟Original
2017-03-28 15:45:481437Durchsuche

Im vorherigen Artikel ging es hauptsächlich um die grundlegende Bild-API, die von canvas bereitgestellt wird;

In diesem Artikel verwenden wir Canvas Bereitgestellte Bild-API und Transformation, um einige Beispiele zu realisieren: einfache Bewegung des Autos, einfaches Spiel Karte , Bildübersetzung und Zoom

, verwendet in den folgenden Anwendungen Bild:

图片1:tanks--[32*32]*8--tanks.png 图片2:map--[32*32]*4--map.png

Bild 1: Tanks- -[32 *32]*8--tanks.png
Bild 2: map--[32*32]*4--map.png


Unsere Position auf Leinwand (50,50) Anleitung das erste Achtel der Tanks (den ersten Tank) anzeigen? Wir verwenden einen Teil der Bild-API;

context.drawImage(tanks,0,0,32,32,50,50,32,32);

Wie drehe ich den aktuellen Tank um 90 Grad?

Der Rotationsvorgang in Canvas ist derselbe, unabhängig davon, ob es sich um eine Form, einen Text oder ein Bild handelt.

Erstens Alles in allem müssen Sie den aktuellen Zustand der Leinwand auf den Stapel verschieben: context.save();

und dann die Transformation starten: context.setTransform(1, 0,0,1,0 ,0);

Wir möchten den Tank selbst als Mittelpunkt um 90 Grad drehen, daher müssen wir den Ursprung in die Mitte des Tanks verschieben ;

Die Position (x, y) des Tanks ist (50, 50) und die Größe (b, h) ist (32, 32); (x+w/2, y+h/2);

Übersetzungsursprung: context.translate(50 + 16, 50 + 16);

Rotation: context.rotate(90*Math.PI /180);

Hinweis: Ursprünglich sollte das Bild an der (50,50)-Position von gezeichnet werden die Leinwand. Nachdem der Ursprung übersetzt wurde, wurden die Positionskoordinaten zu (-16,-16);

Zeichne ein Bild: 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(&#39;load&#39;, 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>

Animation der Raddrehung

Tanks Es gibt insgesamt 8 Tanks, jede Bildgröße ist (32,32 );

Was wäre, wenn wir den zweiten Tank an der Position (50, 50)?

Der 2.: context.drawImage(tanks, 32*(2-1), 0, 32, 32, -16, -16, 32, 32);

Der Dritte: context.drawImage(tanks, 32*(3-1), 0, 32, 32, -16, -16, 32, 32);

Und so weiter, der 8.: context.drawImage(tanks, 32*(8-1), 0, 32, 32, -16, -16, 32, 32);

Der Unterschied zwischen den einzelnen Panzerbildern liegt in ihrem Radteil. Wenn wir einen Timer 100 ms verwenden, um diese 1 bis 8 Panzerbilder nacheinander anzuzeigen, sehen wir eine Animation der Panzerraddrehung.

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(&#39;load&#39;, 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>

Der horizontale Bewegungseffekt des Panzers ist einfach zu implementieren. Ändern Sie einfach jedes Mal jedes Bild der Animation und die angezeigte x-Position Das Tankbild ist in Ordnung;

fcuntion drawScreen(){x=x+1;…………}​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ ! !

Wir definieren eine 320*320 große Leinwand und verwenden eine Bildkarte, um eine einfache Spielkarte zu zeichnen; 🎜>Die Bildkarte enthält vier kleine Bilder, die alle 32*32 groß sind: Haupthintergrund, Hindernisse, obere und untere Steine, linke und rechte Steine; Alles, Wir unterteilen die Leinwand in 10 * 10 kleine Gitter, und die Größe jedes kleinen Gitters beträgt 32 * 32, was genau der Größe des Bildes entspricht

Dann definieren wir Ein Zweidimensionales Array wird verwendet, um den Index des anzuzeigenden Bildes in jedem kleinen Raster zu speichern

und dann wird eine zweischichtige Schleife verwendet Zeichnen Sie das Bild und die Karte erscheint.

Schauen Sie sich zuerst die Darstellungen an:

vor dem Teilen einer Bild-API-Anwendung:

图像的平移缩放

<!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(&#39;load&#39;, 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",大家随便找一个比较大的图就可以;

快运行,看看效果吧!

 

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Grafikcodes von Html5 Canvas Image (2). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn