《HTML5 Canvas游戏开发实战》——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所示。

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所示。

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所示。




以上就是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所示。

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所示。

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;

以上几个属性中从字面上不太容易理解的是羽化程度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所示。

时间: 2024-10-31 21:53:36

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

《HTML5 Canvas游戏开发实战》——2.1 绘制基本图形

2.1 绘制基本图形 所谓基本图形,就是指线.矩形.圆等最简单的图形,任何复杂的图形都是由这些简单的图形组合而成的.我们首先来了解一下这些简单图形的绘制方法.2.1.1 画线你可能是第一次接触Canvas绘图.首先,我们通过绘制一个简单的直线来学习Canvas的功能.其代码如代码清单2-1所示.代码清单 2-1 <!DOCTYPE HTML> <html> <body> <canvas id="myCanvas" width="200

《HTML5 Canvas游戏开发实战》——2.4 图片操作

2.4 图片操作 无论我们开发的是应用程序还是游戏软件,都是离不开图片,没有图片就无法让整个页面漂亮起来.开发游戏的时候,游戏中的地图.背景.人物.物品等都是由图片组成的,所以图片的显示和操作非常重要.Canvas中提供了drawImage函数和putImageData函数来绘制图片,在本节中将一一讲解.2.4.1 利用drawImage绘制图片 drawImage函数有3种函数原型,其语法如下: drawImage(image, dx, dy); drawImage(image, dx, dy

《HTML5 Canvas游戏开发实战》——导读

前言 为什么要写这本书 并非计算机专业的我,却最终走上了编程之路,并写了这样一本书,为什么呢?其实一切都是因为和游戏结了缘. 小时候我非常喜欢玩游戏,为了玩游戏和小伙伴们干过不少调皮捣蛋的事情.初中为了得到自己的第一台游戏机,和父亲打赌,破天荒拿了全班第一名.当然有了游戏机的相伴,从那以后就再也没有拿过第一名了.因为数学上较有优势,所以读大学时选择的是数学专业,没有选读计算机让后来做开发的我多少感到有些遗憾.和其他人一样,大学是真正改变我人生的时期,第一次有了电脑,第一次从室友嘴里得知QQ为何物

《HTML5 Canvas游戏开发实战》——第3章 Canvas高级功能

第3章 Canvas高级功能 在进行游戏开发的时候,离不开图形的变化,比如放大.缩小.旋转.平移等功能都是游戏开发中常用的变形手段.同时,为了使得游戏画面更加丰富多彩,还需要设置界面的颜色来实现更加精美的画面.本章将通过介绍Canvas的变形.色彩调整等高级功能来实现这些奇妙的变化.

《HTML5 Canvas游戏开发实战》——第1章 准备工作

第一部分 准备工作篇 第1章 准备工作 作为本书的第一章,我们先来学习一下什么是HTML5.什么是Canvas元素.HTML5的开发与运行环境,以及如何选择它的开发工具等基础知识.对于游戏开发来说,如果不以面向对象为基础,那么开发思路就会不够清晰,代码也难以做到工整,可读性差,会给后期维护带来很大困难.所以在进入游戏开发之前,本章还会对JavaScript的面向对象编程进行简要的讲解.

《HTML5 Canvas游戏开发实战》——第2章 Canvas基本功能

第2章 Canvas基本功能 本章主要讲解HTML5 Canvas的基本功能,利用Canvas的API,展示一些基本图形的绘制及操作方法,包括画线.画图.文字操作及图片操作等.

《HTML5 Canvas游戏开发实战》——2.5 小结

2.5 小结 本章主要介绍了如何直接使用Canvas的绘图API进行基本图形.文字及图片的绘制.这些都属于最基本的图形绘制,因为它们不包括任何变形.但是这些看似简单的图形却是一切高级图形的基础,无论多复杂的图形都是由这些基本图形通过组合.变形等而得到的.至于如何将这些基本的图形通过变形及色彩的渲染等方法绘制出特殊的效果来,将会在下一章做详细的讲解.

《HTML5 Canvas游戏开发实战》——1.6 JavaScript中的面向对象

1.6 JavaScript中的面向对象 在本章开始的时候就已经说了,对于游戏开发来说,使用面向对象的方法进行编程是很有必要的.所以在介绍游戏开发之前,先来了解一下如何使用JavaScript进行面向对象的编程.可以说,JavaScript是一种基于对象的语言,但是,它又不是一种真正的面向对象的编程语言,因为它的语法中不存在class(类).本节将分析和解决如何在JavaScript中实现封装和继承等面向对象的问题.1.6.1 类JavaScript对象很抽象,所以下面将以实际的例子来解释如何定

《HTML5 Canvas游戏开发实战》——2.2 绘制复杂图形

2.2 绘制复杂图形 前面了解了基本图形的绘制方法,下面我们来看看复杂图形该如何绘制.2.2.1 画曲线贝塞尔曲线,又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线.在这里我们不研究贝塞尔曲线的原理,主要介绍在Canvas中如何绘制它.1 . 二次贝塞尔曲线二次贝塞尔曲线有一个控制点.在Canvas中用quadraticCurveTo(cpx,cpy,x,y)函数来绘制二次贝塞尔曲线,cpx.cpy表示控制点的坐标:x.y表示终点坐标.它的绘制如代码清单2-11所示.代码清单 2-1