最近在学习《HTML5 Canvas游戏开发实战》这本书,现整理一下,以便后面翻出来复习。
基本图形
圆角矩形
先贴出代码和运行效果
运行效果如下图:
下面来解释一下代码:Canvas里没有直接画圆角矩形的API,但是可以用arcTo函数来完成圆角的绘制,然后结合直线绘制,就可以完成圆角矩形的绘制了。arcTo函数是用来为当前的子路径添加一条圆弧的,它需要5个参数,分别是:点p1的坐标x和y、点p2的坐标x和y、圆弧的半径。该圆弧有一点与当前位置到p1的线段相切,还有一点和从p1到p2的线段相切。这两个切点就是圆弧的起点和终点,圆弧绘制的方向就是连接这两个点的最短圆弧方向。
擦除Canvas画板
擦除Canvas画板上的内容需要用到clearRect函数,此函数可以擦除一个矩形区域。它需要四个参数:起点的坐标x和y,擦除区域的长和宽。代码如下:
上述代码是先绘制了一个红色的实心矩形,然后在红色矩形内擦除了一个50*50的小正方形,运行效果如下图所示:
绘制复杂图形
画曲线
#####二次贝塞尔曲线
二次贝塞尔曲线有一个控制点。在Canvas中用quadraticCurveTo(cpx,cpy,x,y)函数来绘制二次贝塞尔曲线,cpx、cpy表示控制点的坐标;x、y表示终点坐标。其代码如下:
效果图如下:
利用clip在指定区域绘图
clip函数使用当前路径作为连续绘制操作的剪切区域。我们可以把它看作一扇窗户,无论在画板上绘制了多大的图形,最后看到的图形都只能由clip这个窗户来决定。
代码如下:
效果图如下:
可以看到,虽然我们画了一个矩形,但是最后显示的却是一个半圆。这是因为我们我们首先画了一个半圆,然后clip函数将当前的这个半圈作为绘制操作的区域,所以之后画的图形只能显示在这个区域内。
绘制文本
绘制文字
绘制文字有fillText和strokeText两种方法。
1、使用fillText绘制文字
fillText(text,x,y,maxWidth)函数很简单,它有四个参数:文本字符串、坐标x和y,文本宽度,其中第四个参数可以略去。实例代码如下:
运行效果如下图所示:
2、使用strokeText绘制文字
使用strokeText(text,x,y,maxWidth)函数同样需要4个参数,它的用法和fillText函数用法完全相同,具体代码如下:
效果图如下:
从效果图上我们可以看出strokeText与fillText的区别是,strokeText相当于是线,而fillText相当于实心图形。
文字设置
1、文字大小与字体
上面的代码中用到了ctx.font = "30px Arial";
它设置了字体大小为“30px”,字体为“Arial”。
我们可以设定多种不同的字体、大小,代码如下:
效果图如下:
2、文字粗体与斜体
同样可以通过font来设置文字粗体和斜体,如粗体:ctx.font = 'normal 30px Arial';
font-weight可以是normal、bold、bolder、lighter,还可以通过数字直接设置,如ctx.font = '300 30px Arial';
。斜体可以这样设置:ctx.font = 'italic 30px Arial';
。效果图就不一一展示了。
3、文字的对齐方式
Canvas中的文字通过textAlign和textBaseline来实现文字的对齐。textAlign是水平方向的文字对齐,它的值包括center、end、left、right、start。textBaseline是竖直方向的文字对齐,它的值包括alphabetic、bottom、ideographic、middle、top。
首先看水平方向的对齐。为了看出对齐方式之间的区别,我们在文字坐标位置画一条竖线,代码如下:
效果图如下:
从效果图上可以看出,start与left相同,表示文字从左侧开始对齐;end与right相同,表示文字从右侧开始对齐,center表示文字居中。
下面看一下竖直方向的对齐,代码如下:
效果图如下:
图片操作
Canvas中提供了drawImage函数和putImageData函数来绘制图片。
利用drawImage绘制图片
drawImage函数有3种函数原型,其语法如下:
drawImage(image,dx,dy);
drawImage(image,dx,dy,dw,dh);
drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh);
第一个参数image是要绘制的对象,这个参数可以是HTMLImageElement、HTMLCanvasElement或者HTMLVideoElement,dx、dy是image在Canvas中定位的坐标值,dw、dh表示image在Canvas中即将绘制的区域(相对dx、dy坐标的偏移量)的宽度和高度值,sx、sy是image所要绘制的起始位置,sw、sh表示image所要绘制区域(相对于image的sx、sy坐标的偏移量)的宽度和高度值。
代码如下:
效果图展示:
从图中可以看出Canvas画板里的右上小图是原图的缩小,而右下小图是左边大图截取的一部分(图中标注部分)。
利用getImageData和putImageData绘制图片
putImageData(imgdata,dx,dy,sx,sy,sw,sh)函数需要7个参数,其中imgdata为像素数据,dx、dy是绘制图片的定位坐标值,sx、sy是imgdata所要绘制图片的起始位置,sw、sh是imgdata所要绘制区域(相对于imgdata的sx和sy坐标的偏移量)的宽度和高度值。这里面第4个参数以及其后的所有参数都可以省略,如果这些参数都省略了,则表示绘制整个imgdata。
在使用putImageData之前,需要先用getImageData(x,y,w,h)函数得到像素数据,这里只得是从Canvas画板上取得所选区域的像素数据,它的四个参数分别是选择区域起点坐标x、y,选择区域的长和宽。
代码如下:
效果图如下: