《HTML5 Canvas游戏开发实战》——3.2 图形的渲染

简介: 本节书摘来自华章计算机《HTML5 Canvas游戏开发实战》一书中的第3章,第3.2节,作者:张路斌著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.2 图形的渲染

Canvas提供了很多对颜色进行操作的API,可实现渐变、反色等效果。这一节中将举例说明如何实现这些效果。
3.2.1 绘制颜色渐变效果的图形
颜色的渐变分为线性渐变和径向渐变,下面分别进行说明。
1 . 线性渐变
使用createLinearGradient函数和addColorStop函数可以实现线性渐变功能。
createLinearGradient函数的原型如下:

createLinearGradient(x1,y1,x2,y2)

其中的4个参数分别是渐变的出发点坐标(x1,y1)与终点坐标(x2,y2)。
addColorStop函数的原型如下:

addColorStop (position,color)

其中,position 参数必须是一个 0.0 到 1.0 之间的数值,表示渐变中颜色地点的相对地位;color参数表示渐变的颜色。
它的绘制如代码清单3-15所示。
代码清单 3-15

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");

var grd=ctx.createLinearGradient(0,0,200,0);
grd.addColorStop(0.2,"#00ff00");
grd.addColorStop(0.8,"#ff0000");
ctx.fillStyle=grd;
ctx.fillRect(0,0,200,100);
</script>

绘制效果如图3-20所示。

image

2 . 径向渐变
使用createRadialGradient函数和addColorStop函数可以实现径向渐变功能。
createRadialGradient函数的原型如下:

createRadialGradient (x0,y0,r0,x1,y1,r1)

其中,参数x0、y0为开始圆的圆心坐标,r0为开始圆的直径;x1、y1为结束圆的圆心坐标,r1为结束圆的直径。
createRadialGradient函数的使用方法如代码清单3-16所示。
代码清单 3-16

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");

var grd=ctx.createRadialGradient(100,100,10,100,100,50);
grd.addColorStop(0,"#00ff00");
grd.addColorStop(1,"#ff0000");
ctx.fillStyle=grd;
ctx.fillRect(0,0,200,200);
</script>

运行效果如图3-21所示。

image

3.2.2 颜色合成之globalCompositeOperation属性
globalCompositeOperation 属性说明了绘制到画布上的颜色是如何与画布上已有的颜色组合起来的。下面列出了其中可能要设置的值以及它们的含义。这些值中的source一词指的是将要绘制到画布上的颜色,而destination指的是画布上已经存在的颜色,其默认值是source-over。
copy:只绘制新图形,删除其他所有内容。
darker:在图形重叠的地方,其颜色由两个颜色值相减后决定。
destination-atop:画布上已有的内容只会在它和新图形重叠的地方保留。新图形绘制于内容之后。
destination-in:在新图形及画布上已有图形重叠的地方,画布上已有内容都保留。所有其他内容均为透明的。
destination-out:在画布上已有内容和新图形不重叠的地方,已有内容保留。所有其他内容均为透明的。
destination-over:新图形绘制于画布上已有内容的后面。
lighter:在图形重叠的地方,其颜色由两种颜色值的加值来决定。
source-atop:只有在新图形和画布上已有内容重叠的地方才绘制新图形。
source-in:在新图形以及画布上已有内容重叠的地方才绘制新图形。所有其他内容均为透明的。
ource-out:只有在和画布上已有图形不重叠的地方才绘制新图形。
source-over:新图形绘制于画布上已有图形的顶部。这是默认的设置。
xor:在重叠和正常绘制的其他地方,图形都成为透明的。
为了方便大家理解,我们来看看相关代码,如代码清单3-17所示。
代码清单 3-17

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");

ctx.fillStyle="#00ff00";
ctx.fillRect(10,10,50,50);
ctx.globalCompositeOperation="source-over";
ctx.beginPath();
ctx.fillStyle="#ff0000";
ctx.arc(50,50,30,0,2*Math.PI);
ctx.fill();
</script>

运行效果如图3-22所示。
代码清单3-14中设置了globalCompositeOperation的属性为source-over,表示新图形绘制于已有图形的顶部。
其他属性实现的效果如图3-23至图3-33所示。

image
image
image
image

以上就是globalCompositeOperation所有属性的效果图。
3.2.3 颜色反转
所谓颜色反转,就是对图形的每个像素进行颜色取反,如代码清单3-18所示。
代码清单 3-18

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");

var image = new Image();    
image.src = "face.jpg";  
image.onload = function(){    
    ctx.drawImage(image,0,0);  
    
    var imgdata = ctx.getImageData(0,0,250,250); 
    var pixels = imgdata.data; 
    // 遍历每个像素并对 RGB 值进行取反
    for (var i=0, n=pixels.length; i<n; i+= 4){ 
    pixels[i] = 255-pixels[i]; 
    pixels[i+1] = 255-pixels[i+1]; 
    pixels[i+2] = 255-pixels[i+2]; 
    } 
    // 在指定位置进行像素重绘
    ctx.putImageData(imgdata, 250, 0); 
};  
</script>

运行效果如图3-34所示。

image

3.2.4 灰度控制
在游戏的制作过程中,有时候需要将图片变为灰色,其做法与3.2.3节所介绍的内容相似。首先对图形的每个像素进行灰度计算,如代码清单3-19所示。
代码清单 3-19

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");

var image = new Image();    
image.src = "face.jpg";  
image.onload = function(){    
    ctx.drawImage(image,0,0);  
    
    var imgdata = ctx.getImageData(0,0,250,250); 
    var pixels = imgdata.data; 
     // 遍历每个像素并对 RGB 值进行取反
    for (var i=0, n=pixels.length; i<n; i+= 4){ 
        var grayscale = pixels[i] * .3 + 
            pixels[i+1] * .59 + pixels[i+2] * .11;
        pixels[i  ] = grayscale;     // red
         pixels[i+1] = grayscale;     // green
         pixels[i+2] = grayscale;     // blue
    } 
    // 在指定位置进行像素重绘
    ctx.putImageData(imgdata, 250, 0); 
};  
</script>

运行效果如图3-35所示。

image

3.2.5 阴影效果
Canvas API 中包含了自动为你所绘制的任何图形添加下拉阴影的属性。阴影的颜色可用 shadowColor 属性来指定,并且可以通过 shadowOffsetX 和 shadowOffsetY 属性来改变。另外,应用到阴影边缘的羽化量也可以使用 shadowBlur 属性来设置。代码清单3-20给图片加上了红色阴影。
代码清单 3-20

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");

ctx.shadowColor="#ff0000";
ctx.shadowBlur=10;
ctx.shadowOffsetX=20; 
ctx.shadowOffsetY=30;
     
var image = new Image();    
image.src = "face.jpg";  
image.onload = function(){    
    ctx.drawImage(image,0,0);  
    
};  
</script>

运行效果如图3-36所示。
在代码清单3-20中,下列代码表示设定阴影的颜色为红色。

ctx.shadowColor="#ff0000";

下列代码指定羽化阴影的程度为10。

ctx.shadowBlur=10;

下列代码指定阴影的水平偏移量和垂直偏移量。

ctx.shadowOffsetX=20; 
ctx.shadowOffsetY=30;

image

以上几个属性中从字面上不太容易理解的是羽化程度shadowBlur。代码清单3-21将阴影的羽化程度设为了100,这样大家就可以看到区别了。
代码清单 3-21

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");

ctx.shadowColor="#ff0000";
ctx.shadowBlur=100;
ctx.shadowOffsetX=20; 
ctx.shadowOffsetY=30;
     
var image = new Image();    
image.src = "face.jpg";  
image.onload = function(){    
     ctx.drawImage(image,0,0);  
    
};  
</script>

运行效果如图3-37所示。

image

相关文章
|
26天前
|
前端开发
html渲染优先级
html渲染优先级
27 0
|
2月前
|
JavaScript 前端开发 容器
用HTML DOM实现有条件地渲染网页元素(上)
用HTML DOM实现有条件地渲染网页元素(上)
|
2月前
|
存储 JavaScript 前端开发
用HTML DOM实现有条件地渲染网页元素(下)
用HTML DOM实现有条件地渲染网页元素(下)
|
6天前
|
前端开发 JavaScript
Canvas三维变化背景动画HTML源码
Canvas三维变化背景动画HTML源码
19 5
|
2月前
|
移动开发 JavaScript 数据管理
HTML5 拖放在游戏中的应用
HTML5的拖放功能在游戏开发中广泛应用,尤其在创建交互式网页游戏时。它支持多种场景,如拖动角色或物品、选择和装备物品、拼图或配对游戏以及自定义界面布局。通过简单的HTML和JavaScript代码,可实现流畅的拖放交互,并提供视觉反馈,增强用户体验。此外,还需考虑设备兼容性和数据管理,确保游戏在不同设备和浏览器上都能良好运行。总之,HTML5拖放功能使网页游戏更生动有趣。
|
2月前
|
XML 移动开发 前端开发
HTML5 SVG和canvas的性能探讨
HTML5 中的 SVG(可缩放矢量图形)和 Canvas(画布)分别用于网页图形绘制。SVG 基于矢量图形,使用 XML 描述,适合静态或少量动态内容(如图标、图表),易于编辑且保持高分辨率;Canvas 则基于位图,通过 JavaScript 绘制,更适合快速更新大量图形的场景(如游戏、动态动画),但在复杂图形计算时可能遇到性能瓶颈。总体而言,SVG 适用于静态和少量动态内容,而 Canvas 更适合高频率更新和性能要求高的场景。
|
2月前
|
移动开发 前端开发 JavaScript
HTML5 Canvas详解及应用
HTML5 Canvas 允许通过 JavaScript 在网页上动态绘制图形、动画等视觉内容。首先在 HTML 中定义 `&lt;canvas&gt;` 元素,并通过 JavaScript 获取画布上下文进行绘制。常见方法包括绘制矩形、路径、圆形和文本,以及处理图像和创建动画效果。适用于游戏开发、数据可视化、图像编辑和动态图形展示等多种应用场景。需要注意性能优化、无状态绘制及自行处理事件等问题。
|
2月前
|
移动开发 前端开发 数据挖掘
用HTML5中的 画布(Canvas)在“圳品”信息系统网页上绘制显示饼图
用HTML5中的 画布(Canvas)在“圳品”信息系统网页上绘制显示饼图
|
3月前
|
Dart 前端开发 Java
|
2月前
|
前端开发
在 HTML canvas 绘制文本
在 HTML canvas 绘制文本
18 0