<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_当耐特砖家--Iamzhanglei.com</title><subtitle type="text">try to post more often – twitter,weibo and G+ have made people lazy...</subtitle><id>http://feed.cnblogs.com/blog/u/64625/rss</id><updated>2012-05-18T01:10:21Z</updated><author><name>【当耐特砖家】</name><uri>http://www.cnblogs.com/iamzhanglei/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/iamzhanglei/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/64625/rss"/><entry><id>http://www.cnblogs.com/iamzhanglei/archive/2012/04/03/2430740.html</id><title type="text">HTML5 割绳子加载动画</title><summary type="text"/><published>2012-04-03T02:40:00Z</published><updated>2012-04-03T02:40:00Z</updated><author><name>【当耐特砖家】</name><uri>http://www.cnblogs.com/iamzhanglei/</uri></author><link rel="alternate" href="http://www.cnblogs.com/iamzhanglei/archive/2012/04/03/2430740.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/iamzhanglei/archive/2012/04/03/2430740.html"/><content type="html">&lt;div class="canvasHolder"&gt;&lt;canvas style="border-bottom: #222 5px solid; border-left: #222 5px solid; border-top: #222 5px solid; border-right: #222 5px solid" id="testCanvas" height="432" width="768"&gt;&lt;/canvas&gt;&lt;/div&gt; &lt;script type="text/javascript" src="http://files.cnblogs.com/iamzhanglei/easel0308.js"&gt; &lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/loader.js"&gt;&lt;/script&gt;&lt;!-- End EaselJS Imports --&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/Vector2.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;        function lb(v, bi) { this.initialize(v, bi); }        lb.prototype = new Container(); lb.prototype.Container_initialize = lb.prototype.initialize; lb.prototype.initialize = function (v, bi) { this.Container_initialize(); this.v = v; bmp = new Bitmap(bi); bmp.regX = bi.width / 2; bmp.regY = bi.height / 2; this.r = 98; this.addChild(bmp); this.x = 200; this.y = 200; this.pc = 0; this.lt = new Text(this.pc + "%", "60px bold Arial", "#fff"); this.lt.x = -45; this.lt.y = 20; this.addChild(this.lt); }        lb.prototype.tick = function () {            this.x += this.v.x; this.y += this.v.y; if (this.y + this.r &gt;= cvHeight || this.y &lt;= this.r) { this.v.y *= -1; }            if (this.x + this.r &gt;= cvWidth || this.x &lt;= this.r) { this.v.x *= -1; }            this.pc += 0.01; if (this.pc &gt; 100) this.pc = 100; if (this.pc &lt; 9.5) { this.lt.text = "0" + Math.round(this.pc) + "%"; } else { this.lt.text = Math.round(this.pc) + "%"; }        }        var cv, cvWidth, cvHeight; var stage; var bmp, menubgBmp, logoBmp; var lgi, obaImage, mbi, sim; function main() { var loader = new PxLoader(); obaImage = loader.addImage('http://images.cnblogs.com/cnblogs_com/iamzhanglei/loader-bubble.png'); mbi = loader.addImage('http://images.cnblogs.com/cnblogs_com/iamzhanglei/menubg.jpg'); lgi = loader.addImage('http://images.cnblogs.com/cnblogs_com/iamzhanglei/loader-logo.png'); sim = loader.addImage('http://images.cnblogs.com/cnblogs_com/iamzhanglei/loader-smallbubble.png'); loader.addCompletionListener(function () { init(); }); loader.start(); }        var bls = []; var bubc = new Container(); function grn(min, max) { return (min + Math.floor(Math.random() * (max - min + 1))); }        function filter() {            for (var i = 0; i &lt; 20; i++) { var ball = { position: new Vector2(grn(63, 370), grn(63, 370)), r: 62, vx: grn(-200, 200), vy: grn(-200, 200) }; bls.push(ball); }            var fbs = []; for (var i = 0; i &lt; bls.length; i++) {                var oc = 0; for (var j = i + 1; j &lt; bls.length; j++) { var distance = bls[i].position.distanceTo(bls[j].position); if (distance &lt;= bls[i].r + bls[j].r) { oc++; } }                if (oc === 0) { fbs.push(bls[i]); }            }            bls = fbs;        }        var sbc = new Container(); var lb; var smallBubble; function init() {            cv = document.getElementById("testCanvas"); stage = new Stage(cv); cvWidth = cv.width; cvHeight = cv.height; menubgBmp = new Bitmap(mbi); logoBmp = new Bitmap(lgi); logoBmp.x = 170; logoBmp.y = 120; stage.addChild(menubgBmp); stage.addChild(logoBmp); lb = new lb(new Vector2(1, 1), obaImage); stage.addChild(lb); smallBubble = new Bitmap(sim); stage.addChild(bubc); filter(); for (var i in bls) { var bm = new Bitmap(sim); bm.regX = 61; bm.regY = 61; var bc = new Container(); bc.addChild(bm); bc.x = bls[i].position.x; bc.y = bls[i].position.y; bubc.addChild(bc); }            stage.addChild(sbc); Ticker.setFPS(60); Ticker.addListener(window);        }        function tick() {            for (var i = 0; i &lt; bls.length; i++) { for (var j = i + 1; j &lt; bls.length; j++) { var distance = bls[i].position.distanceTo(bls[j].position); if (distance &lt; bls[i].r + bls[j].r) { var cosAngle = (bls[i].position.x - bls[j].position.x) / distance; var sinAngle = (bls[i].position.y - bls[j].position.y) / distance; var xx = (bls[i].vx * cosAngle * cosAngle + bls[i].vy * sinAngle * cosAngle - bls[j].vx * cosAngle * cosAngle - bls[j].vy * sinAngle * cosAngle); var yy = (bls[i].vx * cosAngle * sinAngle + bls[i].vy * sinAngle * sinAngle - bls[j].vx * cosAngle * sinAngle - bls[j].vy * sinAngle * sinAngle); bls[j].vx += xx; bls[j].vy += yy; bls[i].vx -= xx; bls[i].vy -= yy; bls[i].position.x += (bls[i].r + bls[j].r - distance) * cosAngle; bls[i].position.y += (bls[i].r + bls[j].r - distance) * sinAngle; } } }            for (var i in bls) {                if (bls[i].position.x &lt; 180) { bls[i].vy -= 20; }                bubc.children[i].x = bls[i].position.x; bubc.children[i].y = bls[i].position.y; if (bls[i].r + bls[i].position.x &gt; cv.width) { bls[i].position.x = cv.width - bls[i].r; bls[i].vx *= -1; }                if (bls[i].position.x &lt; bls[i].r) { bls[i].position.x = bls[i].r; bls[i].vx *= -1; }                if (bls[i].r + bls[i].position.y &gt; cv.height) { bls[i].position.y = cv.height - bls[i].r; bls[i].vy *= -1; }                if (bls[i].position.y &lt; bls[i].r) { bls[i].position.y = bls[i].r; bls[i].vy *= -1; }                bls[i].position.x += bls[i].vx * 15 / 1000; bls[i].position.y += bls[i].vy * 15 / 1000;            }            var l = sbc.getNumChildren(); for (var i = l - 1; i &gt; 0; i--) { var sbb = sbc.getChildAt(i); sbb.vX *= 0.6; sbb.x += sbb.vX; sbb.y -= sbb.vY; sbb.alpha += sbb.vA; if (sbb.alpha &lt;= 0 || sbb.y &gt; cv.height) { sbc.removeChildAt(i); } }            stage.update(); ab(15, 1); stage.update();        }        function ab(count, speed) { for (var i = 0; i &lt; count; i++) { var sbb = smallBubble.clone(); sbb.x = 100; sbb.y = 435; sbb.alpha = Math.random() * 0.5 + 0.5; var a = Math.PI * 2 * Math.random(); var v = (Math.random()) * 15 * speed; sbb.vX = Math.cos(a) * v; sbb.vY = Math.sin(a) * v; sbb.scaleX = sbb.scaleY = 0.2; sbb.vS = (Math.random() - 0.5) * 0.2; sbb.vA = -Math.random() * 0.05 - 0.01; sbc.addChild(sbb); } }        main();&lt;/script&gt;&lt;img src="http://www.cnblogs.com/iamzhanglei/aggbug/2430740.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2012/04/03/2430740.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/iamzhanglei/archive/2012/03/29/2422618.html</id><title type="text">HTML5人工智能基础及OO实践</title><summary type="text">简介人工智能(Artificial Intelligence) ，英文缩写为AI。它是研究、开发用于模拟、延伸和扩展智能的理论、方法、技术及应用系统的一门新的技术科学。本篇从严格意义上说属于人工智能的范畴，但也是基础中的基础。本篇的目的是要赋予小球解散和集合两项基本指令（智商），本篇内容中相关算法适用于子弹追踪等塔防类游戏当中。基础类二维向量(2D vector)可谓2D游戏或是动画里最常用型别了。这里二维向量用Vector2类实现，用(x, y)表示。 Vector2亦用来表示空间中的点(point)，而不另建类。先看代码：1 (function(window){2varVector2=fu</summary><published>2012-03-29T00:42:00Z</published><updated>2012-03-29T00:42:00Z</updated><author><name>【当耐特砖家】</name><uri>http://www.cnblogs.com/iamzhanglei/</uri></author><link rel="alternate" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/29/2422618.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/29/2422618.html"/><content type="html">&lt;p&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;人工智能(Artificial Intelligence) ，英文缩写为AI。它是研究、开发用于模拟、延伸和扩展智能的理论、方法、技术及应用系统的一门新的技术科学。本篇从严格意义上说属于人工智能的范畴，但也是基础中的基础。本篇的目的是要赋予小球解散和集合两项基本指令（智商），本篇内容中相关算法适用于子弹追踪等塔防类游戏当中。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;基础类&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;二维向量(2D vector)可谓2D游戏或是动画里最常用型别了。这里二维向量用Vector2类实现，用(x, y)表示。 Vector2亦用来表示空间中的点(point)，而不另建类。先看代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;&amp;nbsp;&lt;span style="color: #008080; "&gt;1&lt;/span&gt;&amp;nbsp; (&lt;span style="color: #0000ff; "&gt;function&lt;/span&gt;(window)&amp;nbsp;{&lt;/p&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;Vector2&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;(x,&amp;nbsp;y)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.x&amp;nbsp;=&amp;nbsp;x&amp;nbsp;||&amp;nbsp;0;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.y&amp;nbsp;=&amp;nbsp;y&amp;nbsp;||&amp;nbsp;0;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector2.prototype&amp;nbsp;=&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;(x,&amp;nbsp;y)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.x&amp;nbsp;=&amp;nbsp;x;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.y&amp;nbsp;=&amp;nbsp;y;&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sub:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;(v)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Vector2(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.x&amp;nbsp;-&amp;nbsp;v.x,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.y&amp;nbsp;-&amp;nbsp;v.y);&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;multiplyScalar:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;(s)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.x&amp;nbsp;*=&amp;nbsp;s;&lt;br /&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.y&amp;nbsp;*=&amp;nbsp;s;&lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;divideScalar:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;(s)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(s)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.x&amp;nbsp;/=&amp;nbsp;s;&lt;br /&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.y&amp;nbsp;/=&amp;nbsp;s;&lt;br /&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.set(0,&amp;nbsp;0);&lt;br /&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;length:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;()&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;Math.sqrt(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.lengthSq());&lt;br /&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;normalize:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;()&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.divideScalar(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.length());&lt;br /&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lengthSq:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;()&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.x&amp;nbsp;*&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.x&amp;nbsp;+&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.y&amp;nbsp;*&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.y;&lt;br /&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;distanceToSquared:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;(v)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;dx&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.x&amp;nbsp;-&amp;nbsp;v.x,&lt;br /&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dy&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.y&amp;nbsp;-&amp;nbsp;v.y;&lt;br /&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;dx&amp;nbsp;*&amp;nbsp;dx&amp;nbsp;+&amp;nbsp;dy&amp;nbsp;*&amp;nbsp;dy;&lt;br /&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;distanceTo:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;(v)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;Math.sqrt(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.distanceToSquared(v));&lt;br /&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setLength:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;(l)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.normalize().multiplyScalar(l);&lt;br /&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window.Vector2&amp;nbsp;=&amp;nbsp;Vector2;&lt;br /&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt;&amp;nbsp;}&amp;nbsp;(window));&lt;/div&gt;&lt;/div&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="4"&gt;使用该类需要特别注意和区分的地方是：&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;它什么时候代表点、什么时候代表向量。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;当其代表向量的时候，它的几何意义是什么？&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;不能把其当成一个黑盒来调用，需要知其然并知其所以然。&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font size="4"&gt;在下面的使用的过程当中，我会特别标注其代表点还是向量；代表向量时，其几何意义是什么？&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;给小球赋予智商，顾名思义需要小球类：&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;(&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;(window)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;Ball&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;(r,&amp;nbsp;v,&amp;nbsp;p,&amp;nbsp;cp)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.radius&amp;nbsp;=&amp;nbsp;r;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.velocity&amp;nbsp;=&amp;nbsp;v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.position&amp;nbsp;=&amp;nbsp;p;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.collectionPosition&amp;nbsp;=&amp;nbsp;cp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Ball.prototype&amp;nbsp;=&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;collection:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;(v)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.velocity&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.collectionPosition.sub(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.position).setLength(v)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;disband:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.velocity&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Vector2(MathHelp.getRandomNumber(&amp;nbsp;-&amp;nbsp;230,&amp;nbsp;230),&amp;nbsp;MathHelp.getRandomNumber(&amp;nbsp;-&amp;nbsp;230,&amp;nbsp;230))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window.Ball&amp;nbsp;=&amp;nbsp;Ball&lt;br /&gt;}&amp;nbsp;(window));&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;font size="4"&gt;其中&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;小球拥有4个属性，分别是：radius半径、velocity速度（Vector2）、position位置(Vector2)、collectionPosition集合点/小球的家(Vector2)。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;小球拥有2个方法，分别是：collection集合、disband解散。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;小球的集合方法所传递的参数为集合的速度，因为小球都有一个集合点的属性，所以这里不用再传入集合点/家给小球。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;这里详细分析一下collection方法，这也是整个demo的关键代码。&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;collection:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&amp;nbsp;(v)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.velocity&amp;nbsp;=&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.collectionPosition.sub(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.position).setLength(v);&lt;br /&gt;},&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;font size="4"&gt;因为setLength设置向量的长度：&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;setLength:&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&amp;nbsp;(l)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.normalize().multiplyScalar(l);&lt;p&gt;&amp;nbsp;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;font size="4"&gt;所以collection可以改成：&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.velocity&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.collectionPosition.sub(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.position).normalize().multiplyScalar(v);&lt;/div&gt;&lt;/div&gt;&lt;p&gt;normalize是获取单位向量，也可以改成：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.collectionPosition.sub(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.position).divideScalar(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.length()).multiplyScalar(v); &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;font size="4"&gt;整个Vector2黑盒就全部展现出来，其整个过程都是向量的运算，代表含义如下所示：&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;this.collectionPosition&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;.sub(this.position)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 获取小球所在位置指向小球集合位置的向量；&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .divideScalar(this.length()) 得到该向量的单位向量；&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .multiplyScalar(v);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 改变该向量的长度。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;最后把所得到的向量赋给小球的速度。&lt;br /&gt;上面我们还是用到了解散方法，其过程是帮小球生成一个随机速度，用到了MathHelp类的一个静态方法：&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;(&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&amp;nbsp;(window)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;MathHelp&amp;nbsp;=&amp;nbsp;{};&lt;br /&gt;&amp;nbsp;MathHelp.getRandomNumber&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&amp;nbsp;(min,&amp;nbsp;max)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;(min&amp;nbsp;+&amp;nbsp;Math.floor(Math.random()&amp;nbsp;*&amp;nbsp;(max&amp;nbsp;-&amp;nbsp;min&amp;nbsp;+&amp;nbsp;1)));&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;window.MathHelp&amp;nbsp;=&amp;nbsp;MathHelp;&lt;p&gt;}&amp;nbsp;(window));&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;粒子生成&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;写了Vector2、Ball、MathHeper三个类之后，终于可以开始实现一点东西出来！&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;ps&amp;nbsp;=&amp;nbsp;[],&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;balls&amp;nbsp;=&amp;nbsp;[];&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&amp;nbsp;init(tex)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;balls.length&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ps.length&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.clearRect(0,&amp;nbsp;0,&amp;nbsp;canvas.width,&amp;nbsp;canvas.height);&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fillStyle&amp;nbsp;=&amp;nbsp;"rgba(0,0,0,1)";&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fillRect(0,&amp;nbsp;0,&amp;nbsp;canvas.width,&amp;nbsp;canvas.height);&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fillStyle&amp;nbsp;=&amp;nbsp;"rgba(255,255,255,1)";&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.font&amp;nbsp;=&amp;nbsp;"bolder&amp;nbsp;160px&amp;nbsp;宋体";&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.textBaseline&amp;nbsp;=&amp;nbsp;'top';&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fillText(tex,&amp;nbsp;20,&amp;nbsp;20);&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;收集所有像素&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(y&amp;nbsp;=&amp;nbsp;1;&amp;nbsp;y&amp;nbsp;&amp;lt;&amp;nbsp;canvas.height;&amp;nbsp;y&amp;nbsp;+=&amp;nbsp;7)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(x&amp;nbsp;=&amp;nbsp;1;&amp;nbsp;x&amp;nbsp;&amp;lt;&amp;nbsp;canvas.width;&amp;nbsp;x&amp;nbsp;+=&amp;nbsp;7)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imageData&amp;nbsp;=&amp;nbsp;cxt.getImageData(20&amp;nbsp;+&amp;nbsp;x,&amp;nbsp;20&amp;nbsp;+&amp;nbsp;y,&amp;nbsp;1,&amp;nbsp;1);&lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(imageData.data[0]&amp;nbsp;&amp;gt;&amp;nbsp;170)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ps.push({&lt;br /&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;px:&amp;nbsp;20&amp;nbsp;+&amp;nbsp;x,&lt;br /&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;py:&amp;nbsp;20&amp;nbsp;+&amp;nbsp;y&lt;br /&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fillStyle&amp;nbsp;=&amp;nbsp;"rgba(0,0,0,1)";&lt;br /&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fillRect(20,&amp;nbsp;20,&amp;nbsp;canvas.width,&amp;nbsp;canvas.height);&lt;br /&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;像素点和小球转换&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;ps)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;ball&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Ball(2,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Vector2(0,&amp;nbsp;0),&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Vector2(ps[i].px,&amp;nbsp;ps[i].py),&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Vector2(ps[i].px,&amp;nbsp;ps[i].py));&lt;br /&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;balls.push(ball);&lt;br /&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fillStyle&amp;nbsp;=&amp;nbsp;"#fff";&lt;br /&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;balls)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.beginPath();&lt;br /&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.arc(balls[i].position.x,&amp;nbsp;balls[i].position.y,&amp;nbsp;balls[i].radius,&amp;nbsp;0,&amp;nbsp;Math.PI&amp;nbsp;*&amp;nbsp;2,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.closePath();&lt;br /&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fill();&lt;br /&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;解散：生成随机速度&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;balls)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;balls[i].disband();&lt;br /&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;p&gt;&lt;span style="color: #008080; "&gt;47&lt;/span&gt;&amp;nbsp;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;其中分三个步骤：收集所有像素、 像素点和小球转换、生成随机速度。整个demo我们需要一个loop:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;time&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;cyc&amp;nbsp;=&amp;nbsp;15;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;80;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;collectionCMD&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;setInterval(&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;()&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fillStyle&amp;nbsp;=&amp;nbsp;"rgba(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;.3)";&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fillRect(0,&amp;nbsp;0,&amp;nbsp;canvas.width,&amp;nbsp;canvas.height);&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fillStyle&amp;nbsp;=&amp;nbsp;"#fff";&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time&amp;nbsp;+=&amp;nbsp;cyc;&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;balls)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(collectionCMD&amp;nbsp;===&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;balls[i].position.distanceTo(balls[i].collectionPosition)&amp;nbsp;&amp;lt;&amp;nbsp;2)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;balls[i].velocity.y&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;balls[i].velocity.x&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(time&amp;nbsp;===&amp;nbsp;3000)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;collectionCMD&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;balls)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;balls[i].collection(230);&lt;br /&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(time&amp;nbsp;===&amp;nbsp;7500)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;collectionCMD&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;balls)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;balls[i].disband();&lt;br /&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;balls)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.beginPath();&lt;br /&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.arc(balls[i].position.x,&amp;nbsp;balls[i].position.y,&amp;nbsp;balls[i].radius,&amp;nbsp;0,&amp;nbsp;Math.PI&amp;nbsp;*&amp;nbsp;2,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.closePath();&lt;br /&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cxt.fill();&lt;br /&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;balls[i].position.y&amp;nbsp;+=&amp;nbsp;balls[i].velocity.y&amp;nbsp;*&amp;nbsp;cyc&amp;nbsp;/&amp;nbsp;1000;&lt;br /&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;balls[i].position.x&amp;nbsp;+=&amp;nbsp;balls[i].velocity.x&amp;nbsp;*&amp;nbsp;cyc&amp;nbsp;/&amp;nbsp;1000;&lt;br /&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt;&amp;nbsp;},&lt;p&gt;&lt;span style="color: #008080; "&gt;40&lt;/span&gt;&amp;nbsp;cyc);&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;font size="4"&gt;这里使用time整体控制，使其无限loop。ps:这里还有一点不够OO的地方就是应当为ball提供一个draw方法。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;其中的balls[i].position.distanceTo(balls[i].collectionPosition) 代表了点与点之间的距离，这里判断小球是否到了集合点或家。这里其几何意义就不再向量了。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在线演示&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;canvas style="border-bottom: #222222 15px solid; border-left: #222222 15px solid; background-color: #111111; color: #cccccc; border-top: #222222 15px solid; border-right: #222222 15px solid" id="myCanvas" width="600" height="400"&gt;&lt;/canvas&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;这你也敢叫人工智能？ok，未完待续......&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;script&gt;                        (function (window) { var Vector2 = function (x, y) { this.x = x || 0; this.y = y || 0 }; Vector2.prototype = { set: function (x, y) { this.x = x; this.y = y; return this }, sub: function (v) { return new Vector2(this.x - v.x, this.y - v.y) }, multiplyScalar: function (s) { this.x *= s; this.y *= s; return this }, divideScalar: function (s) { if (s) { this.x /= s; this.y /= s } else { this.set(0, 0) }; return this }, length: function () { return Math.sqrt(this.lengthSq()) }, normalize: function () { return this.divideScalar(this.length()) }, lengthSq: function () { return this.x * this.x + this.y * this.y }, distanceToSquared: function (v) { var dx = this.x - v.x, dy = this.y - v.y; return dx * dx + dy * dy }, distanceTo: function (v) { return Math.sqrt(this.distanceToSquared(v)) }, setLength: function (l) { return this.normalize().multiplyScalar(l) } }; window.Vector2 = Vector2 } (window)); (function (window) { var Ball = function (r, v, p, cp) { this.radius = r; this.velocity = v; this.position = p; this.collectionPosition = cp }; Ball.prototype = { collection: function (v) { this.velocity = this.collectionPosition.sub(this.position).setLength(v) }, disband: function () { this.velocity = new Vector2(MathHelp.getRandomNumber(-230, 230), MathHelp.getRandomNumber(-230, 230)) } }; window.Ball = Ball } (window)); (function (window) { var MathHelp = function () { }; MathHelp.getRandomNumber = function (min, max) { return (min + Math.floor(Math.random() * (max - min + 1))) }; window.MathHelp = MathHelp } (window)); canvas = document.getElementById("myCanvas"); cxt = canvas.getContext("2d"); var ps = [], balls = []; function init(tex) { balls.length = 0; ps.length = 0; cxt.clearRect(0, 0, canvas.width, canvas.height); cxt.fillStyle = "rgba(0,0,0,1)"; cxt.fillRect(0, 0, canvas.width, canvas.height); cxt.fillStyle = "rgba(255,255,255,1)"; cxt.font = "bolder 115px 宋体"; cxt.textBaseline = 'top'; cxt.fillText(tex, 20, 20); for (y = 1; y &lt; 200; y += 6) { for (x = 1; x &lt; canvas.width; x += 6) { imageData = cxt.getImageData(20 + x, 20 + y, 1, 1); if (imageData.data[0] &gt; 170) { ps.push({ px: 20 + x, py: 20 + y }) } } }; cxt.fillStyle = "rgba(0,0,0,1)"; cxt.fillRect(20, 20, canvas.width, canvas.height); for (var i in ps) { var ball = new Ball(2, new Vector2(0, 0), new Vector2(ps[i].px, ps[i].py), new Vector2(ps[i].px, ps[i].py)); balls.push(ball) }; cxt.fillStyle = "#fff"; for (i in balls) { cxt.beginPath(); cxt.arc(balls[i].position.x, balls[i].position.y, balls[i].radius, 0, Math.PI * 2, true); cxt.closePath(); cxt.fill() }; for (var i in balls) { balls[i].disband() } }; var time = 0; var cyc = 15; var a = 80; var collectionCMD = false; init("当耐特砖家"); setInterval(function () { cxt.fillStyle = "rgba(0, 0, 0, .3)"; cxt.fillRect(0, 0, canvas.width, canvas.height); cxt.fillStyle = "#fff"; time += cyc; for (var i in balls) { if (collectionCMD === true &amp;&amp; balls[i].position.distanceTo(balls[i].collectionPosition) &lt; 2) { balls[i].velocity.y = 0; balls[i].velocity.x = 0 } }; if (time === 3000) { collectionCMD = true; for (var i in balls) { balls[i].collection(230) } }; if (time === 7500) { time = 0; collectionCMD = false; for (var i in balls) { balls[i].disband() } }; for (var i in balls) { cxt.beginPath(); cxt.arc(balls[i].position.x, balls[i].position.y, balls[i].radius, 0, Math.PI * 2, true); cxt.closePath(); cxt.fill(); if (balls[i].radius + balls[i].position.x &gt; canvas.width) { balls[i].position.x = canvas.width - balls[i].radius; balls[i].velocity.x *= -1 }; if (balls[i].position.x &lt; balls[i].radius) { balls[i].position.x = balls[i].radius; balls[i].velocity.x *= -1 }; if (balls[i].radius + balls[i].position.y &gt; canvas.height) { balls[i].position.y = canvas.height - balls[i].radius; balls[i].velocity.y *= -1 }; if (balls[i].position.y &lt; balls[i].radius) { balls[i].position.y = balls[i].radius; balls[i].velocity.y *= -1 }; balls[i].position.y += balls[i].velocity.y * cyc / 1000; balls[i].position.x += balls[i].velocity.x * cyc / 1000 } }, 15);                        &lt;/script&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/iamzhanglei/aggbug/2422618.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/29/2422618.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/iamzhanglei/archive/2012/03/28/2420190.html</id><title type="text">HTML5 Canvas【所见===所得】编程工具正式发布</title><summary type="text">+ - 使用指南 基本使用： var c=document.getElementById("myCanvas");var cxt=c.getContext("2d");cxt.fillStyle="#FF0000";cxt.beginPath();cxt.arc(70,18...</summary><published>2012-03-28T00:28:00Z</published><updated>2012-03-28T00:28:00Z</updated><author><name>【当耐特砖家】</name><uri>http://www.cnblogs.com/iamzhanglei/</uri></author><link rel="alternate" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/28/2420190.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/28/2420190.html"/><content type="html">&lt;style type="text/css"&gt;.ui-helper-hidden{display: none;}.ui-helper-hidden-accessible{position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px);}.ui-helper-reset{margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;}.ui-helper-clearfix:before, .ui-helper-clearfix:after{content: ""; display: table;}.ui-helper-clearfix:after{clear: both;}.ui-helper-clearfix{zoom: 1;}.ui-helper-zfix{width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:alpha(opacity=0);}.ui-state-disabled{cursor: default !important;}.ui-icon{display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat;}.ui-widget-overlay{position: absolute; top: 0; left: 0; width: 100%; height: 100%;}.ui-widget{font-family: verdana,arial,sans-serif; font-size: 1.1em;}.ui-widget .ui-widget{font-size: 1em;}.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button{font-family: verdana,arial,sans-serif; font-size: 1em;}.ui-widget-content{border: 1px solid #e0cfc2; background: #f4f0ec url(images/ui-bg_inset-soft_100_f4f0ec_1x100.png) 50% bottom repeat-x; color: #1e1b1d;}.ui-widget-content a{color: #1e1b1d;}.ui-widget-header{border: 1px solid #d49768; background: #cb842e url(images/ui-bg_glass_25_cb842e_1x400.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold;}.ui-widget-header a{color: #ffffff;}.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default{border: 1px solid #cdc3b7; background: #ede4d4 url(images/ui-bg_glass_70_ede4d4_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #3f3731;}.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited{color: #3f3731; text-decoration: none;}.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus{border: 1px solid #f5ad66; background: #f5f0e5 url(images/ui-bg_glass_100_f5f0e5_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #a46313;}.ui-state-hover a, .ui-state-hover a:hover{color: #a46313; text-decoration: none;}.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active{border: 1px solid #e0cfc2; background: #f4f0ec url(images/ui-bg_highlight-hard_100_f4f0ec_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #b85700;}.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited{color: #b85700; text-decoration: none;}.ui-widget :active{outline: none;}.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight{border: 1px solid #d9bb73; background: #f5f5b5 url(images/ui-bg_highlight-hard_75_f5f5b5_1x100.png) 50% top repeat-x; color: #060200;}.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color: #060200;}.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error{border: 1px solid #f8893f; background: #fee4bd url(images/ui-bg_highlight-hard_65_fee4bd_1x100.png) 50% top repeat-x; color: #592003;}.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a{color: #592003;}.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text{color: #592003;}.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary{font-weight: bold;}.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary{opacity: .7; filter:alpha(opacity=70); font-weight: normal;}.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled{opacity: .35; filter:alpha(opacity=35); background-image: none;}.ui-icon{width: 16px; height: 16px; background-image: url(images/ui-icons_c47a23_256x240.png);}.ui-widget-content .ui-icon{background-image: url(images/ui-icons_c47a23_256x240.png);}.ui-widget-header .ui-icon{background-image: url(images/ui-icons_ffffff_256x240.png);}.ui-state-default .ui-icon{background-image: url(images/ui-icons_f08000_256x240.png);}.ui-state-hover .ui-icon, .ui-state-focus .ui-icon{background-image: url(images/ui-icons_f08000_256x240.png);}.ui-state-active .ui-icon{background-image: url(images/ui-icons_f35f07_256x240.png);}.ui-state-highlight .ui-icon{background-image: url(images/ui-icons_cb672b_256x240.png);}.ui-state-error .ui-icon, .ui-state-error-text .ui-icon{background-image: url(images/ui-icons_ff7519_256x240.png);}.ui-icon-carat-1-n{background-position: 0 0;}.ui-icon-carat-1-ne{background-position: -16px 0;}.ui-icon-carat-1-e{background-position: -32px 0;}.ui-icon-carat-1-se{background-position: -48px 0;}.ui-icon-carat-1-s{background-position: -64px 0;}.ui-icon-carat-1-sw{background-position: -80px 0;}.ui-icon-carat-1-w{background-position: -96px 0;}.ui-icon-carat-1-nw{background-position: -112px 0;}.ui-icon-carat-2-n-s{background-position: -128px 0;}.ui-icon-carat-2-e-w{background-position: -144px 0;}.ui-icon-triangle-1-n{background-position: 0 -16px;}.ui-icon-triangle-1-ne{background-position: -16px -16px;}.ui-icon-triangle-1-e{background-position: -32px -16px;}.ui-icon-triangle-1-se{background-position: -48px -16px;}.ui-icon-triangle-1-s{background-position: -64px -16px;}.ui-icon-triangle-1-sw{background-position: -80px -16px;}.ui-icon-triangle-1-w{background-position: -96px -16px;}.ui-icon-triangle-1-nw{background-position: -112px -16px;}.ui-icon-triangle-2-n-s{background-position: -128px -16px;}.ui-icon-triangle-2-e-w{background-position: -144px -16px;}.ui-icon-arrow-1-n{background-position: 0 -32px;}.ui-icon-arrow-1-ne{background-position: -16px -32px;}.ui-icon-arrow-1-e{background-position: -32px -32px;}.ui-icon-arrow-1-se{background-position: -48px -32px;}.ui-icon-arrow-1-s{background-position: -64px -32px;}.ui-icon-arrow-1-sw{background-position: -80px -32px;}.ui-icon-arrow-1-w{background-position: -96px -32px;}.ui-icon-arrow-1-nw{background-position: -112px -32px;}.ui-icon-arrow-2-n-s{background-position: -128px -32px;}.ui-icon-arrow-2-ne-sw{background-position: -144px -32px;}.ui-icon-arrow-2-e-w{background-position: -160px -32px;}.ui-icon-arrow-2-se-nw{background-position: -176px -32px;}.ui-icon-arrowstop-1-n{background-position: -192px -32px;}.ui-icon-arrowstop-1-e{background-position: -208px -32px;}.ui-icon-arrowstop-1-s{background-position: -224px -32px;}.ui-icon-arrowstop-1-w{background-position: -240px -32px;}.ui-icon-arrowthick-1-n{background-position: 0 -48px;}.ui-icon-arrowthick-1-ne{background-position: -16px -48px;}.ui-icon-arrowthick-1-e{background-position: -32px -48px;}.ui-icon-arrowthick-1-se{background-position: -48px -48px;}.ui-icon-arrowthick-1-s{background-position: -64px -48px;}.ui-icon-arrowthick-1-sw{background-position: -80px -48px;}.ui-icon-arrowthick-1-w{background-position: -96px -48px;}.ui-icon-arrowthick-1-nw{background-position: -112px -48px;}.ui-icon-arrowthick-2-n-s{background-position: -128px -48px;}.ui-icon-arrowthick-2-ne-sw{background-position: -144px -48px;}.ui-icon-arrowthick-2-e-w{background-position: -160px -48px;}.ui-icon-arrowthick-2-se-nw{background-position: -176px -48px;}.ui-icon-arrowthickstop-1-n{background-position: -192px -48px;}.ui-icon-arrowthickstop-1-e{background-position: -208px -48px;}.ui-icon-arrowthickstop-1-s{background-position: -224px -48px;}.ui-icon-arrowthickstop-1-w{background-position: -240px -48px;}.ui-icon-arrowreturnthick-1-w{background-position: 0 -64px;}.ui-icon-arrowreturnthick-1-n{background-position: -16px -64px;}.ui-icon-arrowreturnthick-1-e{background-position: -32px -64px;}.ui-icon-arrowreturnthick-1-s{background-position: -48px -64px;}.ui-icon-arrowreturn-1-w{background-position: -64px -64px;}.ui-icon-arrowreturn-1-n{background-position: -80px -64px;}.ui-icon-arrowreturn-1-e{background-position: -96px -64px;}.ui-icon-arrowreturn-1-s{background-position: -112px -64px;}.ui-icon-arrowrefresh-1-w{background-position: -128px -64px;}.ui-icon-arrowrefresh-1-n{background-position: -144px -64px;}.ui-icon-arrowrefresh-1-e{background-position: -160px -64px;}.ui-icon-arrowrefresh-1-s{background-position: -176px -64px;}.ui-icon-arrow-4{background-position: 0 -80px;}.ui-icon-arrow-4-diag{background-position: -16px -80px;}.ui-icon-extlink{background-position: -32px -80px;}.ui-icon-newwin{background-position: -48px -80px;}.ui-icon-refresh{background-position: -64px -80px;}.ui-icon-shuffle{background-position: -80px -80px;}.ui-icon-transfer-e-w{background-position: -96px -80px;}.ui-icon-transferthick-e-w{background-position: -112px -80px;}.ui-icon-folder-collapsed{background-position: 0 -96px;}.ui-icon-folder-open{background-position: -16px -96px;}.ui-icon-document{background-position: -32px -96px;}.ui-icon-document-b{background-position: -48px -96px;}.ui-icon-note{background-position: -64px -96px;}.ui-icon-mail-closed{background-position: -80px -96px;}.ui-icon-mail-open{background-position: -96px -96px;}.ui-icon-suitcase{background-position: -112px -96px;}.ui-icon-comment{background-position: -128px -96px;}.ui-icon-person{background-position: -144px -96px;}.ui-icon-print{background-position: -160px -96px;}.ui-icon-trash{background-position: -176px -96px;}.ui-icon-locked{background-position: -192px -96px;}.ui-icon-unlocked{background-position: -208px -96px;}.ui-icon-bookmark{background-position: -224px -96px;}.ui-icon-tag{background-position: -240px -96px;}.ui-icon-home{background-position: 0 -112px;}.ui-icon-flag{background-position: -16px -112px;}.ui-icon-calendar{background-position: -32px -112px;}.ui-icon-cart{background-position: -48px -112px;}.ui-icon-pencil{background-position: -64px -112px;}.ui-icon-clock{background-position: -80px -112px;}.ui-icon-disk{background-position: -96px -112px;}.ui-icon-calculator{background-position: -112px -112px;}.ui-icon-zoomin{background-position: -128px -112px;}.ui-icon-zoomout{background-position: -144px -112px;}.ui-icon-search{background-position: -160px -112px;}.ui-icon-wrench{background-position: -176px -112px;}.ui-icon-gear{background-position: -192px -112px;}.ui-icon-heart{background-position: -208px -112px;}.ui-icon-star{background-position: -224px -112px;}.ui-icon-link{background-position: -240px -112px;}.ui-icon-cancel{background-position: 0 -128px;}.ui-icon-plus{background-position: -16px -128px;}.ui-icon-plusthick{background-position: -32px -128px;}.ui-icon-minus{background-position: -48px -128px;}.ui-icon-minusthick{background-position: -64px -128px;}.ui-icon-close{background-position: -80px -128px;}.ui-icon-closethick{background-position: -96px -128px;}.ui-icon-key{background-position: -112px -128px;}.ui-icon-lightbulb{background-position: -128px -128px;}.ui-icon-scissors{background-position: -144px -128px;}.ui-icon-clipboard{background-position: -160px -128px;}.ui-icon-copy{background-position: -176px -128px;}.ui-icon-contact{background-position: -192px -128px;}.ui-icon-image{background-position: -208px -128px;}.ui-icon-video{background-position: -224px -128px;}.ui-icon-script{background-position: -240px -128px;}.ui-icon-alert{background-position: 0 -144px;}.ui-icon-info{background-position: -16px -144px;}.ui-icon-notice{background-position: -32px -144px;}.ui-icon-help{background-position: -48px -144px;}.ui-icon-check{background-position: -64px -144px;}.ui-icon-bullet{background-position: -80px -144px;}.ui-icon-radio-off{background-position: -96px -144px;}.ui-icon-radio-on{background-position: -112px -144px;}.ui-icon-pin-w{background-position: -128px -144px;}.ui-icon-pin-s{background-position: -144px -144px;}.ui-icon-play{background-position: 0 -160px;}.ui-icon-pause{background-position: -16px -160px;}.ui-icon-seek-next{background-position: -32px -160px;}.ui-icon-seek-prev{background-position: -48px -160px;}.ui-icon-seek-end{background-position: -64px -160px;}.ui-icon-seek-start{background-position: -80px -160px;}.ui-icon-seek-first{background-position: -80px -160px;}.ui-icon-stop{background-position: -96px -160px;}.ui-icon-eject{background-position: -112px -160px;}.ui-icon-volume-off{background-position: -128px -160px;}.ui-icon-volume-on{background-position: -144px -160px;}.ui-icon-power{background-position: 0 -176px;}.ui-icon-signal-diag{background-position: -16px -176px;}.ui-icon-signal{background-position: -32px -176px;}.ui-icon-battery-0{background-position: -48px -176px;}.ui-icon-battery-1{background-position: -64px -176px;}.ui-icon-battery-2{background-position: -80px -176px;}.ui-icon-battery-3{background-position: -96px -176px;}.ui-icon-circle-plus{background-position: 0 -192px;}.ui-icon-circle-minus{background-position: -16px -192px;}.ui-icon-circle-close{background-position: -32px -192px;}.ui-icon-circle-triangle-e{background-position: -48px -192px;}.ui-icon-circle-triangle-s{background-position: -64px -192px;}.ui-icon-circle-triangle-w{background-position: -80px -192px;}.ui-icon-circle-triangle-n{background-position: -96px -192px;}.ui-icon-circle-arrow-e{background-position: -112px -192px;}.ui-icon-circle-arrow-s{background-position: -128px -192px;}.ui-icon-circle-arrow-w{background-position: -144px -192px;}.ui-icon-circle-arrow-n{background-position: -160px -192px;}.ui-icon-circle-zoomin{background-position: -176px -192px;}.ui-icon-circle-zoomout{background-position: -192px -192px;}.ui-icon-circle-check{background-position: -208px -192px;}.ui-icon-circlesmall-plus{background-position: 0 -208px;}.ui-icon-circlesmall-minus{background-position: -16px -208px;}.ui-icon-circlesmall-close{background-position: -32px -208px;}.ui-icon-squaresmall-plus{background-position: -48px -208px;}.ui-icon-squaresmall-minus{background-position: -64px -208px;}.ui-icon-squaresmall-close{background-position: -80px -208px;}.ui-icon-grip-dotted-vertical{background-position: 0 -224px;}.ui-icon-grip-dotted-horizontal{background-position: -16px -224px;}.ui-icon-grip-solid-vertical{background-position: -32px -224px;}.ui-icon-grip-solid-horizontal{background-position: -48px -224px;}.ui-icon-gripsmall-diagonal-se{background-position: -64px -224px;}.ui-icon-grip-diagonal-se{background-position: -80px -224px;}.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl{-moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -khtml-border-top-left-radius: 6px; border-top-left-radius: 6px;}.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr{-moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -khtml-border-top-right-radius: 6px; border-top-right-radius: 6px;}.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl{-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -khtml-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;}.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br{-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; -khtml-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;}.ui-widget-overlay{background: #aaaaaa url(images/ui-bg_flat_75_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:alpha(opacity=30);}.ui-widget-shadow{margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_75_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:alpha(opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px;}.ui-slider{position: relative; text-align: left;}.ui-slider .ui-slider-handle{position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default;}.ui-slider .ui-slider-range{position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0;}.ui-slider-horizontal{height: .8em;}.ui-slider-horizontal .ui-slider-handle{top: -.3em; margin-left: -.6em;}.ui-slider-horizontal .ui-slider-range{top: 0; height: 100%;}.ui-slider-horizontal .ui-slider-range-min{left: 0;}.ui-slider-horizontal .ui-slider-range-max{right: 0;}.ui-slider-vertical{width: .8em; height: 100px;}.ui-slider-vertical .ui-slider-handle{left: -.3em; margin-left: 0; margin-bottom: -.6em;}.ui-slider-vertical .ui-slider-range{left: 0; width: 100%;}.ui-slider-vertical .ui-slider-range-min{bottom: 0;}.ui-slider-vertical .ui-slider-range-max{top: 0;}html{color:#000;background:#fff}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,select,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,button,caption,cite,code,dfn,em,input,optgroup,option,select,strong,textarea,th,var{font:inherit}del,ins{text-decoration:none}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:baseline}sub{vertical-align:baseline}legend{color:#000}body{position: absolute;width: 100%;height: 100%;}#savepanel{position: absolute;z-index: 1;top: -32px;left: 0;}#savebutton{width: 1.5em;width: 24px;height: 1.5em;height: 24px;cursor: pointer;border: none;background-color: none;float: left;}#savepanel .address{font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Droid Sans Mono', 'Consolas', monospace;font-size: 0.8em;font-size: 13px;float: left;margin-left: 5px;margin-top: 4px;}#savepanel .address a{color: white;}#page{position: absolute;height: 80%;width: 90%;top: 10%;left: 5%;}#display{position: absolute;left: 0;top: -1px;height: 100%;width: 50%;background: white;border: solid #fff 1px;border-right: none;-moz-box-shadow: 0 0 50px 5px rgba(255, 255, 255, 0.4);-webkit-box-shadow: 0 0 50px 5px rgba(255, 255, 255, 0.4);box-shadow: 0 0 50px 5px rgba(255, 255, 255, 0.4);border-top-left-radius: 5px;border-bottom-left-radius: 5px;border-top-right-radius: 40px 10px;border-bottom-right-radius: 40px 10px;}#editor{position: absolute;top: -1px;right: 0;height: 100%;width: 50%;border: solid #fff 1px;border-left: none;background: white;border-top-right-radius: 5px;border-bottom-right-radius: 5px;border-top-left-radius: 40px 10px;border-bottom-left-radius: 40px 10px;-moz-box-shadow: 0 0 50px 10px rgba(255, 255, 255, 0.4);-webkit-box-shadow: 0 0 50px 10px rgba(255, 255, 255, 0.4);box-shadow: 0 0 50px 10px rgba(255, 255, 255, 0.4);background: #141414;font-size: 1em;}#editor .ace_gutter{top: -1px;border: solid #fff 1px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-top-left-radius: 40px 10px;border-bottom-left-radius: 40px 10px;}svg{position: absolute;background: #fff;border-top-left-radius: 5px;border-bottom-left-radius: 5px;border-top-right-radius: 40px 10px;border-bottom-right-radius: 40px 10px;-moz-box-shadow: 0 0 50px 10px rgba(255, 255, 255, 0.4);-webkit-box-shadow: 0 0 50px 10px rgba(255, 255, 255, 0.4);box-shadow: 0 0 50px 10px rgba(255, 255, 255, 0.4);}.font-control{position: absolute;top: 0em;right: 1.25em;width: 1em;height: 1em;background-position: 50% 50%;background-repeat: no-repeat;text-indent: -9999px;overflow: hidden;z-index: 10;cursor: pointer;}.increase.font-control{right: 2.25em;background-image: url('http://www.cnblogs.com/images/cnblogs_com/iamzhanglei/plus_alt.png');}.decrease.font-control{background-image: url('http://www.cnblogs.com/images/cnblogs_com/iamzhanglei/minus_alt.png');}.increase.font-control:hover{background-image: url('http://www.cnblogs.com/images/cnblogs_com/iamzhanglei/plus.png');}.decrease.font-control:hover{background-image: url('http://www.cnblogs.com/images/cnblogs_com/iamzhanglei/minus.png');}#slider{visibility: hidden;z-index: 10;width: 25%;-moz-box-shadow: 0 0 10px 4px rgba(255, 255, 255, 0.4);-webkit-box-shadow: 0 0 10px 4px rgba(255, 255, 255, 0.4);box-shadow: 0 0 10px 4px rgba(255, 255, 255, 0.4);}#slider .ui-slider-handle{background: #cb842e;border-color: #784e1b;}#instructions{position: absolute;top: -2em;text-align: right;right: 0;width: 100%;font-size: 0.9em;line-height: 1.35em;color: white;text-decoration: none;font-family: arial, sans-serif;}#aboutandattribution{position: absolute;bottom: -1em;width: 100%;font-size: 0.9em;line-height: 1.35em;color: white;text-decoration: none;font-family: arial, sans-serif;}#aboutandattribution a{color: white;text-decoration: underline;}#attribution{position: absolute;left: 0;}#about{position: absolute;right: 0;}&lt;/style&gt;  &lt;div id="page"&gt;   &lt;div style="color: white" id="savePanel"&gt;&lt;/div&gt;    &lt;div id="display"&gt;&lt;canvas style="border-bottom: #222222 15px solid; border-left: #222222 15px solid; background-color: #cccccc; color: #cccccc; border-top: #222222 15px solid; border-right: #222222 15px solid" id="myCanvas" width="580" height="445"&gt;&lt;/canvas&gt;&lt;/div&gt;    &lt;div id="editor"&gt;&lt;/div&gt;    &lt;div&gt;&lt;a class="increase font-control" href="#"&gt;+&lt;/a&gt; &lt;a class="decrease font-control" href="#"&gt;-&lt;/a&gt; &lt;/div&gt;    &lt;div id="slider"&gt;&lt;/div&gt; &lt;/div&gt; &lt;script src="http://files.cnblogs.com/iamzhanglei/jquery.ui.slider.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/ace.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/theme-twilight.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/mode-javascript.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/cf.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script&gt;$(function () {$("#sidebar").css("display","none");});&lt;/script&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;使用指南&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;基本使用：&lt;/p&gt;  &lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; c=&lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.getElementById(&amp;quot;&lt;span style="color: #8b0000"&gt;myCanvas&lt;/span&gt;&amp;quot;);&lt;br/&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; cxt=c.getContext(&amp;quot;&lt;span style="color: #8b0000"&gt;2d&lt;/span&gt;&amp;quot;);&lt;br/&gt;cxt.fillStyle=&amp;quot;&lt;span style="color: #8b0000"&gt;#FF0000&lt;/span&gt;&amp;quot;;&lt;br/&gt;cxt.beginPath();&lt;br/&gt;cxt.arc(70,18,15,0,&lt;span style="color: #0000ff"&gt;Math&lt;/span&gt;.PI*2,&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);&lt;br/&gt;cxt.closePath();&lt;br/&gt;cxt.fill();&lt;/pre&gt;&lt;p&gt;拷贝至编辑器并修改代码试一试！！&lt;/p&gt;&lt;p&gt;动画支持：&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; canvas = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.getElementById(&amp;quot;&lt;span style="color: #8b0000"&gt;myCanvas&lt;/span&gt;&amp;quot;);&lt;br/&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; ctx = canvas.getContext(&amp;quot;&lt;span style="color: #8b0000"&gt;2d&lt;/span&gt;&amp;quot;);&lt;br/&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; cyc = 100;&lt;br/&gt;ctx.fillStyle = &amp;quot;&lt;span style="color: #8b0000"&gt;#000&lt;/span&gt;&amp;quot;;&lt;br/&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; loadingPosition = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Vector2(200, 200);&lt;br/&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; loadingRadius = 50;&lt;br/&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; intervalAngle = 45;&lt;br/&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; bigCircleRadius = 8;&lt;br/&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; bigCirclePosition = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Vector2(200, 150);&lt;br/&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; drawLoading() {&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i = 0; i &amp;lt; 11; i++) {&lt;br/&gt;        ctx.beginPath();&lt;br/&gt;        ctx.arc(bigCirclePosition.x, bigCirclePosition.y, bigCircleRadius, 0, &lt;span style="color: #0000ff"&gt;Math&lt;/span&gt;.PI * 2, &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);&lt;br/&gt;        ctx.closePath();&lt;br/&gt;        ctx.fill();&lt;br/&gt;        bigCircleRadius -= 1;&lt;br/&gt;        bigCirclePosition.rotateSelf(loadingPosition, 30);&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;span style="color: #0000ff"&gt;CANVASLOOP=setInterval&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;    bigCircleRadius = 10;&lt;br/&gt;    ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br/&gt;    drawLoading();&lt;br/&gt;}, 50);&lt;/pre&gt;&lt;p&gt;拷贝至编辑器并修改代码试一试！！&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;这里值得注意的是，我约定好了loop的名称叫做：CANVASLOOP。一定要使用CANVASLOOP,不然的话在IE下会出现loop叠加混乱的问题。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;代码支持缩放功能(重新打开浏览器会记住上一次的font-size)！试一试右上角的+号和-号！！!要获得很好的体验，请在浏览器F11全屏模式调试编辑代码。&lt;/p&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203272200452416.png" width="596" height="218" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="5"&gt;HAVE FUN!!&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="5"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="5"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="5"&gt;Happy Fun Coding!&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;script id="main"&gt;         var c = document.getElementById("myCanvas");         var cxt = c.getContext("2d");         var grd = cxt.createLinearGradient(0, 0, 175, 50);         grd.addColorStop(0, "#FF0000");         grd.addColorStop(1, "#00FF00");         cxt.fillStyle = grd;         cxt.fillRect(0, 0, 175, 50);    &lt;/script&gt;&lt;script&gt;        $(function () {            window.aceEditor.getSession().setValue(document.getElementById("main").innerHTML);        });    &lt;/script&gt;&lt;script&gt;        Vector2 = function (x, y) {            this.x = x || 0;            this.y = y || 0;        };        Vector2.prototype = {            sub: function (v1, v2) {                this.x = v1.x - v2.x;                this.y = v1.y - v2.y;                return this;            },            rotateSelf: function (p, theta) {                var v = new Vector2();                v.sub(this, p);                theta *= Math.PI / 180;                var R = [[Math.cos(theta), -Math.sin(theta)], [Math.sin(theta), Math.cos(theta)]];                this.x = p.x + R[0][0] * v.x + R[0][1] * v.y;                this.y = p.y + R[1][0] * v.x + R[1][1] * v.y;            }        };    &lt;/script&gt;&lt;img src="http://www.cnblogs.com/iamzhanglei/aggbug/2420190.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/28/2420190.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/iamzhanglei/archive/2012/03/27/2419268.html</id><title type="text">HTML5 Canvas开发者和读者的福音</title><summary type="text">演示今天看到可见即可得的编程 ，其中是在svg中实现的。理所当然，它可以搬到 canvas当中，而且支持canvas动画播放，而不是仅仅是静态的svg。效果如下所示: Your browser does not support the canvas element. 修改颜色(fillsStyle)或者count或者angle等值试试！var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext("2d");function taiji(x, y, radius, a</summary><published>2012-03-27T04:25:00Z</published><updated>2012-03-27T04:25:00Z</updated><author><name>【当耐特砖家】</name><uri>http://www.cnblogs.com/iamzhanglei/</uri></author><link rel="alternate" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/27/2419268.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/27/2419268.html"/><content type="html">&lt;p&gt;&lt;strong&gt;演示&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;今天看到&lt;a id="cb_post_title_url" href="http://www.cnblogs.com/skyoo/archive/2012/03/26/2418744.html"&gt;&lt;font color="#770000"&gt;可见即可得的编程&lt;/font&gt;&lt;/a&gt; ，其中是在svg中实现的。理所当然，它可以搬到 canvas当中，而且支持canvas动画播放，而不是仅仅是静态的svg。效果如下所示:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;canvas style="border: 15px solid rgb(34, 34, 34); color: rgb(204, 204, 204); background-color: rgb(204, 204, 204);" id="myCanvas" height="450" width="400"&gt; Your browser does not support the canvas element. &lt;/canvas&gt;&lt;/p&gt;&lt;p&gt;修改颜色(fillsStyle)或者count或者angle等值试试！&lt;br /&gt;&lt;textarea id="code" onchange="restart()" onkeyup="restart()" cols="70" rows="20"&gt;var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext("2d");function taiji(x, y, radius, angle, wise) {angle = angle || 0;wise = wise ? 1 : -1;ctx.save();ctx.translate(x, y);ctx.rotate(angle);ctx.fillStyle = '#000';ctx.beginPath();ctx.arc(0, 0, radius, 0, Math.PI, true);ctx.fill();ctx.beginPath();ctx.fillStyle = '#fff';ctx.arc(0, 0, radius, 0, Math.PI, false);ctx.fill();ctx.fillStyle = '#fff';ctx.beginPath();ctx.arc(wise * -0.5 * radius, 0, radius / 2, 0, Math.PI * 2, true);ctx.fill();ctx.beginPath();ctx.fillStyle = '#000';ctx.arc(wise * +0.5 * radius, 0, radius / 2, 0, Math.PI * 2, false);ctx.arc(wise * -0.5 * radius, 0, radius / 10, 0, Math.PI * 2, true);ctx.fill();ctx.beginPath();ctx.fillStyle = '#fff';ctx.arc(wise * +0.5 * radius, 0, radius / 10, 0, Math.PI * 2, true);ctx.fill();ctx.restore();}var angle = 0;var count = 360;loop = setInterval(function () {beginTag = true;ctx.clearRect(0, 0, canvas.width, canvas.height);taiji(200, 200, 200, Math.PI * (angle / count) * 2, true);taiji(350, 350, 50, Math.PI * ((count - angle) / count) * 2, false);angle = (angle + 5) % count;}, 50);&lt;/textarea&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;script&gt; 　 　 var loop; function restart() { beginTag = false; clearInterval(loop); } var beginTag = false; setInterval("executeCode()", 500) function executeCode() { try { if (!beginTag) { eval(document.getElementById('code').value); } } catch (e) { alert(e) } } 　 &lt;/script&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;技术实现&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;循环执行富文本中的code:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setInterval("executeCode()",&amp;nbsp;500)&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt;&amp;nbsp;executeCode()&amp;nbsp;{&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&amp;nbsp;(!beginTag)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eval(document.getElementById('code').value);&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;catch&lt;/span&gt;&amp;nbsp;(e)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;半秒执行一次，半秒以内的延迟是可以接受的。这里有一个beginTag是标志富文本中代码的循环是否已经开始执行，倘若已经开始执行则不再执行外部的loop。&lt;/p&gt;&lt;p&gt;事件监听：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;textarea&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="code"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;nbsp;onkeyup&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="restart()"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;nbsp;rows&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="20"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;nbsp;cols&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="70"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;富文本框监听用户的键盘事件，如果发生，则重新执行code:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;loop;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;restart()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;beginTag&amp;nbsp;=&amp;nbsp;false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clearInterval(loop);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;其中该loop定义在富文本框的代码当中：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loop&amp;nbsp;=&amp;nbsp;setInterval(&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt;&amp;nbsp;()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;beginTag&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.clearRect(0,&amp;nbsp;0,&amp;nbsp;c2.width,&amp;nbsp;c2.height);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;taiji(200,&amp;nbsp;200,&amp;nbsp;200,&amp;nbsp;Math.PI&amp;nbsp;*&amp;nbsp;(angle&amp;nbsp;/&amp;nbsp;count)&amp;nbsp;*&amp;nbsp;2,&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;true&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;taiji(350,&amp;nbsp;350,&amp;nbsp;50,&amp;nbsp;Math.PI&amp;nbsp;*&amp;nbsp;((count&amp;nbsp;-&amp;nbsp;angle)&amp;nbsp;/&amp;nbsp;count)&amp;nbsp;*&amp;nbsp;2,&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;angle&amp;nbsp;=&amp;nbsp;(angle&amp;nbsp;+&amp;nbsp;5)&amp;nbsp;%&amp;nbsp;count;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;50);&lt;/div&gt;&lt;/div&gt;对于富文本框中，代码不高亮的问题，有没有什么好的想法？ &lt;img src="http://www.cnblogs.com/iamzhanglei/aggbug/2419268.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/27/2419268.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/iamzhanglei/archive/2012/03/26/2417110.html</id><title type="text">HTML5 【IE9割绳子】制作教程来袭&amp;middot;&amp;middot;&amp;middot;&amp;middot;</title><summary type="text">回顾 与“Angry Birds”一样，2010年发布的“割绳子”是一款火爆的手机游戏，首先推出的是iOS版，于去年6月份推出Android版。它的游戏内容是：一个叫Om Nom的绿怪兽饿了，你必须喂他糖果，而要得到糖果，你要先割断绳子以及操纵安全气袋和泡泡，过程中还要收集星星来获取额外积分。 为了进一步宣传IE9和华丽的Web应用程序，微软与该款游戏的开发商ZeptoLab联合推出了HTML...</summary><published>2012-03-26T00:04:00Z</published><updated>2012-03-26T00:04:00Z</updated><author><name>【当耐特砖家】</name><uri>http://www.cnblogs.com/iamzhanglei/</uri></author><link rel="alternate" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/26/2417110.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/26/2417110.html"/><content type="html">&lt;p&gt;&lt;strong&gt;回顾&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;与“Angry Birds”一样，2010年发布的“&lt;strong&gt;割绳子&lt;/strong&gt;”是一款火爆的手机游戏，首先推出的是iOS版，于去年6月份推出Android版。它的游戏内容是：一个叫Om Nom的绿怪兽饿了，你必须喂他糖果，而要得到糖果，你要先割断绳子以及操纵安全气袋和泡泡，过程中还要收集星星来获取额外积分。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;为了进一步宣传IE9和华丽的Web应用程序，微软与该款游戏的开发商ZeptoLab联合推出了HTML 5版“割绳子”游戏。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;尽管这款游戏是为IE 9开发的，但它可以在任何兼容HTML 5的浏览器上运行。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;背后的开发故事&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;在IE9割绳子推出一段时间后，微软发布了“《割绳子》HTML 5版背后的开发故事”一文。在此文当中，除了推荐了一个PxLoader资源加载库 和一堆开发工具和平台（Windows8、IE9、Visual Web Developer 2010 Express），没有透露一丁点对开发人员有价值的东西。而作为广大的技术狂热份子们，更关心的是GUI组件、游戏引擎、物理引擎、绳子、机关、气囊等物理模型的算法、引擎之间的集成等问题。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;所以本人打算从&lt;strong&gt;&lt;font color="#ff0000"&gt;零&lt;/font&gt;&lt;/strong&gt;开始，一步一步带领大家制作一个完整的IE9割''绳子''以及制作其相关的物理引擎。如果有可能的话，在IE9割绳子基础上做一些有趣的扩展。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;教程目录&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;其中包括：&lt;/font&gt;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;（1）&lt;/font&gt;&lt;/strong&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/26/2417110.html"&gt;&lt;strong&gt;&lt;font size="4"&gt;HTML5 【IE9割绳子】制作教程来袭····&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;font size="4"&gt;（2）游戏框架搭建&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;font size="4"&gt;（3）资源加载&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;（4）动感气泡loading制作&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;（5）开场动画&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;font size="4"&gt;（6）菜单制作&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;font size="4"&gt;（7）对象建立&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;font size="4"&gt;（8）碰撞检测&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;font size="4"&gt;（9）游戏音效&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;font size="4"&gt;（10）鼠标控制&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="4"&gt;&lt;b&gt;（&lt;/b&gt;&lt;b&gt;11&lt;/b&gt;&lt;b&gt;）绳子&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="4"&gt;&lt;b&gt;（&lt;/b&gt;&lt;b&gt;12&lt;/b&gt;&lt;b&gt;）气球&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="4"&gt;&lt;b&gt;（&lt;/b&gt;&lt;b&gt;13&lt;/b&gt;&lt;b&gt;）喷气囊&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="4"&gt;&lt;b&gt;（&lt;/b&gt;&lt;b&gt;14&lt;/b&gt;&lt;b&gt;）机关&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;（15）物理引擎制作&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="4"&gt;&lt;b&gt;（&lt;/b&gt;&lt;b&gt;16&lt;/b&gt;&lt;b&gt;）集成物理引擎&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;（17）关卡&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;（18）可玩性扩展&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font size="4"&gt;其中【碰撞检测】将会拆成几篇分别介绍，分别如下所示：&lt;/font&gt;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;球与青蛙、气泡、星星碰撞检测&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;球与青蛙、气泡、星星碰撞反应&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;鼠标与绳子、气囊和气泡碰撞检测&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;鼠标与绳子、气囊和气泡碰撞反应&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font size="4"&gt;其中的【物理引擎制作】将会拆分为十四篇分别介绍，分别如下所示：&lt;/font&gt;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;概述&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;面向对象编程&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;建立基本对象&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;集成单元测试框架&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;集成图形化输出接口&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;碰撞检测&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;AABB&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;OBB&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;碰撞反应&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;重叠处理&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;静止接触（待定）&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;物体休眠算法（待定）&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;关节、机关、绳子、气球、汽车&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;贴图&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;由于割绳子不同于《愤怒的小鸟》，其游戏整个过程不包含静止接触接触的状况，所以静止接触和物体休眠算法优先级最低。也就是说：不包含这两项功能的物理引擎也可以满足割绳子游戏的正常制作。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Hello cut the rope在线演示&lt;/strong&gt;&lt;/p&gt; &lt;canvas style="border-bottom: #222 5px solid; border-left: #222 5px solid; border-top: #222 5px solid; border-right: #222 5px solid" id="testCanvas" height="384" width="580"&gt;请使用现代浏览器观看在线演示！ &lt;/canvas&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/easel0308.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/loader.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://files.cnblogs.com/iamzhanglei/cp.js"&gt;&lt;/script&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;素材&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203260819343107.png" width="558" height="507" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;素材已经从IE9割绳子官网全部拷贝下来，&lt;strong&gt;我已经准备好了，你准备好了吗？&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/iamzhanglei/aggbug/2417110.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/26/2417110.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/iamzhanglei/archive/2012/03/22/2410996.html</id><title type="text">HTML5动感菜单来了</title><summary type="text">简介 上篇tween阐之未尽，今日继续。 上篇使用tween来制作对联下滑效果，提及tween可以用于各种开场动画、游戏画面切换等场景当中。其实tween的一个重要应用场景还包括----动感菜单制作。 一款好的游戏必须搭配一个体验很好的导航菜单,tween可以帮助我们实现。如下图所示，这是小鸟的菜单，本篇实现一个比小鸟还要酷炫的菜单。 菜单分类 菜单是游戏当中必须的元素，是游戏中出现...</summary><published>2012-03-22T00:59:00Z</published><updated>2012-03-22T00:59:00Z</updated><author><name>【当耐特砖家】</name><uri>http://www.cnblogs.com/iamzhanglei/</uri></author><link rel="alternate" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/22/2410996.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/22/2410996.html"/><content type="html">&lt;p&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;上篇tween阐之未尽，今日继续。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;上篇使用tween来制作对联下滑效果，提及tween可以用于各种开场动画、游戏画面切换等场景当中。其实tween的一个重要应用场景还包括----动感菜单制作。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;一款好的游戏必须搭配一个体验很好的导航菜单,tween可以帮助我们实现。如下图所示，这是小鸟的菜单，本篇实现一个比小鸟还要酷炫的菜单。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203220853186596.png" width="679" height="362" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;菜单分类&lt;/strong&gt;&lt;/p&gt;  &lt;font size="4"&gt;菜单是游戏当中必须的元素，是游戏中出现在显示屏上的选项列表，如开始游戏、关于作者、退出游戏、游戏设置等等，这些都是游戏中必备的元素。每款游戏的菜单风格也有较大差异。&lt;/font&gt;&lt;font size="4"&gt;菜单一般是由可点击的文字或者图片区域组成。作为一款canvas游戏，菜单可以有两种形式：&lt;/font&gt;&lt;font size="4"&gt;（1）Dom对象的按钮&lt;/font&gt;&lt;font size="4"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; a.button标签&lt;/font&gt;&lt;font size="4"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; b.img标签&lt;/font&gt;&lt;font size="4"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.a标签 &lt;/font&gt;&lt;font size="4"&gt;（2）canvas中的按钮&lt;/font&gt;&lt;font size="4"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; a.图片按钮&lt;/font&gt;&lt;font size="4"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; b.文字按钮&lt;/font&gt;&lt;p&gt;&lt;font size="4"&gt;那么我们什么时候使用canvas中的按钮，什么时候使用Dom对象的按钮呢？&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;在一款完整的游戏当中，哪些使用dom对象，哪些使用canvas中的元素对象，这要因游戏而议。有的性能洁癖的开发者，认为canvas只负责显示游戏内容，菜单、弹出层、泡泡提示什么的都使用dom对象。但其实把所有东西都塞进canvas对性能影响不大、微乎其微，只要你的游戏引擎（canvas引擎）做好了缓存层。有的开发者是想绕过dom事件过度给canvas的流程，以及避开图片跨域、精确像素等麻烦事，所以直接使用dom对象。就菜单、弹出、泡泡等元素的粒子个数相对于游戏中丰富的内容，其粒子个数实在是微乎其微、可以忽略不计。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;所以一般不使用canvas中元素菜单的原因如下：&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;1.性能洁癖&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;2.没有统一的GUI组建（比如button、silder、menu、popup、tip、progressbar、loading），而dom对象中都有成熟的插件。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;由此也可以看出，这是html5相对于flash来说的一个优势所在，因为html5多了一种选择。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;HTML5动感菜单&lt;/strong&gt;&lt;/p&gt;&lt;canvas style="background-color: rgb(135,206,235)" id="gameCanvas" width="480" height="320"&gt;&lt;/canvas&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/easel0308.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/loader.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/0322pm.js"&gt;    &lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/tween.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script&gt;    main();&lt;/script&gt;&lt;p&gt;&lt;font size="4"&gt;Have Fun!明天继续&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/iamzhanglei/aggbug/2410996.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/22/2410996.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/iamzhanglei/archive/2012/03/20/2406926.html</id><title type="text">HTML5对联来了</title><summary type="text">今天看到园子里的运动学基础，里面介绍了一些基本的缓动效果，突发创意利用tween效果制作了HTML5对联。 对联 对联，又称楹联或对子，是写在纸、布上或刻在竹子、木头、柱子上的对偶语句言简意深，对仗工整，平仄协调，是一字一音的中文语言独特的艺术形式。对联相传起于五代后蜀主孟昶。它是中华民族的文化瑰宝。 使用计算机制作对联作用如下： 1.整合入游戏，使其参入中国风； 2.广告视频制作； 3.网站左右悬挂，比如春节过年、圣诞、情人节、程序员节（1024）等节日悬挂相应的问候对联。 缓动 缓动的最大用处就是应用在设计的运动表现上，他可以结合物理...</summary><published>2012-03-19T23:51:00Z</published><updated>2012-03-19T23:51:00Z</updated><author><name>【当耐特砖家】</name><uri>http://www.cnblogs.com/iamzhanglei/</uri></author><link rel="alternate" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/20/2406926.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/20/2406926.html"/><content type="html">&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;font size="4"&gt;今天看到园子里的运动学基础，里面介绍了一些基本的缓动效果，突发创意利用tween效果制作了HTML5对联。&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;对联&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;对联，又称楹联或对子，是写在纸、布上或刻在竹子、木头、柱子上的对偶语句言简意深，对仗工整，平仄协调，是一字一音的中文语言独特的艺术形式。对联相传起于五代后蜀主孟昶。它是中华民族的文化瑰宝。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; margin: 0px auto; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: none; display: block;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203200732484681.png" width="311" height="315" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;使用计算机制作对联作用如下：&lt;/font&gt;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;1.整合入游戏，使其参入中国风；&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;2.广告视频制作；&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;3.网站左右悬挂，比如春节过年、圣诞、情人节、程序员节（1024）等节日悬挂相应的问候对联。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;缓动&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;缓动的最大用处就是应用在设计的运动表现上，他可以结合物理，数学等原理真实地模拟显示生活中的运动现象。缓动还用于各种开场动画、游戏画面切换等场景当中。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;flash、XNA、silverlight、HTML5、C++等各语言平台都有成熟的缓动库。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;strong&gt;缓动函数&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;利用缓动函数可将自定义数学公式应用于动画。 例如，您可能希望某对象真实地弹跳或其行为如同在弹簧上一样。 您可以使用关键帧动画甚至&lt;strong&gt;&lt;font color="#ff0000"&gt; To/wait/To/wait&amp;#183;&amp;#183;&amp;#183;&amp;#183;&amp;#183;&lt;/font&gt;&lt;/strong&gt;动画来实现&lt;font color="#ff0000"&gt;&lt;strong&gt;伪&lt;/strong&gt;&lt;/font&gt;积分操作，大致模拟这些效果，但可能需要执行大量的工作，并且与使用数学公式相比动画的精确性将降低。所以：&lt;/font&gt;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;在没有大量的粒子并且粒子之间没有相互作用的情况之下，推荐使用缓动函数。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font size="4"&gt;一般成熟缓动库都包含下列这些缓动函数（同时开发开发者自定义缓动算法），方便开发者来创建常见效果。&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;     &lt;p&gt;&lt;font size="4"&gt;BackEase：在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动。&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p&gt;&lt;font size="4"&gt;BounceEase：创建弹跳效果。&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p&gt;&lt;font size="4"&gt;CircleEase：创建使用循环函数加速和/或减速的动画。&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p&gt;&lt;font size="4"&gt;CubicEase：创建使用公式 &lt;em&gt;f&lt;/em&gt;(&lt;em&gt;t&lt;/em&gt;) = &lt;em&gt;t&lt;/em&gt;3 加速和/或减速的动画。&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p&gt;&lt;font size="4"&gt;ElasticEase：创建类似于弹簧在停止前来回振荡的动画。&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p&gt;&lt;font size="4"&gt;ExponentialEase：创建使用指数公式加速和/或减速的动画。&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p&gt;&lt;font size="4"&gt;PowerEase：创建使用公式 &lt;em&gt;f&lt;/em&gt;(&lt;em&gt;t&lt;/em&gt;) = &lt;em&gt;t&lt;/em&gt;p（其中，p 等于 Power属性）加速和/或减速的动画。&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p&gt;&lt;font size="4"&gt;QuadraticEase：创建使用公式 &lt;em&gt;f&lt;/em&gt;(&lt;em&gt;t&lt;/em&gt;) = &lt;em&gt;t&lt;/em&gt;2 加速和/或减速的动画。&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p&gt;&lt;font size="4"&gt;QuarticEase：创建使用公式 &lt;em&gt;f&lt;/em&gt;(&lt;em&gt;t&lt;/em&gt;) = &lt;em&gt;t&lt;/em&gt;4 加速和/或减速的动画。&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p&gt;&lt;font size="4"&gt;QuinticEase：创建使用公式 &lt;em&gt;f&lt;/em&gt;(&lt;em&gt;t&lt;/em&gt;) = &lt;em&gt;t&lt;/em&gt;5 加速和/或减速的动画。&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p&gt;&lt;font size="4"&gt;SineEase：创建使用正弦公式加速和/或减速的动画。&lt;/font&gt;&lt;/p&gt;&lt;/li&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;HTML5对联在线演示&lt;/strong&gt;&lt;/p&gt; &lt;script src="http://files.cnblogs.com/iamzhanglei/easel0308.js"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/tween.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/loader.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/0319demo.js" type="text/javascript"&gt;&lt;/script&gt;&lt;canvas style="background-color: rgb(0, 0, 0);" id="canvas1" height="500" width="500"&gt;&lt;/canvas&gt;&lt;script&gt;        loadImage();    &lt;/script&gt; &lt;img src="http://www.cnblogs.com/iamzhanglei/aggbug/2406926.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/20/2406926.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/iamzhanglei/archive/2012/03/12/2391758.html</id><title type="text">HTML5错误的绳子算法</title><summary type="text">var line = function (p1, p2, length, g) { this.initialize(p1, p2, length, g); } line.prototype = { initialize: function (p1, p2, length, g) { this.p1 = p1; this.p2 = p2; this.length = length; ...</summary><published>2012-03-12T06:31:00Z</published><updated>2012-03-12T06:31:00Z</updated><author><name>【当耐特砖家】</name><uri>http://www.cnblogs.com/iamzhanglei/</uri></author><link rel="alternate" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/12/2391758.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/12/2391758.html"/><content type="html">&lt;input id="Button1" onclick="init()" value="请猛击这里！！！！！！！！！！！！！！！！" type="button"&gt; &lt;div class="canvasHolder"&gt;&lt;canvas id="testCanvas" height="580" width="380"&gt;&lt;/canvas&gt;&lt;/div&gt;  &lt;br /&gt; &lt;script src="http://files.cnblogs.com/iamzhanglei/easel0308.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/Vector2.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script&gt;        var line = function (p1, p2, length, g) {            this.initialize(p1, p2, length, g);        }        line.prototype = {            initialize: function (p1, p2, length, g) {                this.p1 = p1;                this.p2 = p2;                this.length = length;                this.g = g;            },            draw: function () {                var centerPoint = new Vector2((this.p1.x + this.p2.x) / 2, (this.p1.y + this.p2.y) / 2);                var reduceLength = this.length - (this.p1.distanceTo(this.p2));                var nv = new Vector2().sub(this.p1, this.p2).normalize();                centerPoint.addSelf(nv.vertical().multiplyScalar(reduceLength / 2));                this.controlPoint = new Vector2(Math.abs(centerPoint.x), centerPoint.y + this.g);                //            }        }        var stage;        var shipFlame;        var c;        var rect;        var i = 300;        var j = 200;        var l;        function init() {            var canvas = document.getElementById("testCanvas");            stage = new Stage(canvas);            Ticker.addListener(window);            Ticker.setFPS(30);        }        function tick() {            l = new line(new Vector2(100, 130), new Vector2(70, i), 200, 60);            if (l.p1.distanceTo(l.p2) &lt; 200) {                i--;                stage.removeAllChildren();                l.draw();                var g = new Graphics();                g.setStrokeStyle(6, "round", "round")                g.beginStroke("#000");                if (l.p2.y &gt; l.controlPoint.y + 15) {                }                g.drawCircle(l.p2.x, i, 12);                g.moveTo(l.p1.x, l.p1.y).bezierCurveTo(l.controlPoint.x, l.controlPoint.y, l.controlPoint.x, l.controlPoint.y, l.p2.x, l.p2.y);                var s = new Shape(g);                s.x = 100;                s.y = 100;                stage.addChild(s);                stage.update();            }        }       &lt;/script&gt;  &lt;pre style='margin: 0em; width: 100%; font-family: consolas,"Courier New",courier,monospace; font-size: 15px; background-color: rgb(251, 251, 251);'&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; line = &lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; (p1, p2, &lt;span style="color: rgb(0, 0, 255);"&gt;length&lt;/span&gt;, g) {&lt;br/&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.initialize(p1, p2, &lt;span style="color: rgb(0, 0, 255);"&gt;length&lt;/span&gt;, g);&lt;br/&gt;        }&lt;br/&gt;        line.&lt;span style="color: rgb(0, 0, 255);"&gt;prototype&lt;/span&gt; = {&lt;br/&gt;            initialize: &lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; (p1, p2, &lt;span style="color: rgb(0, 0, 255);"&gt;length&lt;/span&gt;, g) {&lt;br/&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.p1 = p1;&lt;br/&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.p2 = p2;&lt;br/&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.&lt;span style="color: rgb(0, 0, 255);"&gt;length&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;length&lt;/span&gt;;&lt;br/&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.g = g;&lt;br/&gt;            },&lt;br/&gt;            computeControlPoint: &lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; () {&lt;br/&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; centerPoint = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Vector2((&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.p1.x + &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.p2.x) / 2, (&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.p1.y + &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.p2.y) / 2);&lt;br/&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; reduceLength = &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.&lt;span style="color: rgb(0, 0, 255);"&gt;length&lt;/span&gt; - (&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.p1.distanceTo(&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.p2));&lt;br/&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; nv = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Vector2().sub(&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.p1, &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.p2).normalize();&lt;br/&gt;                centerPoint.addSelf(nv.vertical().multiplyScalar(reduceLength / 2));&lt;br/&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.controlPoint = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Vector2(&lt;span style="color: rgb(0, 0, 255);"&gt;Math&lt;/span&gt;.abs(centerPoint.x), centerPoint.y + &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.g);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; stage,l, i = 300;&lt;br/&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; init() {&lt;br/&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; canvas = &lt;span style="color: rgb(0, 0, 255);"&gt;document&lt;/span&gt;.getElementById("&lt;span style="color: rgb(139, 0, 0);"&gt;testCanvas&lt;/span&gt;");&lt;br/&gt;            stage = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Stage(canvas);&lt;br/&gt;            Ticker.addListener(&lt;span style="color: rgb(0, 0, 255);"&gt;window&lt;/span&gt;);&lt;br/&gt;            Ticker.setFPS(30);&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; tick() {&lt;br/&gt;            l = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; line(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Vector2(100, 130), &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Vector2(70, i), 200, 50);&lt;br/&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (l.p1.distanceTo(l.p2) &amp;lt; l.&lt;span style="color: rgb(0, 0, 255);"&gt;length&lt;/span&gt;) {&lt;br/&gt;                i--;&lt;br/&gt;                stage.removeAllChildren();&lt;br/&gt;                l.computeControlPoint();&lt;br/&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; g = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Graphics();&lt;br/&gt;                g.setStrokeStyle(6, "&lt;span style="color: rgb(139, 0, 0);"&gt;round&lt;/span&gt;", "&lt;span style="color: rgb(139, 0, 0);"&gt;round&lt;/span&gt;")&lt;br/&gt;                g.beginStroke("&lt;span style="color: rgb(139, 0, 0);"&gt;#000&lt;/span&gt;");&lt;br/&gt;                g.drawCircle(l.p2.x, i, 12);&lt;br/&gt;                g.&lt;span style="color: rgb(0, 0, 255);"&gt;moveTo&lt;/span&gt;(l.p1.x, l.p1.y).bezierCurveTo(l.controlPoint.x, l.controlPoint.y, l.controlPoint.x, l.controlPoint.y, l.p2.x, l.p2.y);&lt;br/&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; s = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Shape(g);&lt;br/&gt;                s.x = 100;&lt;br/&gt;                s.y = 100;&lt;br/&gt;                stage.addChild(s);&lt;br/&gt;                stage.update();&lt;br/&gt;            }&lt;br/&gt;        }&lt;/pre&gt; &lt;img src="http://www.cnblogs.com/iamzhanglei/aggbug/2391758.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/12/2391758.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/iamzhanglei/archive/2012/03/06/2381087.html</id><title type="text">HTML5热门游戏制作---没有99美元的Impact也行</title><summary type="text">Impact 简介 Impact is a JavaScript Game Engine that allows you to develop stunning HTML5 Games for desktop and mobile browsers. Impact 一款让开发者在桌面浏览器和移动终端浏览器开发优秀的HTML5游戏的javascript游戏引擎。 官网地址：http://impactjs.com/ 售价：99美元 其中的最受欢迎且耳熟能详的莫过于下面这款： 这是一个打字射击游戏，该游戏被国外很多网站评选为二十款优秀游戏之一。综合分析了一下该款游戏，总体感觉...</summary><published>2012-03-06T00:38:00Z</published><updated>2012-03-06T00:38:00Z</updated><author><name>【当耐特砖家】</name><uri>http://www.cnblogs.com/iamzhanglei/</uri></author><link rel="alternate" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/06/2381087.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/06/2381087.html"/><content type="html">&lt;p&gt;&lt;strong&gt;   &lt;p&gt;Impact 简介&lt;/p&gt; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;Impact is a JavaScript Game Engine that allows you to develop stunning HTML5 Games for desktop and mobile browsers.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;Impact 一款让开发者在桌面浏览器和移动终端浏览器开发优秀的HTML5游戏的javascript游戏引擎。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;官网地址：&lt;/font&gt;&lt;a href="http://impactjs.com/"&gt;&lt;font size="4"&gt;http://impactjs.com/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;售价：99美元&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;其中的最受欢迎且耳熟能详的莫过于下面这款：&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; margin: 0px auto; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: none; display: block;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203052236341515.png" width="594" height="256" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;这是一个打字射击游戏，该游戏被国外很多网站评选为二十款优秀游戏之一。综合分析了一下该款游戏，总体感觉----注重细节。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;游戏技术要素&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;1.资源加载和进度显示，这HTML5游戏中很重要的一个元素。当然也可以使用loading的方式，如：&lt;/font&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2011/12/07/2279576.html"&gt;&lt;font size="4"&gt;HTML5实验室【四十一】--怎么把CanvasLoading插件嵌入你的游戏&lt;/font&gt;&lt;/a&gt;&lt;font size="4"&gt;。或者loading配合进度条，这给玩家的体验最好了。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; margin: 0px auto; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: none; display: block;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203052236385263.png" width="201" height="233" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;不过还有一种最好的方式就是，预先加载一个无聊的小游戏，然后让玩家打发loading期间的时间。比如新浪微博中的很多微游戏，都提供了loading期间打地鼠的游戏。如下图所示：&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; margin: 0px auto; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: none; display: block;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/20120305223643765.png" width="317" height="283" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;下面是游戏加载的进度条，上面是打地鼠游戏。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;菜单&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;如下图所示：&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; margin: 0px auto; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: none; display: block;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203052236496616.png" width="340" height="561" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;细节如图标注所示，另外文字menu的鼠标事件精确到矩形区域，而不是像素，这点很重要。就像我以前做的那款3D贪吃蛇，鼠标事件精确到文字，这样的用户体验非常不好，应该是立方体。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;爆炸效果&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: left; display: inline;background-image: none;" title="image" border="0" alt="image" align="left" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203052236508468.png" width="210" height="151" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: left; display: inline;background-image: none;" title="image" border="0" alt="image" align="left" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203052236524301.png" width="190" height="139" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: left; display: inline;background-image: none;" title="image" border="0" alt="image" align="left" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203052236547101.png" width="249" height="148" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: left; display: inline;background-image: none;" title="image" border="0" alt="image" align="left" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203052236581688.png" width="112" height="82" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;如图所示，该款游戏的爆炸不是固定不变使用连续的图片。而是利用3张图片，随机运动+旋转组成的，改细节也是一个亮点。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;发射动画&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: left; display: inline;background-image: none;" title="image" border="0" alt="image" align="left" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203052237026591.png" width="99" height="32" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;如上图所示，在飞船发射子弹的过程当中，不是不动的，而是有一个发射的动画。这在很多射击类游戏中都没有考虑。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;关卡过度动画及网格动态背景&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; margin: 0px auto; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: none; display: block;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203052237046393.png" width="265" height="399" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;不使用Impact&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;这是我不使用Impact制作的类似的游戏（我也很注重细节&lt;/font&gt;&lt;img class="wlEmoticon wlEmoticon-smile" alt="微笑" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203052237069260.png" /&gt;）：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;加载游戏：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; margin: 0px auto; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: none; display: block;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/2012030600113899.png" width="241" height="61" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;菜单：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; margin: 0px auto; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: none; display: block;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203060011398048.png" width="229" height="171" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;扫射与爆炸：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; margin: 0px auto; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: none; display: block;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203060822413790.png" width="357" height="630" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;网格动态背景&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-width: 0px; margin: 0px auto; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: none; display: block;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201203/201203060822436068.png" width="362" height="626" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;当粒子很多的时候，谷歌浏览器也可以达到40帧以上，IE9和IE10表现良好，一直都在&lt;strong&gt;60&lt;/strong&gt;帧以上&lt;/font&gt;。 &lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;在线演示(AD+J)&lt;/strong&gt;&lt;/p&gt; &lt;script src="http://files.cnblogs.com/iamzhanglei/easel.js" type="text/javascript"&gt;&lt;/script&gt;  &lt;div style="background-color: #25272b;"&gt;&lt;canvas style="border-width: 0px; margin: 0px auto; padding-top: 0px; padding-right: 0px; padding-left: 0px; float: none; display: block;background-image: none; background-color: black;" id="canvas" height="640" width="360"&gt;   &lt;div id="nocanvas"&gt;To play this game you need a good Browser, like &lt;a href="http://www.opera.com/"&gt;Opera&lt;/a&gt;, &lt;a href="http://www.google.com/chrome"&gt;Chrome&lt;/a&gt;, &lt;a href="http://www.iefans.net/"&gt;IE9+&lt;/a&gt;, &lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt; or &lt;a href="http://www.apple.com/safari/"&gt;Safari&lt;/a&gt;. &lt;/div&gt; &lt;/canvas&gt;&lt;/div&gt; &lt;script src="http://files.cnblogs.com/iamzhanglei/loader.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script src="http://files.cnblogs.com/iamzhanglei/sg4.js" type="text/javascript"&gt;&lt;/script&gt;  &lt;p&gt;&lt;font size="4"&gt;Have Fun!&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/iamzhanglei/aggbug/2381087.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2012/03/06/2381087.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/iamzhanglei/archive/2012/02/27/2368566.html</id><title type="text">你必须知道的【闭包】陷阱和案例</title><summary type="text">闭包 In some languages, a closure may occur when a function is defined within another function, and the inner function refers to local variables of the outer function. At run-time, when the outer fun...</summary><published>2012-02-26T23:39:00Z</published><updated>2012-02-26T23:39:00Z</updated><author><name>【当耐特砖家】</name><uri>http://www.cnblogs.com/iamzhanglei/</uri></author><link rel="alternate" href="http://www.cnblogs.com/iamzhanglei/archive/2012/02/27/2368566.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/iamzhanglei/archive/2012/02/27/2368566.html"/><content type="html">&lt;p&gt;&lt;strong&gt;闭包&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In some languages, a closure may occur when a function is defined within another function, and the inner function refers to local variables of the outer function. &lt;/p&gt;  &lt;p&gt;At run-time, when the outer function executes, a closure is formed, consisting of the inner function’s code and references (the upvalues) to any variables of the outer function required by the closure.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;翻译：&lt;/p&gt;  &lt;p&gt;在一些编程语言当中，闭包发生&amp;#160; ：在一个函数内部定义了另外一个函数，并且内部的函数引用了外部函数的本地变量。&lt;/p&gt;  &lt;p&gt;在运行的时候，当外部函数执行，这个时候形成了一个闭包，由内部函数的代码和对外部函数任意变量引用组成，这写引用都依赖于此闭包。    &lt;br /&gt;&lt;/p&gt;  &lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;&lt;span style="color: #008000"&gt;// ECMAScript &lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; f, g; &lt;br/&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; foo() { &lt;br/&gt;    &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; x = 0; &lt;br/&gt;    f = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ++x; }; &lt;br/&gt;    g = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; --x; }; &lt;br/&gt;    x = 1; &lt;br/&gt;    &lt;span style="color: #0000ff"&gt;alert&lt;/span&gt;('inside foo, call to f(): ' + f()); &lt;span style="color: #008000"&gt;// &amp;quot;2&amp;quot; &lt;/span&gt;&lt;br/&gt;} &lt;br/&gt;&lt;span style="color: #008000"&gt;//外部函数执行，这个时候形成了闭包&lt;/span&gt;&lt;br/&gt;foo(); &lt;br/&gt;&lt;span style="color: #008000"&gt;//因为有了闭包，所以才访问到了 foo中的x &lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff"&gt;alert&lt;/span&gt;('call to g(): ' + g()); &lt;span style="color: #008000"&gt;// &amp;quot;1&amp;quot; &lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008000"&gt;//因为有了闭包，所以才访问到了 foo中的x &lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff"&gt;alert&lt;/span&gt;('call to f(): ' + f()); &lt;span style="color: #008000"&gt;// &amp;quot;2&amp;quot; &lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;  &lt;p&gt;javascript闭包陷阱与案例&lt;/p&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在很多时候，由于内部函数的变量覆盖了闭包的变量，我们如果需要引用外部函数同名的变量，需要通过执行匿名函数，不外部函数的变量作为参数传递进来。如下所示：&lt;/strong&gt;&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;（&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(out_xxx){&lt;br/&gt;&lt;span style="color: #008000"&gt;//这里面就可以使用out_xxx&lt;/span&gt;&lt;br/&gt; }(xxx)）&lt;/pre&gt;&lt;p&gt;可以看得出来，使用这种方式最多的地方是在我们定义对象的时候：&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;window&lt;/span&gt;) {&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; MyObject = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.initialize();&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; p = MyObject.&lt;span style="color: #0000ff"&gt;prototype&lt;/span&gt;;&lt;br/&gt;    p.initialize = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () { &lt;br/&gt;    &lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;window&lt;/span&gt;.MyObject = MyObject;&lt;br/&gt;} (&lt;span style="color: #0000ff"&gt;window&lt;/span&gt;));&lt;/pre&gt;&lt;p&gt;这样定义对象有两个好处：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;1.避免污染外部变量&lt;/p&gt;  &lt;p&gt;2.传递参数的形式减少作用域查找&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;javascript为我们埋了很多坑，在许多场景下，我们需要利用以上的形式去解决问题，下面依依列出。&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;场景1 :&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如下所示，我需要在cc方法中调用到外面的name：   &lt;br /&gt;&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;    &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; bb, cc;&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; aa() {&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; &lt;span style="color: #0000ff"&gt;name&lt;/span&gt; = &amp;quot;&lt;span style="color: #8b0000"&gt;当耐特&lt;/span&gt;&amp;quot;;&lt;br/&gt;        bb = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;            &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; &lt;span style="color: #0000ff"&gt;name&lt;/span&gt; = &amp;quot;&lt;span style="color: #8b0000"&gt;砖家&lt;/span&gt;&amp;quot;;&lt;br/&gt;            cc = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;                &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; &lt;span style="color: #0000ff"&gt;name&lt;/span&gt; = &amp;quot;&lt;span style="color: #8b0000"&gt;张磊&lt;/span&gt;&amp;quot;;&lt;br/&gt;                &lt;span style="color: #0000ff"&gt;alert&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;name&lt;/span&gt;);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;        aa();&lt;br/&gt;        bb();&lt;br/&gt;        cc();&lt;span style="color: #008000"&gt;//输出 “张磊”&lt;/span&gt;&lt;/pre&gt;因为内部的函数定义的变量覆盖了外部函数的变量，所以结果输出“张磊”。 &lt;br /&gt;&lt;p&gt;&lt;strong&gt;解决办法：&lt;/strong&gt;&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;    &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; bb, cc;&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; aa() {&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; &lt;span style="color: #0000ff"&gt;name&lt;/span&gt; = &amp;quot;&lt;span style="color: #8b0000"&gt;当耐特&lt;/span&gt;&amp;quot;;&lt;br/&gt;        (&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (aa_name) {&lt;br/&gt;            bb = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;                &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; &lt;span style="color: #0000ff"&gt;name&lt;/span&gt; = &amp;quot;&lt;span style="color: #8b0000"&gt;砖家&lt;/span&gt;&amp;quot;;&lt;br/&gt;                (&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (bb_name, aa_name) {&lt;br/&gt;                    cc = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;                        &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; &lt;span style="color: #0000ff"&gt;name&lt;/span&gt; = &amp;quot;&lt;span style="color: #8b0000"&gt;张磊&lt;/span&gt;&amp;quot;;&lt;br/&gt;                        &lt;span style="color: #0000ff"&gt;alert&lt;/span&gt;(aa_name);&lt;br/&gt;                        &lt;span style="color: #0000ff"&gt;alert&lt;/span&gt;(bb_name);&lt;br/&gt;                        &lt;span style="color: #0000ff"&gt;alert&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;name&lt;/span&gt;);&lt;br/&gt;                    }&lt;br/&gt;                })(&lt;span style="color: #0000ff"&gt;name&lt;/span&gt;, aa_name);&lt;br/&gt;            }&lt;br/&gt;        })(&lt;span style="color: #0000ff"&gt;name&lt;/span&gt;);&lt;br/&gt;    }&lt;br/&gt;        aa();&lt;br/&gt;        bb();&lt;br/&gt;        cc();&lt;span style="color: #008000"&gt;//输出“当耐特” “砖家”  “张磊”&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;真实案例：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;记得上周，我的一个同事（实习生），对下面一段代码产生疑惑，所以咨询我。如下所示：&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;    $(&amp;quot;&lt;span style="color: #8b0000"&gt;#dialog-form&lt;/span&gt;&amp;quot;).dialog({&lt;br/&gt;        autoOpen: &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;,&lt;br/&gt;        height: 300,&lt;br/&gt;        width: 350,&lt;br/&gt;        modal: &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;,&lt;br/&gt;        buttons: {&lt;br/&gt;            &amp;quot;&lt;span style="color: #8b0000"&gt;Create an account&lt;/span&gt;&amp;quot;: &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;                &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; bValid = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br/&gt;                allFields.removeClass(&amp;quot;&lt;span style="color: #8b0000"&gt;ui-state-error&lt;/span&gt;&amp;quot;);&lt;br/&gt;                bValid = bValid &amp;amp;&amp;amp; checkLength(&lt;span style="color: #0000ff"&gt;name&lt;/span&gt;, &amp;quot;&lt;span style="color: #8b0000"&gt;username&lt;/span&gt;&amp;quot;, 3, 16);&lt;br/&gt;                bValid = bValid &amp;amp;&amp;amp; checkLength(email, &amp;quot;&lt;span style="color: #8b0000"&gt;email&lt;/span&gt;&amp;quot;, 6, 80);&lt;br/&gt;                bValid = bValid &amp;amp;&amp;amp; checkLength(password, &amp;quot;&lt;span style="color: #8b0000"&gt;password&lt;/span&gt;&amp;quot;, 5, 16);&lt;br/&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (bValid) {&lt;br/&gt;                    $.ajax({&lt;br/&gt;                        type: &amp;quot;&lt;span style="color: #8b0000"&gt;POST&lt;/span&gt;&amp;quot;,&lt;br/&gt;                        url: &amp;quot;&lt;span style="color: #8b0000"&gt;xxxxx.aspx&lt;/span&gt;&amp;quot;,&lt;br/&gt;                        data: &amp;quot;&lt;span style="color: #8b0000"&gt;name=xxxxx&amp;amp;email=xxxxx&amp;amp;password=xxxx&lt;/span&gt;&amp;quot;&lt;br/&gt;                    }).done(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (msg) {&lt;br/&gt;                        &lt;span style="color: #0000ff"&gt;alert&lt;/span&gt;(&amp;quot;&lt;span style="color: #8b0000"&gt;Data Saved: &lt;/span&gt;&amp;quot; + msg);&lt;br/&gt;                        $(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).dialog(&amp;quot;&lt;span style="color: #8b0000"&gt;close&lt;/span&gt;&amp;quot;);&lt;br/&gt;                    });&lt;br/&gt;                }&lt;br/&gt;            },&lt;br/&gt;            Cancel: &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;                $(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).dialog(&amp;quot;&lt;span style="color: #8b0000"&gt;close&lt;/span&gt;&amp;quot;);&lt;br/&gt;            }&lt;br/&gt;        },&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;close&lt;/span&gt;: &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;            allFields.val(&amp;quot;&lt;span style="color: #8b0000"&gt;&lt;/span&gt;&amp;quot;).removeClass(&amp;quot;&lt;span style="color: #8b0000"&gt;ui-state-error&lt;/span&gt;&amp;quot;);&lt;br/&gt;        }&lt;br/&gt;    });&lt;/pre&gt;&lt;p&gt;这里用的是JqueryUI的dialog插件。详见： &lt;a title=" http://jqueryui.com/demos/dialog/#modal-form" href="http://jqueryui.com/demos/dialog/#modal-form"&gt;http://jqueryui.com/demos/dialog/#modal-form&lt;/a&gt;&amp;#160;&amp;#160; &lt;/p&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/iamzhanglei/201202/201202262020391513.png" width="357" height="311" /&gt;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;他想要的效果是点击create发起一个异步提交，然后在回调的时候关闭弹出层。令他困惑的地方是，弹出层关闭不了。&lt;/p&gt;&lt;p&gt;他抱怨着说：&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;Cancel: &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;                $(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).dialog(&amp;quot;&lt;span style="color: #8b0000"&gt;close&lt;/span&gt;&amp;quot;);&lt;br/&gt;            }&lt;/pre&gt;&lt;p&gt;我的cancel都能关闭。为什么&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (bValid) {&lt;br/&gt;                    $.ajax({&lt;br/&gt;                        type: &amp;quot;&lt;span style="color: #8b0000"&gt;POST&lt;/span&gt;&amp;quot;,&lt;br/&gt;                        url: &amp;quot;&lt;span style="color: #8b0000"&gt;xxxxx.aspx&lt;/span&gt;&amp;quot;,&lt;br/&gt;                        data: &amp;quot;&lt;span style="color: #8b0000"&gt;name=xxxxx&amp;amp;email=xxxxx&amp;amp;password=xxxx&lt;/span&gt;&amp;quot;&lt;br/&gt;                    }).done(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (msg) {&lt;br/&gt;                        &lt;span style="color: #0000ff"&gt;alert&lt;/span&gt;(&amp;quot;&lt;span style="color: #8b0000"&gt;Data Saved: &lt;/span&gt;&amp;quot; + msg);&lt;br/&gt;                        $(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).dialog(&amp;quot;&lt;span style="color: #8b0000"&gt;close&lt;/span&gt;&amp;quot;);&lt;br/&gt;                    });&lt;br/&gt;                }&lt;/pre&gt;&lt;p&gt;这里面的$(this).dialog(&amp;quot;close&amp;quot;)为什么就不能关闭？   &lt;br /&gt;这是一个很典型的场景，解决办法：&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (bValid) {&lt;br/&gt;                    (&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (outThis) {&lt;br/&gt;                        $.ajax({&lt;br/&gt;                            type: &amp;quot;&lt;span style="color: #8b0000"&gt;POST&lt;/span&gt;&amp;quot;,&lt;br/&gt;                            url: &amp;quot;&lt;span style="color: #8b0000"&gt;xxxxx.aspx&lt;/span&gt;&amp;quot;,&lt;br/&gt;                            data: &amp;quot;&lt;span style="color: #8b0000"&gt;name=xxxxx&amp;amp;email=xxxxx&amp;amp;password=xxxx&lt;/span&gt;&amp;quot;&lt;br/&gt;                        }).done(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (msg) {&lt;br/&gt;                            &lt;span style="color: #0000ff"&gt;alert&lt;/span&gt;(&amp;quot;&lt;span style="color: #8b0000"&gt;Data Saved: &lt;/span&gt;&amp;quot; + msg);&lt;br/&gt;                            $(outThis).dialog(&amp;quot;&lt;span style="color: #8b0000"&gt;close&lt;/span&gt;&amp;quot;);&lt;br/&gt;                        });&lt;br/&gt;                    } &lt;br/&gt;                }(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;))&lt;br/&gt;            },&lt;/pre&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;除了上面的解决方案，我们完全可以使用 &lt;/p&gt;&lt;p&gt;var _name=name;&lt;/p&gt;&lt;p&gt;var __name=name;&lt;/p&gt;&lt;p&gt;var _this =this; &lt;/p&gt;&lt;p&gt;然后内部函数使用新定义的变量就可以。然而，下面的几种场景却必须使用匿名函数。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;场景2---循环中的内部函数&lt;/strong&gt;&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;    &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; TestObj(&lt;span style="color: #0000ff"&gt;name&lt;/span&gt;) {&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;name&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;name&lt;/span&gt;;&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; objs = [];&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; obj;&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; test() {&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i = 0; i &amp;lt; 100; i++) {&lt;br/&gt;            &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; &lt;span style="color: #0000ff"&gt;name&lt;/span&gt; = &amp;quot;&lt;span style="color: #8b0000"&gt;张磊&lt;/span&gt;&amp;quot; + i;&lt;br/&gt;            obj = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TestObj(&lt;span style="color: #0000ff"&gt;name&lt;/span&gt;);&lt;br/&gt;            obj.printName = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;                    console.log(obj.&lt;span style="color: #0000ff"&gt;name&lt;/span&gt;);&lt;br/&gt;                }&lt;br/&gt;            objs.push(obj);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: #008000"&gt;//外部函数执行，闭包形成。内部函数obj.printName中的obj全部指向最后一次new TestObj(name);&lt;/span&gt;&lt;br/&gt;    test();&lt;br/&gt;    &lt;span style="color: #008000"&gt;//所以这里会输出100次-----&amp;quot;张磊99&amp;quot;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; objs) {&lt;br/&gt;        objs[i].printName();&lt;br/&gt;    }&lt;/pre&gt;&lt;p&gt;解决办法&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;    &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; TestObj(&lt;span style="color: #0000ff"&gt;name&lt;/span&gt;) {&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;name&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;name&lt;/span&gt;;&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; objs = [];&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; obj;&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; test() {&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i = 0; i &amp;lt; 100; i++) {&lt;br/&gt;            &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; &lt;span style="color: #0000ff"&gt;name&lt;/span&gt; = &amp;quot;&lt;span style="color: #8b0000"&gt;张磊&lt;/span&gt;&amp;quot; + i;&lt;br/&gt;            obj = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TestObj(&lt;span style="color: #0000ff"&gt;name&lt;/span&gt;);&lt;br/&gt;              (&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (target) {&lt;br/&gt;            obj.printName = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;br/&gt;                console.log(target.&lt;span style="color: #0000ff"&gt;name&lt;/span&gt;);&lt;br/&gt;            }&lt;br/&gt;               } (obj))&lt;br/&gt;            objs.push(obj);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    test();&lt;br/&gt;    &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; objs) {&lt;br/&gt;        objs[i].printName();&lt;br/&gt;    }&lt;/pre&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;真实案例：   &lt;br /&gt;&lt;/p&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 16px"&gt;&lt;span style="color: #008000"&gt;// create and populate the screen with random daisies: &lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i = 0; i &amp;lt; 100; i++){ &lt;br/&gt;    bitmap = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Bitmap(image); &lt;br/&gt;    container.addChild(bitmap); &lt;br/&gt;    bitmap.x = canvas.width * &lt;span style="color: #0000ff"&gt;Math&lt;/span&gt;.random()|0; &lt;br/&gt;    bitmap.y = canvas.height * &lt;span style="color: #0000ff"&gt;Math&lt;/span&gt;.random()|0; &lt;br/&gt;    bitmap.rotation = 360 * &lt;span style="color: #0000ff"&gt;Math&lt;/span&gt;.random()|0; &lt;br/&gt;    bitmap.regX = bitmap.image.width/2|0; &lt;br/&gt;    bitmap.regY = bitmap.image.height/2|0; &lt;br/&gt;    bitmap.scaleX = bitmap.scaleY = bitmap.scale = &lt;span style="color: #0000ff"&gt;Math&lt;/span&gt;.random()*0.4+0.6; &lt;br/&gt;    bitmap.&lt;span style="color: #0000ff"&gt;name&lt;/span&gt; = &amp;quot;&lt;span style="color: #8b0000"&gt;bmp_&lt;/span&gt;&amp;quot;+i;&lt;br/&gt;    &lt;span style="color: #008000"&gt;// wrapper function to provide scope for the event handlers: &lt;/span&gt;&lt;br/&gt;    (&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(target) { &lt;br/&gt;        bitmap.onPress = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(evt) { &lt;br/&gt;            &lt;span style="color: #008000"&gt;// bump the target in front of it's siblings: &lt;/span&gt;&lt;br/&gt;            container.addChild(target); &lt;br/&gt;            &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; offset = {x:target.x-evt.stageX, y:target.y-evt.stageY};&lt;br/&gt;            &lt;span style="color: #008000"&gt;// add a handler to the event object's onMouseMove callback &lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #008000"&gt;// this will be active until the user releases the mouse button: &lt;/span&gt;&lt;br/&gt;            evt.onMouseMove = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(ev) { &lt;br/&gt;                target.x = ev.stageX+offset.x; &lt;br/&gt;                target.y = ev.stageY+offset.y; &lt;br/&gt;                &lt;span style="color: #008000"&gt;// indicate that the stage should be updated on the next tick: &lt;/span&gt;&lt;br/&gt;                update = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;; &lt;br/&gt;            } &lt;br/&gt;        } &lt;br/&gt;        bitmap.onMouseOver = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt;() { &lt;br/&gt;            target.scaleX = target.scaleY = target.scale*1.2; &lt;br/&gt;            update = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;; &lt;br/&gt;        } &lt;br/&gt;        bitmap.onMouseOut = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt;() { &lt;br/&gt;            target.scaleX = target.scaleY = target.scale; &lt;br/&gt;            update = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;; &lt;br/&gt;        } &lt;br/&gt;    })(bitmap); &lt;br/&gt;}&lt;/pre&gt;&lt;p&gt;这是Easeljs官网demo的一段代码，因为内部函数不会立即执行，所以当执行的时候,内部函数引用外部函数变量的时候，该变量已经被外层的for循环覆盖了N次，所以要通过上面的方式来解决这个问题。&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;这是javascript蹩脚的一个方面，除了这个，还有javascript的 getter和setter也是该语言语法特性中令人憋屈的地方。另外，在javascript 的一些OOP方式中，我们经常用下划线（_xxxx）的方式代表其为私有变量，但是外部却可以访问，用约定来弥补其语法上的不足。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;我相信经过人类的不懈努力，总有那么一天：static 、namespace、interface、private、protected 、class、enum·············都能成为javascript的关键字，而不是五花八门的技巧，对应这些关键字的所有 文章 笔记&amp;#160; 心得&amp;#160; 日记 技巧 随笔 后门&amp;#160; 都将沉尸谷底、永无翻身之日。相信那个时候，HTML5已经成熟。正如小胖所说:&lt;em&gt;什么时候做html5游戏的朋友能够不再纠结于什么js技巧 canvas性能优化的，那就说明html5游戏这个领域成熟了。&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/iamzhanglei/aggbug/2368566.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/iamzhanglei/archive/2012/02/27/2368566.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
