• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > Html5 Canvas Image的图文代码详解(二)

Html5 Canvas Image的图文代码详解(二)

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含Html5 ,Canvas ,Image等相关知识,匿名希望在学习及工作中可以帮助到您
上一篇,主要讲了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,刚好跟图

您可能想查找下面的文章:

  • HTML5的本地存储
  • Define charset for HTML5 Doctype
  • HTML5 canvas如何绘制动态径向渐变
  • 如何使用HTML5 Canvas绘制动态线性渐变
  • HTML5 canvas如何实现马赛克的淡入淡出效果(代码)
  • HTML5 canvas中如何绘制图像
  • 如何使用HTML5 canvas实现图像的马赛克
  • html5 canvas实现简单的双缓冲
  • HTML5 Canvas 图形组合是如何实现的?附代码
  • HTML5 figure标签是什么意思?HTML5 figure标签的使用方法详解

相关文章

  • 2018-12-03H5 Canvas API中drawImage(图像进行缩放或裁剪)的使用实例
  • 2018-12-03小强的HTML5移动开发之路(52)——jquerymobile中的触控交互
  • 2018-12-03postMessage实现跨域、跨窗口消息传递
  • 2018-12-03HTML5桌面通知提示功能的实现
  • 2018-12-03vue2.0使用swiper实现轮播广告
  • 2018-12-03html5 canvas有什么用?HTML5最新的canvas元素详解
  • 2017-08-06HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
  • 2017-08-06HTML5无刷新改变当前url的代码
  • 2018-12-03HTML5 表单验证失败的提示语问题
  • 2018-12-03基于HTML5 Canvas实现矢量工控风机叶轮旋转的示例代码

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • 实例讲解使用HTML5 Canvas绘制阴影效果的方法
    • html5新增的属性和废除的属性简要概述_html5教程技巧
    • html5新增的属性和废除的属性简要概述
    • HTML5拖拽的简单实例
    • html5模拟平抛运动(模拟小球平抛运动过程)
    • HTML5 离线应用之打造零请求、无流量网站的解决方法_html5教程技巧
    • 推荐3D翻牌效果特效(收藏)
    • 什么是应用程序缓存(Application Cache)?
    • 深入剖析HTML5 内联框架iFrame
    • HTML5 Canvas像素处理使用接口介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有