Canvas系列学习之起始篇

简介:

html5里面最让人心动的技术,对我来说,canvas绝对是首选,它没出现之前,一切网页相关的游戏动画非flash莫属.

canvas来临时,是时候用用新鲜的血液了.


Canvas入门

canvas的本质就是提供了一套前端可用的gui接口,包括画线,画方,画圆,画字等常用的gui功能,先来看看在浏览器端的引用

<canvas id="canvas" width=500 heigth=400></canvas>

这里要说下,canvas有元素大小与绘图大小之分,默认的绘图大小是300*150,假如不直接添加width,height时,启用默认值,假如在css样式表里设置width,height时,会造成意想不到的效果,因为canvas绘图承认的大小是它的绘图大小,跟元素本身大小关系不大,所以建议直接在html的元素标签上直接写上宽高,css样式表里不要设置宽高.

然后所有的绘图操作其实都是在canvas的绘图上下文中进行的,方法是调用canvas实例的getContext方法

    var canvas = document.querySelector('#canvas');
    var context = canvas.getContext('2d');

以后基本上所有的绘画操作都在context上面进行

今天的任务是实现一个精灵图片的鼠标定位功能,效果图如下:

精灵图片的鼠标定位

先说下这里要用到的几个功能点

  • 绘制背景网格线
  • 绘制精灵图片
  • 绘制参考线
  • 定义鼠标事件

先来说说绘制背景网格线

网格线是横竖两方向铺满的,原理就是不断的在两方向上画线,保证线之前的间距,直到画满为止,先上一个画一条线的例子

// 设置描边的样式
context.strokeStyle = "#ccc";
// 设置绘制线的宽度
context.lineWidth = 0.5;
// 开始进入画线状态
context.beginPath();
// 移到起始点
context.moveTo(50, 50);
// 连到终点
context.lineTo(100, 100);
// 开始描边
context.stroke();

上面的代码就是画线的最基本实现,下面我们来看一个完整的实现背景网格的功能.

// 画背景线
function drawBackground(){
    var SPACE = 15,
        i = canvas.height,
        j = canvas.width;
    context.clearRect(0, 0, canvas.width, canvas.height);
    context.strokeStyle = 'lightgray';
    context.lineWidth = 0.5;
    while(i >= SPACE){
        context.beginPath();
        context.moveTo(0, i);
        context.lineTo(canvas.width, i);
        context.stroke();
        i -= SPACE;
    }
    while(j >= SPACE){
        context.beginPath();
        context.moveTo(j, 0);
        context.lineTo(j, canvas.height);
        context.stroke();
        j -= SPACE;
    }
}

然后我们来绘制精灵图片

使用drawImage方法可以画一个图片到绘图上下文中去,这里的图片资源点击这里获取,下载

// 画精灵图
function drawImg(){
    context.drawImage(img, 0, 0);
}

var img = new Image();
img.src = 'img/running-sprite-sheet.png';
img.onload = function(){
    drawImg();
};

然后实时的根据鼠标位置来画参考线

关于坐标,这里要说下,默认事件参数里的坐标是相对于文档的,所以在canvas里画坐标的话,需要转换一下,这里给出转换的代码

// 切换网页坐标为canvas坐标
function windowToCanvas(x, y){
    var bbox = canvas.getBoundingClientRect();
    return {
        x: x - bbox.left * (canvas.width / bbox.width),
        y: y - bbox.top * (canvas.height / bbox.height)
    }
}

然后我们来根据当前坐标画两条互相垂直的参考线,代码如下:

// 画垂直线
function drawVertical(x){
    context.beginPath();
    context.moveTo(x + 0.5, 0);
    context.lineTo(x + 0.5, canvas.height);
    context.stroke();
}

// 画水平线
function drawHorizontal(y){
    context.beginPath();
    context.moveTo(0, y + 0.5);
    context.lineTo(canvas.width, y + 0.5);
    context.stroke();
}

// 画定位网格
function drawGuidelines(x, y){
    context.strokeStyle = 'rgba(0, 230, 0, .8)';
    context.lineWidth = 0.5;
    drawVertical(x);
    drawHorizontal(y);
}

上面就是定义一个水平和垂直的绘制方法然后定义一个总的方法来一起调用.

最后我们来定义我们的事件

这里定义canvasmousemove事件,然后利用事件参数里的坐标信息实时的调用上面的绘制方法

canvas.onmousemove = function(e){
    var loc = windowToCanvas(e.clientX, e.clientY);
    drawBackground();
    drawImg();
    drawGuidelines(loc.x, loc.y);
    updatePrint(loc.x, loc.y);
}

其实canvas的绘图流程大概都分下面几步

  • 设置描边,填充的样式信息
  • 设置路径信息
  • 开始描边或者填充

总结

canvas是一个比较好玩的技术,只要你有想像力,就可以画出任何东西出来,这个系列将会全面的讲解它的用法,尽请期待.


目录
相关文章
|
22天前
|
存储 缓存 Java
Android开发之利用GL10描绘点、线、面
本文介绍了如何使用GL10进行三维图形绘制。首先,每个点由三个浮点数(x, y, z)表示,数组大小为顶点数的三倍来构建平面。接着,通过`FloatBuffer`将浮点数组转换为OpenGL可识别的格式。绘制图形时,需启用和禁用顶点开关,并调用`glVertexPointer`指定顶点坐标和`glDrawArrays`绘制点、线、面。文中展示了绘制立方体线框的代码,包括顶点数组转换、立方体各面的定义以及绘制方法。最后,提到了球体的绘制概念。
8 1
Android开发之利用GL10描绘点、线、面
|
4月前
|
XML 算法 Java
Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
29 0
|
4月前
|
vr&ar
visionOS空间计算实战开发教程Day 11 标题动画
本文我们要在visionOS内实现一个标题输出的动画效果。主要讲ViewModifier协议,修饰符(modifier)应用于视图或另一个视图修饰符,生成原值的另一个版本。在希望创建一个可应用于不同视图的修饰符时可实现ViewModifier协议。
15 0
|
5月前
《QT从基础到进阶·十七》QCursor鼠标的不同位置坐标获取
《QT从基础到进阶·十七》QCursor鼠标的不同位置坐标获取
60 0
|
7月前
|
前端开发 开发者
|
11月前
|
开发工具 开发者 容器
彻底理解游戏开发中的绝对位置和相对位置
在游戏的世界中存在着两种位置,一种叫做绝对位置,一种叫做相对位置。在不同的游戏开发工具中这两种位置分别有着不同的别名,绝对位置有时也叫世界位置,或者 world position,而相对位置也叫本地位置(局部位置),或者 local position。
66 0
|
11月前
|
小程序 开发工具 开发者
理解游戏开发中的绝对位置和相对位置
本文主要内容带你彻底理解游戏开发中的绝对位置和相对位置的区别。 如果你没有任何的游戏开发经验,欢迎观看我的“人人都能做游戏”系列视频教程,它会手把手的教你做出自己的第一个小游戏。 开始之前,推荐一下我的视频号,每天分享一点儿与做游戏有关的有用有趣的内容,欢迎大家关注一下。本文的内容主要也是对这期视频内容的应用和解释。
86 0
|
12月前
|
JavaScript API 容器
彻底弄懂元素样式、位置、大小相关计算
在我们日常开发中偶尔会碰到获取元素样式、设置某元素样式、计算元素位置、计算滚动距离等需求。但是js中关于元素位置、样式、大小的api种类繁多,稍不留神就会搞不清楚。今天笔者就带你彻底弄清楚,让你在这类问题上不再迷茫。
158 0
|
前端开发 JavaScript
教你如何用Canvas绘制整身的哆啦A梦
教你如何用Canvas绘制整身的哆啦A梦 上牌你文章我们说到了如何使用canvas绘制哆啦A梦,但当时只是绘制了哆啦A梦的头部,之后有学员留言说可不可以教大家绘制整身的哆啦A梦,想了想,决定安排一下。如图: 在这里插入图片描述 HTML代码: &lt;canvas id=&quot;my_canvas&quot;&gt;&lt;/canvas&gt; &lt;canvas id=&quot;my_canvas2&quot;&gt;&lt;/canvas&gt; 1 2 CSS代码: * { margin: 0; } #my_canvas {
教你如何用Canvas绘制整身的哆啦A梦
|
iOS开发
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
120 0
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)