﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>as4game &#187; as</title>
	<atom:link href="http://www.as4game.com/blog/archives/category/actionscript/feed" rel="self" type="application/rss+xml" />
	<link>http://www.as4game.com/blog</link>
	<description>actionscript for game</description>
	<lastBuildDate>Tue, 15 Feb 2011 07:54:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Flash统计系统-Google Analytics Tracking For Adobe Flash</title>
		<link>http://www.as4game.com/blog/archives/762</link>
		<comments>http://www.as4game.com/blog/archives/762#comments</comments>
		<pubDate>Mon, 21 Jun 2010 14:29:42 +0000</pubDate>
		<dc:creator>as4game</dc:creator>
				<category><![CDATA[as]]></category>

		<guid isPermaLink="false">http://www.as4game.com/blog/?p=762</guid>
		<description><![CDATA[本来想自己做1个，发现已经有人做了，并且做的很不错哦。用吧~
这个项目利用Google Analytics对Flash进行统计。
项目地址：http://code.google.com/p/gaforflash/
你可以用这个来统计你的Flash的行为。例如游戏的一些行为：
游戏打开，游戏开始，游戏付费按钮的点击次数……
]]></description>
			<content:encoded><![CDATA[<p>本来想自己做1个，发现已经有人做了，并且做的很不错哦。用吧~</p>
<p>这个项目利用Google Analytics对Flash进行统计。</p>
<p>项目地址：<a href="http://code.google.com/p/gaforflash/">http://code.google.com/p/gaforflash/</a></p>
<p>你可以用这个来统计你的Flash的行为。例如游戏的一些行为：<br />
游戏打开，游戏开始，游戏付费按钮的点击次数……</p>
]]></content:encoded>
			<wfw:commentRss>http://www.as4game.com/blog/archives/762/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一段流行的as3内存释放hack代码</title>
		<link>http://www.as4game.com/blog/archives/676</link>
		<comments>http://www.as4game.com/blog/archives/676#comments</comments>
		<pubDate>Sat, 28 Nov 2009 11:34:05 +0000</pubDate>
		<dc:creator>as4game</dc:creator>
				<category><![CDATA[as]]></category>

		<guid isPermaLink="false">http://www.as4game.com/blog/?p=676</guid>
		<description><![CDATA[一段流行的as3内存释放hack代码：

public static function GC() {
	var lc1 : LocalConnection;
	var lc2 : LocalConnection;
	try {
		lc1 = new LocalConnection();
		lc2 = new LocalConnection();
		lc1.connect("name");
		lc2.connect("name");
	}
	catch (e : Error) {
	}
	return;
}

]]></description>
			<content:encoded><![CDATA[<p>一段流行的as3内存释放hack代码：</p>
<pre name="code" class="brush:as3">
public static function GC() {
	var lc1 : LocalConnection;
	var lc2 : LocalConnection;
	try {
		lc1 = new LocalConnection();
		lc2 = new LocalConnection();
		lc1.connect("name");
		lc2.connect("name");
	}
	catch (e : Error) {
	}
	return;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.as4game.com/blog/archives/676/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>百度发布“网络手写输入”</title>
		<link>http://www.as4game.com/blog/archives/606</link>
		<comments>http://www.as4game.com/blog/archives/606#comments</comments>
		<pubDate>Fri, 23 Oct 2009 12:31:58 +0000</pubDate>
		<dc:creator>as4game</dc:creator>
				<category><![CDATA[as]]></category>
		<category><![CDATA[product]]></category>
		<category><![CDATA[手写]]></category>

		<guid isPermaLink="false">http://www.as4game.com/blog/?p=606</guid>
		<description><![CDATA[今天，百度发布了新产品“网络手写输入”。
目前该产品用在老年人搜索页面（http://123.baidu.com/），为不会打字的老年人提供了一种输入汉字的可能。

]]></description>
			<content:encoded><![CDATA[<p>今天，百度发布了新产品“网络手写输入”。<br />
目前该产品用在老年人搜索页面（<a target="_blank" href="http://123.baidu.com/">http://123.baidu.com/</a>），为不会打字的老年人提供了一种输入汉字的可能。<br />
<img src="http://www.as4game.com/blog/wp-content/uploads/2009/10/hw.jpg" alt="百度手写输入" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.as4game.com/blog/archives/606/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Firefox下embed标签的salign属性必须在scale属性之后</title>
		<link>http://www.as4game.com/blog/archives/599</link>
		<comments>http://www.as4game.com/blog/archives/599#comments</comments>
		<pubDate>Wed, 21 Oct 2009 10:35:54 +0000</pubDate>
		<dc:creator>as4game</dc:creator>
				<category><![CDATA[as]]></category>
		<category><![CDATA[embed]]></category>
		<category><![CDATA[salign]]></category>
		<category><![CDATA[scale]]></category>

		<guid isPermaLink="false">http://www.as4game.com/blog/?p=599</guid>
		<description><![CDATA[总结：
在Firefox下，embed标签的salign属性必须在scale属性之后。否则，salign属性失效。

懒人可以不看后面的:P
描述：
这个bug碰到的概率不是很大，因为现在大家嵌入flash时，通常会粘贴一段object和embed的嵌套代码，或者使用一些开源js，如swfobject。
今天我遇到了这个bug，浪费了不少时间啊~哪想到标签的属性居会然是“顺序敏感”的。
相关文章：
1.一篇老外的帖子(2003)：http://forums.mozillazine.org/viewtopic.php?f=9&#038;t=28594
2.cbmland有一篇(2008)：http://www.cbmland.com/post/618/embed-tags-salign-prop.html
]]></description>
			<content:encoded><![CDATA[<p>总结：<br />
<font color="red">在Firefox下，embed标签的salign属性必须在scale属性之后。否则，salign属性失效。<br />
</font><br />
懒人可以不看后面的:P</p>
<p>描述：<br />
这个bug碰到的概率不是很大，因为现在大家嵌入flash时，通常会粘贴一段object和embed的嵌套代码，或者使用一些开源js，如swfobject。<br />
今天我遇到了这个bug，浪费了不少时间啊~哪想到标签的属性居会然是“顺序敏感”的。</p>
<p>相关文章：<br />
1.一篇老外的帖子(2003)：<a target="_blank" href="http://forums.mozillazine.org/viewtopic.php?f=9&#038;t=28594">http://forums.mozillazine.org/viewtopic.php?f=9&#038;t=28594</a><br />
2.cbmland有一篇(2008)：<a target="_blank" href="http://www.cbmland.com/post/618/embed-tags-salign-prop.html">http://www.cbmland.com/post/618/embed-tags-salign-prop.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.as4game.com/blog/archives/599/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash向量-12-球和圆弧</title>
		<link>http://www.as4game.com/blog/archives/546</link>
		<comments>http://www.as4game.com/blog/archives/546#comments</comments>
		<pubDate>Wed, 23 Sep 2009 03:56:32 +0000</pubDate>
		<dc:creator>as4game</dc:creator>
				<category><![CDATA[vertors for flash]]></category>

		<guid isPermaLink="false">http://www.as4game.com/blog/?p=546</guid>
		<description><![CDATA[
现在，让我们一起研究下如何处理运动的球和圆弧。圆弧式圆的一部分，不同的是圆石360度的，而圆弧不足360度。对于球和球的碰撞，之可能存在一个碰撞点。对于球和圆弧的碰撞，可能有……不是1个，也不是2个，而是4个碰撞点。



图中，左边，运动的球从原画的外面碰撞到圆弧，中间，球从圆弧的里面碰撞到圆弧，右边，球碰到了圆弧的端点（圆弧有2个端点，球可能同时碰到这2个端点）


为了定义一个圆，我们需要中心点和半径。为了定义一个圆弧，除了需要中心点和半径，还需要它的起始端点的角度和终终止端点的角度。



例如，我们可以这样定义圆弧：


arc={p0:{x:170, y:90}, r:30, ang1:135, ang2:315};


圆弧的中心点在x=170,，y=90，它的半径为30，起点角度为135度，终点角度为315度。知道了这些，我们可以计算出圆弧的起点和终点的坐标：


ang1rad=ang1*Math.PI/180;
ang2rad=ang2*Math.PI/180;
v1.p0={
x:p0.x+r*Math.cos(ang1rad),
y:p0.y+r*Math.sin(ang1rad)
};
v1.p1={
x:p0.x+r*Math.cos(ang2rad),
y:p0.y+r*Math.sin(ang2rad)
};


向量1是圆弧的起点到终点连线向量。

碰撞

可以使用球和球章节介绍的方法，检测球和圆弧外面的碰撞。当碰撞发生的时候，我们再来检测这个碰撞的位置是否在圆弧上存在。



我们需要找到球和圆弧相切的点p3。我们知道了发生碰撞时球心的位置，所以我们可以画一个向量v2，从圆弧中心到碰撞时球的中心。


v2={p0:arc.p0, p1:ball.p3};


点p3在在这个向量上，它和圆弧中心的距离为圆弧的半径(它和球的中心的距离为球的半径)：


p3={
x:arc.p0.x+v2.dx*arc.r,
y:arc.p0.y+v2.dy*arc.r
};


然后我们画一个向量，从圆弧的起点到点p3：


v3={p0:v1.p0, p1:p3};


只有当v3和v1的左法线的点乘大于0时，p3才在圆弧上。


if(dotP(v3, v1LeftNormal)>=0){
  //collision
}else{
  //not on the arc
}


如果碰撞发生在圆弧的外侧，我们可以忽略其他3种情况。然而，如果碰撞点p3，不在圆弧上面，我们就要考虑球是否碰到圆弧的端点，还是碰到了圆弧的内侧。


对于端点，我们可以继续使用球和球的系统，假设端点是看不见的球，半径为0，坐落在端点坐标。和球碰撞的圆弧是：


ballvsBall(ball, arc.p0, arc.r);


我们可以这样检测端点碰撞：


ballvsBall(ball, v1.p0, 0);
ballvsBall(ball, v1.p1, 0);


对于球和圆弧内部碰撞，我们使用外部碰撞系统的略加修改版。外部碰撞检测方法是：


r=arc.r+ball.r;
moveBack=Math.sqrt(r*r-vn.len*vn.len);
ball.p3={
x:ball.p2.x-moveBack*v.dx,
y:ball.p2.y-moveBack*v.dy};


内部碰撞检测方法：


r=arc.r-ball.r;
moveBack=Math.sqrt(r*r-vn.len*vn.len);
ball.p3={
x:ball.p2.x+moveBack*v.dx,
y:ball.p2.y+moveBack*v.dy};


由于球可能和圆弧的多个点碰撞，我们可以取最短路径。


下面的例子中展示了球和圆弧的碰撞，你可以体验下：



你可以下载fla源文件。
]]></description>
			<content:encoded><![CDATA[<p>
现在，让我们一起研究下如何处理运动的球和圆弧。圆弧式圆的一部分，不同的是圆石360度的，而圆弧不足360度。对于球和球的碰撞，之可能存在一个碰撞点。对于球和圆弧的碰撞，可能有……不是1个，也不是2个，而是4个碰撞点。
</p>
<p><img src="http://www.as4game.com/vectors/tut12_1.gif" alt="" /></p>
<p>
图中，左边，运动的球从原画的外面碰撞到圆弧，中间，球从圆弧的里面碰撞到圆弧，右边，球碰到了圆弧的端点（圆弧有2个端点，球可能同时碰到这2个端点）
</p>
<p>
为了定义一个圆，我们需要中心点和半径。为了定义一个圆弧，除了需要中心点和半径，还需要它的起始端点的角度和终终止端点的角度。
</p>
<p><img src="http://www.as4game.com/vectors/tut12_2.gif" alt="" /></p>
<p>
例如，我们可以这样定义圆弧：
</p>
<pre class="brush:as3">
arc={p0:{x:170, y:90}, r:30, ang1:135, ang2:315};
</pre>
<p>
圆弧的中心点在x=170,，y=90，它的半径为30，起点角度为135度，终点角度为315度。知道了这些，我们可以计算出圆弧的起点和终点的坐标：
</p>
<pre class="brush:as3">
ang1rad=ang1*Math.PI/180;
ang2rad=ang2*Math.PI/180;
v1.p0={
x:p0.x+r*Math.cos(ang1rad),
y:p0.y+r*Math.sin(ang1rad)
};
v1.p1={
x:p0.x+r*Math.cos(ang2rad),
y:p0.y+r*Math.sin(ang2rad)
};
</pre>
<p>
向量1是圆弧的起点到终点连线向量。
</p>
<p><strong>碰撞</strong></p>
<p>
可以使用球和球章节介绍的方法，检测球和圆弧外面的碰撞。当碰撞发生的时候，我们再来检测这个碰撞的位置是否在圆弧上存在。
</p>
<p><img src="http://www.tonypa.pri.ee/vectors/tut12_3.gif" alt="" /></p>
<p>
我们需要找到球和圆弧相切的点p3。我们知道了发生碰撞时球心的位置，所以我们可以画一个向量v2，从圆弧中心到碰撞时球的中心。
</p>
<pre class="brush:as3">
v2={p0:arc.p0, p1:ball.p3};
</pre>
<p>
点p3在在这个向量上，它和圆弧中心的距离为圆弧的半径(它和球的中心的距离为球的半径)：
</p>
<pre class="brush:as3">
p3={
x:arc.p0.x+v2.dx*arc.r,
y:arc.p0.y+v2.dy*arc.r
};
</pre>
<p>
然后我们画一个向量，从圆弧的起点到点p3：
</p>
<pre class="brush:as3">
v3={p0:v1.p0, p1:p3};
</pre>
<p>
只有当v3和v1的左法线的点乘大于0时，p3才在圆弧上。
</p>
<pre class="brush:as3">
if(dotP(v3, v1LeftNormal)>=0){
  //collision
}else{
  //not on the arc
}
</pre>
<p>
如果碰撞发生在圆弧的外侧，我们可以忽略其他3种情况。然而，如果碰撞点p3，不在圆弧上面，我们就要考虑球是否碰到圆弧的端点，还是碰到了圆弧的内侧。
</p>
<p>
对于端点，我们可以继续使用球和球的系统，假设端点是看不见的球，半径为0，坐落在端点坐标。和球碰撞的圆弧是：
</p>
<pre class="brush:as3">
ballvsBall(ball, arc.p0, arc.r);
</pre>
<p>
我们可以这样检测端点碰撞：
</p>
<pre class="brush:as3">
ballvsBall(ball, v1.p0, 0);
ballvsBall(ball, v1.p1, 0);
</pre>
<p>
对于球和圆弧内部碰撞，我们使用外部碰撞系统的略加修改版。外部碰撞检测方法是：
</p>
<pre class="brush:as3">
r=arc.r+ball.r;
moveBack=Math.sqrt(r*r-vn.len*vn.len);
ball.p3={
x:ball.p2.x-moveBack*v.dx,
y:ball.p2.y-moveBack*v.dy};
</pre>
<p>
内部碰撞检测方法：
</p>
<pre class="brush:as3">
r=arc.r-ball.r;
moveBack=Math.sqrt(r*r-vn.len*vn.len);
ball.p3={
x:ball.p2.x+moveBack*v.dx,
y:ball.p2.y+moveBack*v.dy};
</pre>
<p>
由于球可能和圆弧的多个点碰撞，我们可以取最短路径。
</p>
<p>
下面的例子中展示了球和圆弧的碰撞，你可以体验下：
</p>
<p><object width="300" height="200"><param name="movie" value="http://www.as4game.com/vectors/vect12.swf" /><embed width="300" height="200" type="application/x-shockwave-flash" src="http://www.as4game.com/vectors/vect12.swf" ></embed></object></p>
<p>
你可以下载<a href="http://www.as4game.com/vectors/vect12.fla" target="_blank">fla源文件</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.as4game.com/blog/archives/546/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash向量-11-两个高速运动的球</title>
		<link>http://www.as4game.com/blog/archives/532</link>
		<comments>http://www.as4game.com/blog/archives/532#comments</comments>
		<pubDate>Tue, 22 Sep 2009 04:01:20 +0000</pubDate>
		<dc:creator>as4game</dc:creator>
				<category><![CDATA[vertors for flash]]></category>

		<guid isPermaLink="false">http://www.as4game.com/blog/?p=532</guid>
		<description><![CDATA[
运动的球心情肯定不错吧，因为它能动并且还能游览这个世界。但是，如果另外一个球决定不再原地不动，而也运动起来，那么会发生什么事情呢？我们很有必要研究一下这个。在这种情况下，我们之前介绍的碰撞检测方法可能会失败。让我们看看相同的例子：



球1按照红色运动向量来运动，球2按照蓝色运动向量来运动。如果要正确的进行碰撞检测的话，我们需要把每个球的运动向量考虑在内。



图中，当两球相撞时，球1到达了p2，而球2到达了p3。幸亏我们用了向量，我们可以非常容易的将2个向量相加。这样，我们就不用考虑2个运动的球，我们用球1的运动向量减去球2的运动向量，然后我们可以用学过的“一个运动的球和一个静态的球”的模型。【as4game注：这一段说的就是初中学的相对运动，把2个球的运动转化成1个球的运动】



用球1的运动向量减去球2的运动向量，就得到了向量v3：


v3={};
v3.p0=ball1.p0;
v3.vx=ball1.vx-ball2.vx;
v3.vy=ball1.vy-ball2.vy;


现在，我们可以使用上一章学习的方法来进行碰撞检测，假设球1要移动v3这么多，而v2原地不动。如果球1在p4这一点碰到球2。我们计算出新的向量v4，它是球1碰到球2时，自己的运动向量。


game.v4={p0:ball1.p0, p1:p4};


因为我们知道2个球都在运动，我们可以找到变量“t”，它的值为v4的长度除以v3的长度。


t=v4.len/v3.len;


变量“t”的值在0到1之间。当它等于1，碰撞发生在球的运动向量的终点，当它等于0，碰撞发生在球的运动向量的起点。为了计算2个球发生碰撞时的位置，我们需要将将它们的运动向量乘以t：


ball1.p1.x=ball1.p0.x+t*ball1.vx;
ball1.p1.y=ball1.p0.y+t*ball1.vy;
ball2.p1.x=ball2.p0.x+t*ball2.vx;
ball2.p1.y=ball2.p0.y+t*ball2.vy;


我制作了2个运动的球的例子：



你可以拖动球的运动向量的终点。


你可以下载fla源文件。

2个球的弹性

在找到了碰撞点之后，我们可以改变球的运动向量，可以参考章节球和球章节。但是到目前为止，我们只学过一个球运动时的反弹。当2个球都在运动，它们的运动会相互影响，使得他们的运动向量都需要重新计算。
弹性取决于2个球的质量。为了简化问题，我们假设2个球的质量相等【as4game注：如果要考虑质量不相等的情况，可以用动量守恒定理和能量守恒定律2个方程来计算】。在这种情况下，他们中心连线方向的速度会交换：



vc是球心连线向量，vcn是它的法线。现在我们将运动向量v1和v2在vc和vcn上进行投影：



v1被分解成v1a和v1b，同样v2被分解成v2a和v2b。然后v1a和v2a会交换，然后用v1b和v2a来计算球1的新运动向量，用v1a和v2b来计算球2的新运动向量。


下面的例子中，一些球在运动，他们彼此反弹：



你可以下载fla源文件。
]]></description>
			<content:encoded><![CDATA[<p>
运动的球心情肯定不错吧，因为它能动并且还能游览这个世界。但是，如果另外一个球决定不再原地不动，而也运动起来，那么会发生什么事情呢？我们很有必要研究一下这个。在这种情况下，我们之前介绍的碰撞检测方法可能会失败。让我们看看相同的例子：
</p>
<p><img src="http://www.as4game.com/vectors/tut11_1.gif" alt="" /></p>
<p>
球1按照红色运动向量来运动，球2按照蓝色运动向量来运动。如果要正确的进行碰撞检测的话，我们需要把每个球的运动向量考虑在内。
</p>
<p><img src="http://www.as4game.com/vectors/tut11_3.gif" alt="" /></p>
<p>
图中，当两球相撞时，球1到达了p2，而球2到达了p3。幸亏我们用了向量，我们可以非常容易的将2个向量相加。这样，我们就不用考虑2个运动的球，我们用球1的运动向量减去球2的运动向量，然后我们可以用<img src="http://www.as4game.com/blog/archives/502" alt="不记得的话，可以看看" />学过的“一个运动的球和一个静态的球”的模型。【as4game注：这一段说的就是初中学的相对运动，把2个球的运动转化成1个球的运动】
</p>
<p><img src="http://www.as4game.com/vectors/tut11_4.gif" alt="" /></p>
<p>
用球1的运动向量减去球2的运动向量，就得到了向量v3：
</p>
<pre class="brush:as3;">
v3={};
v3.p0=ball1.p0;
v3.vx=ball1.vx-ball2.vx;
v3.vy=ball1.vy-ball2.vy;
</pre>
<p>
现在，我们可以使用上一章学习的方法来进行碰撞检测，假设球1要移动v3这么多，而v2原地不动。如果球1在p4这一点碰到球2。我们计算出新的向量v4，它是球1碰到球2时，自己的运动向量。
</p>
<pre class="brush:as3;">
game.v4={p0:ball1.p0, p1:p4};
</pre>
<p>
因为我们知道2个球都在运动，我们可以找到变量“t”，它的值为v4的长度除以v3的长度。
</p>
<pre class="brush:as3;">
t=v4.len/v3.len;
</pre>
<p>
变量“t”的值在0到1之间。当它等于1，碰撞发生在球的运动向量的终点，当它等于0，碰撞发生在球的运动向量的起点。为了计算2个球发生碰撞时的位置，我们需要将将它们的运动向量乘以t：
</p>
<pre class="brush:as3;">
ball1.p1.x=ball1.p0.x+t*ball1.vx;
ball1.p1.y=ball1.p0.y+t*ball1.vy;
ball2.p1.x=ball2.p0.x+t*ball2.vx;
ball2.p1.y=ball2.p0.y+t*ball2.vy;
</pre>
<p>
我制作了2个运动的球的例子：
</p>
<p><object width="300" height="200"><param name="movie" value="http://www.as4game.com/vectors/vect11.swf" /><embed width="300" height="200" type="application/x-shockwave-flash" src="http://www.as4game.com/vectors/vect11.swf" ></embed></object></p>
<p>
你可以拖动球的运动向量的终点。
</p>
<p>
你可以下载<a href="http://www.as4game.com/vectors/vect11.fla" target="_blank">fla源文件</a>。
</p>
<p><strong>2个球的弹性</strong></p>
<p>
在找到了碰撞点之后，我们可以改变球的运动向量，可以参考章节<a target="_blank" href="http://www.as4game.com/blog/archives/468">球和球</a>章节。但是到目前为止，我们只学过一个球运动时的反弹。当2个球都在运动，它们的运动会相互影响，使得他们的运动向量都需要重新计算。<br />
弹性取决于2个球的质量。为了简化问题，我们假设2个球的质量相等【as4game注：如果要考虑质量不相等的情况，可以用动量守恒定理和能量守恒定律2个方程来计算】。在这种情况下，他们中心连线方向的速度会交换：
</p>
<p><img src="http://www.as4game.com/vectors/tut11_5.gif" alt="" /></p>
<p>
vc是球心连线向量，vcn是它的法线。现在我们将运动向量v1和v2在vc和vcn上进行投影：
</p>
<p><img src="http://www.as4game.com/vectors/tut11_6.gif" alt="" /></p>
<p>
v1被分解成v1a和v1b，同样v2被分解成v2a和v2b。然后v1a和v2a会交换，然后用v1b和v2a来计算球1的新运动向量，用v1a和v2b来计算球2的新运动向量。
</p>
<p>
下面的例子中，一些球在运动，他们彼此反弹：
</p>
<p><object width="300" height="200"><param name="movie" value="http://www.as4game.com/vectors/vect11a.swf" /><embed width="300" height="200" type="application/x-shockwave-flash" src="http://www.as4game.com/vectors/vect11a.swf" ></embed></object></p>
<p>
你可以下载<a href="http://www.as4game.com/vectors/vect11a.fla" target="_blank">fla源文件</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.as4game.com/blog/archives/532/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash向量-10-高速运动的球</title>
		<link>http://www.as4game.com/blog/archives/502</link>
		<comments>http://www.as4game.com/blog/archives/502#comments</comments>
		<pubDate>Wed, 16 Sep 2009 10:40:35 +0000</pubDate>
		<dc:creator>as4game</dc:creator>
				<category><![CDATA[vertors for flash]]></category>

		<guid isPermaLink="false">http://www.as4game.com/blog/?p=502</guid>
		<description><![CDATA[
在上一节里面，我们学会了如何检测2个球的碰撞，和如何找到碰撞后的运动方向。看起来非常既好用，又简单，但是其实是有问题的：球不能运动的太快，否者碰撞检测会失效。以下是这种情形的一个说明：



图中，球1（红色）位于p0，以速度v移动。在下一个运动周期里面，它会到达p1的位置（绿色）。我们在上一个周期和本次的周期都会检测球1和球2是否发生碰撞。由于不论是在起点还是在终点，球1和球2的距离足够的大，我们检测不到球1和球2的碰撞。但是从图中可以看出，事实上球1和球2确实发生了碰撞。



上图中，球1和球2会在位置p3发生碰撞。可以这样来计算p3：


首先我们找到移动之前2个球的中心连线的向量：


vc={};
vc.p0=ball1.p0;
vc.p1=ball2.p0;


现在，我们计算出p2，它是运动向量上与球2距离最小的点。这个点很容易找到，只需要将向量vc在运动向量上进行投影，如果你已经不记得如何计算投影，可以在基础知识章节中查找。


我们绘制一个向量vn，从点p2到球2的中心点。这个向量和运动向量的法线方向相同。


vp=projectVector(vc, v.dx, v.dy);
p2={x:v.p0.x+vp.vx, y:v.p0.y+vp.vy};
vn={};
vn.p0=p2;
vn.p1=ball2.p0;


现在，我们可以比较这个向量的长度和两个球的半径之和。如果vn比半径之和大，那么不会发生碰撞。如果vn的长度和半径之和相等，那么刚好插肩而过。如果vn的长度小于半径之和，那么碰撞在到达p2这一点之前发生了。


totalRadius=ball1.r+ball2.r;
var diff=totalRadius-vn.len;
if(diff>0){
  //collision
}else{
  //no collision
}


当检测到球发生了碰撞，应该将球1从点p2移回点p3。但是怎么计算p3呢？如果你仔细看看上面的图片，很可能会发现，球2的中心点，p2和p3构成了一个三角形。我们对三角形非常的熟悉了，虽然还不足以让我们爱上她，但是已经足以让我们找到p3。首先，我们知道点p2到球心的长度，也就是向量vn的长度。然后，我们可以求得点p3到球2中心的长度，等于球的半径之和。现在，就可以使用古老而好用的勾股定理，来计算第三边（从p2到p3）的长度。


moveBack=Math.sqrt(totalRadius*totalRadius-vn.len*vn.len);
p3={x:p2.x-moveBack*v.dx, y:p2.y-moveBack*v.dy};
v3={p0:v.p0, p1:p3};


所以，我们将运动向量v从p2反向移动moveBack这么长的距离。有可能p3在向量v的外面，此时意味着碰撞不在本次运动循环中发生，但是但是有可能是在过去或者未来发生。我们只处理此刻的碰撞，我们要求p3必须落在向量v上面：


if(game.v3.len0){
  //collision
  game.ob1.p0=game.p3;
}


首先，从球1中心到p3的长度必须小于向量v的长度。同时2个向量必须放心相同，这一点可以通过计算点乘来确定。


这种检测方法的前提是，球在最开始的时候没有发生碰撞，如果遇到这种情况的话，在计算碰撞之前要小心哦。


我制作了一个例子，运动的球碰撞其他的球：



你可以拖动那些球，也可以拖动运动向量的终点。红色的圆代表球1的开始运动的时候，绿色是球1的运动完成的时候，蓝色是球2。


你可以下载fla源文件。
]]></description>
			<content:encoded><![CDATA[<p>
在上一节里面，我们学会了如何检测2个球的碰撞，和如何找到碰撞后的运动方向。看起来非常既好用，又简单，但是其实是有问题的：球不能运动的太快，否者碰撞检测会失效。以下是这种情形的一个说明：
</p>
<p><img src="http://www.as4game.com/vectors/tut10_1.gif" alt="速度过快，碰撞检测失效" /></p>
<p>
图中，球1（红色）位于p0，以速度v移动。在下一个运动周期里面，它会到达p1的位置（绿色）。我们在上一个周期和本次的周期都会检测球1和球2是否发生碰撞。由于不论是在起点还是在终点，球1和球2的距离足够的大，我们检测不到球1和球2的碰撞。但是从图中可以看出，事实上球1和球2确实发生了碰撞。
</p>
<p><img src="http://www.as4game.com/vectors/tut10_2.gif" alt="" /></p>
<p>
上图中，球1和球2会在位置p3发生碰撞。可以这样来计算p3：
</p>
<p>
首先我们找到移动之前2个球的中心连线的向量：
</p>
<pre class="brush:as3">
vc={};
vc.p0=ball1.p0;
vc.p1=ball2.p0;
</pre>
<p>
现在，我们计算出p2，它是运动向量上与球2距离最小的点。这个点很容易找到，只需要将向量vc在运动向量上进行投影，如果你已经不记得如何计算投影，可以在<a href="http://www.as4game.com/blog/?p=304" target="_blank">基础知识</a>章节中查找。
</p>
<p>
我们绘制一个向量vn，从点p2到球2的中心点。这个向量和运动向量的法线方向相同。
</p>
<pre class="brush:as3">
vp=projectVector(vc, v.dx, v.dy);
p2={x:v.p0.x+vp.vx, y:v.p0.y+vp.vy};
vn={};
vn.p0=p2;
vn.p1=ball2.p0;
</pre>
<p>
现在，我们可以比较这个向量的长度和两个球的半径之和。如果vn比半径之和大，那么不会发生碰撞。如果vn的长度和半径之和相等，那么刚好插肩而过。如果vn的长度小于半径之和，那么碰撞在到达p2这一点之前发生了。
</p>
<pre class="brush:as3">
totalRadius=ball1.r+ball2.r;
var diff=totalRadius-vn.len;
if(diff>0){
  //collision
}else{
  //no collision
}
</pre>
<p>
当检测到球发生了碰撞，应该将球1从点p2移回点p3。但是怎么计算p3呢？如果你仔细看看上面的图片，很可能会发现，球2的中心点，p2和p3构成了一个三角形。我们对三角形非常的熟悉了，虽然还不足以让我们爱上她，但是已经足以让我们找到p3。首先，我们知道点p2到球心的长度，也就是向量vn的长度。然后，我们可以求得点p3到球2中心的长度，等于球的半径之和。现在，就可以使用古老而好用的勾股定理，来计算第三边（从p2到p3）的长度。
</p>
<pre class="brush:as3">
moveBack=Math.sqrt(totalRadius*totalRadius-vn.len*vn.len);
p3={x:p2.x-moveBack*v.dx, y:p2.y-moveBack*v.dy};
v3={p0:v.p0, p1:p3};
</pre>
<p>
所以，我们将运动向量v从p2反向移动moveBack这么长的距离。有可能p3在向量v的外面，此时意味着碰撞不在本次运动循环中发生，但是但是有可能是在过去或者未来发生。我们只处理此刻的碰撞，我们要求p3必须落在向量v上面：
</p>
<pre class="brush:as3">
if(game.v3.len<ob.len and dotP(game.v3, ob)>0){
  //collision
  game.ob1.p0=game.p3;
}
</pre>
<p>
首先，从球1中心到p3的长度必须小于向量v的长度。同时2个向量必须放心相同，这一点可以通过计算点乘来确定。
</p>
<p>
这种检测方法的前提是，球在最开始的时候没有发生碰撞，如果遇到这种情况的话，在计算碰撞之前要小心哦。
</p>
<p>
我制作了一个例子，运动的球碰撞其他的球：
</p>
<p><object width="300" height="200"><param name="movie" value="http://www.as4game.com/vectors/vect10.swf" /><embed width="300" height="200" type="application/x-shockwave-flash" src="http://www.as4game.com/vectors/vect10.swf" ></embed></object></p>
<p>
你可以拖动那些球，也可以拖动运动向量的终点。红色的圆代表球1的开始运动的时候，绿色是球1的运动完成的时候，蓝色是球2。
</p>
<p>
你可以下载<a href="http://www.as4game.com/vectors/vect10.fla" target="_blank">fla源文件</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.as4game.com/blog/archives/502/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash向量-9-球和球</title>
		<link>http://www.as4game.com/blog/archives/489</link>
		<comments>http://www.as4game.com/blog/archives/489#comments</comments>
		<pubDate>Thu, 10 Sep 2009 13:40:23 +0000</pubDate>
		<dc:creator>as4game</dc:creator>
				<category><![CDATA[vertors for flash]]></category>

		<guid isPermaLink="false">http://www.as4game.com/blog/?p=489</guid>
		<description><![CDATA[
首先，我们看看如何判断2个球发生碰撞。然后，再思考碰撞发生之后，球该怎么运动。



图中有球1（红色）和球2（蓝色）。2个球的球心之间的向量为v（绿色）。只有当v的长度小于两个球的半径只和时，两个球才发生了碰撞。我们需要做的是让2个球刚刚紧挨着，为了达到这个目的，我们需要将球1向v的方向移动一段距离：


pen=v.len-(b1.r+b2.r)


现在，2个球刚好紧贴，我们需要研究下运动向量如何变化。想象一下在两个球之间有一个无形的墙壁，墙壁的方式和球心连线向量的法线方向相同。



图中，黑色向量是向量v的法线，将它作为墙壁向量，用之前的方法计算球1的反弹运动向量。


以下是一个例子，一个球在舞台上移动，另外有几个静态的球。



尝试拖动那些静态的球。


你可以下载fla源文件。

把它装起来
你可能想让一个球在另外一个球里面。


假设，b2是大球，b1是小球。判断小球是否移出的条件是：


b2.r]]></description>
			<content:encoded><![CDATA[<p>
首先，我们看看如何判断2个球发生碰撞。然后，再思考碰撞发生之后，球该怎么运动。
</p>
<p><img src="http://www.as4game.com/vectors/tut09_1.gif" alt="2个球的碰撞" /></p>
<p>
图中有球1（红色）和球2（蓝色）。2个球的球心之间的向量为v（绿色）。只有当v的长度小于两个球的半径只和时，两个球才发生了碰撞。我们需要做的是让2个球刚刚紧挨着，为了达到这个目的，我们需要将球1向v的方向移动一段距离：
</p>
<pre>
pen=v.len-(b1.r+b2.r)
</pre>
<p>
现在，2个球刚好紧贴，我们需要研究下运动向量如何变化。想象一下在两个球之间有一个无形的墙壁，墙壁的方式和球心连线向量的法线方向相同。
</p>
<p><img src="http://www.as4game.com/vectors/tut09_2.gif" alt="2个球碰撞之后的运动向量的改变" /></p>
<p>
图中，黑色向量是向量v的法线，将它作为墙壁向量，用之前的方法计算球1的反弹运动向量。
</p>
<p>
以下是一个例子，一个球在舞台上移动，另外有几个静态的球。
</p>
<p><object width="300" height="200"><param name="movie" value="http://www.as4game.com/vectors/vect9.swf" /><embed width="300" height="200" type="application/x-shockwave-flash" src="http://www.as4game.com/vectors/vect9.swf" ></embed></object></p>
<p>
尝试拖动那些静态的球。
</p>
<p>
你可以下载<a href="http://www.as4game.com/vectors/vect9.fla" target="_blank">fla源文件</a>。
</p>
<p><strong>把它装起来</strong><br />
你可能想让一个球在另外一个球里面。<br />
<object width="300" height="200"><param name="movie" value="http://www.as4game.com/vectors/vect9a.swf" /><embed width="300" height="200" type="application/x-shockwave-flash" src="http://www.as4game.com/vectors/vect9a.swf" ></embed></object></p>
<p>
假设，b2是大球，b1是小球。判断小球是否移出的条件是：
</p>
<pre>
b2.r<(b1.r+v.len)
</pre>
<p>
当这种情况发生的时候，我们需要将它移动回去，移动多少呢：
</p>
<pre>
var pen=b2.r-(b1.r+v.len)
</pre>
<p>
另外，要注意，计算反弹的时候，我们使用左法线（而不再是右法线）：
</p>
<pre>
var vbounce={dx:-v.dy, dy:v.dx, lx:-v.dx, ly:-v.dy};
</pre>
<p>
你可以下载<a href="http://www.as4game.com/vectors/vect9a.fla" target="_blank">fla源文件</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.as4game.com/blog/archives/489/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flash向量-8-球和角</title>
		<link>http://www.as4game.com/blog/archives/468</link>
		<comments>http://www.as4game.com/blog/archives/468#comments</comments>
		<pubDate>Fri, 04 Sep 2009 14:23:07 +0000</pubDate>
		<dc:creator>as4game</dc:creator>
				<category><![CDATA[vertors for flash]]></category>

		<guid isPermaLink="false">http://www.as4game.com/blog/?p=468</guid>
		<description><![CDATA[
不是所有的墙壁都会无限延伸，他们通常从某处出发，然后在某处结束。我们把这称为起点和终点。现在我要计算球与墙壁的角碰撞时的位置点和碰撞后的运动向量。



红色的是墙壁向量，灰色的是球的运动向量，可能碰到墙壁，也可能碰到墙角。在findIntersection函数里面，我们检测到距离球最近的墙壁，并找到让球“从相交状态回到紧贴状态的那个向量”。
墙壁向量为v2，球的运动向量是v1。先找到从墙壁的起点到球的中心的向量v3：


v3.vx=v1.p1.x-v2.p0.x;
v3.vy=v1.p1.y-v2.p0.y;


然后计算v3和墙壁向量v2的点乘：


var dp=v3.vx*v2.dx + v3.vy*v2.dy;


如果点乘为负数的话，说明球离墙壁的起点很近。并且那个移动回去的向量是向量v3。


if(dp0){
  var v=v4;
}


然而，如果这个时候，点乘为0或者负数，那么墙壁的边缘和球很近。此时，我们从墙壁起点到球中心的向量v3在墙壁法线上进行投影。球将会从墙壁法线方向移动回去，就像上一节一样。


else{
  var v=projectVector(v3, v2.lx, v2.ly);
}


最后我们返回当前的向量。


return v;


记住球的反弹向量将和球的返回向量垂直。当球碰到墙壁的时候，我们可以用墙壁向量来计算新的移动向量。当球碰到墙角的时候，从墙壁的终点到球中心的向量的法线就可以派上用场了。
尝试拖动墙壁试一试，观察球与墙壁的碰撞。



因为我们只检测了球的运动向量的终点，所以当球的速度非常快的时候，有可能球会穿过墙壁。为了避免这种情况，你应该确保球的速度永远不会超过它的半径。


你可以分别下载球与一个墙壁和多个墙壁碰撞的例子。
]]></description>
			<content:encoded><![CDATA[<p>
不是所有的墙壁都会无限延伸，他们通常从某处出发，然后在某处结束。我们把这称为起点和终点。现在我要计算球与墙壁的角碰撞时的位置点和碰撞后的运动向量。
</p>
<p><object width="300" height="200"><param name="movie" value="http://www.as4game.com/vectors/vect8.swf" /><embed width="300" height="200" type="application/x-shockwave-flash" src="http://www.as4game.com/vectors/vect8.swf" ></embed></object></p>
<p>
红色的是墙壁向量，灰色的是球的运动向量，可能碰到墙壁，也可能碰到墙角。在findIntersection函数里面，我们检测到距离球最近的墙壁，并找到让球“从相交状态回到紧贴状态的那个向量”。<br />
墙壁向量为v2，球的运动向量是v1。先找到从墙壁的起点到球的中心的向量v3：
</p>
<pre class="brush:as3">
v3.vx=v1.p1.x-v2.p0.x;
v3.vy=v1.p1.y-v2.p0.y;
</pre>
<p>
然后计算v3和墙壁向量v2的点乘：
</p>
<pre class="brush:as3">
var dp=v3.vx*v2.dx + v3.vy*v2.dy;
</pre>
<p>
如果点乘为负数的话，说明球离墙壁的起点很近。并且那个移动回去的向量是向量v3。
</p>
<pre class="brush:as3">
if(dp<0){
  var v=v3;
}
</pre>
<p>
如果点乘是0，或者正数，我就检测球是不是和墙壁的终点很近。所以，首先，找到墙壁的终点到球中心的向量：
</p>
<pre class="brush:as3">
else{
  var v4={};
  v4.vx=v1.p1.x-v2.p1.x;
  v4.vy=v1.p1.y-v2.p1.y;
</pre>
<p>
并且和第一个点类似，我们可以再次计向量算v4和墙壁的点乘。
</p>
<pre class="brush:as3">
var dp=v4.vx*v2.dx + v4.vy*v2.dy;
</pre>
<p>
如果点乘是正数，球会碰到终点，而v4是用于将球移开：
</p>
<pre class="brush:as3">
if(dp>0){
  var v=v4;
}
</pre>
<p>
然而，如果这个时候，点乘为0或者负数，那么墙壁的边缘和球很近。此时，我们从墙壁起点到球中心的向量v3在墙壁法线上进行投影。球将会从墙壁法线方向移动回去，就像上一节一样。
</p>
<pre class="brush:as3">
else{
  var v=projectVector(v3, v2.lx, v2.ly);
}
</pre>
<p>
最后我们返回当前的向量。
</p>
<pre class="brush:as3">
return v;
</pre>
<p>
记住球的反弹向量将和球的返回向量垂直。当球碰到墙壁的时候，我们可以用墙壁向量来计算新的移动向量。当球碰到墙角的时候，从墙壁的终点到球中心的向量的法线就可以派上用场了。<br />
尝试拖动墙壁试一试，观察球与墙壁的碰撞。
</p>
<p><object width="300" height="200"><param name="movie" value="http://www.as4game.com/vectors/vect8a.swf" /><embed width="300" height="200" type="application/x-shockwave-flash" src="http://www.as4game.com/vectors/vect8a.swf" ></embed></object></p>
<p>
因为我们只检测了球的运动向量的终点，所以当球的速度非常快的时候，有可能球会穿过墙壁。为了避免这种情况，你应该确保球的速度永远不会超过它的半径。
</p>
<p>
你可以分别下载球与<a target="_blank" href="http://www.as4game.com/vectors/vect8.fla">一个墙壁</a>和<a target="_blank" href="http://www.as4game.com/vectors/vect8a.fla">多个墙壁</a>碰撞的例子。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.as4game.com/blog/archives/468/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash向量-7-球和线</title>
		<link>http://www.as4game.com/blog/archives/440</link>
		<comments>http://www.as4game.com/blog/archives/440#comments</comments>
		<pubDate>Thu, 03 Sep 2009 14:00:45 +0000</pubDate>
		<dc:creator>as4game</dc:creator>
				<category><![CDATA[vertors for flash]]></category>

		<guid isPermaLink="false">http://www.as4game.com/blog/?p=440</guid>
		<description><![CDATA[球和线

到现在你可能已经厌倦了总是只有一个移动的点。倒不是说点本身有什么不好，它们是好的，但是毕竟，点只是点。你能在你的周围能看到多少个点？我相信不会很多。最后，我们将向前迈进一大步，开始移动一些更加真实的东东西 &#8211; 球。


我相信你在生活中看到过很多的球，所以你知道他们和点有什么不同。球是有宽度的。在我们的2D例子中，球是用圆来表示的，它有圆心坐标并且有半径。


game.myOb={r:10};
game.myOb.p0={x:150, y:100};


已知一个运动的球的半径是10，另外我们知道球的中心坐标，它的移动向量和半径，我们要计算球撞上墙壁的会在哪儿。



图中，灰色的圈圈表示球的中心与墙壁的交点。事实上球在更早的时候就碰到墙壁了。球碰到墙壁的时候，球的位置应该这样的，将墙壁向量（green）向它的法线方向移动一个半径的距离，然后求出这个新的向量和球的运动向量（红色）的交点。所以，我们可以不使用墙壁向量，而是用一个方向相同，起点位置不同的向量。

Axes method

球和线的交点也可以用别的方法来计算。下面就来研究下如何通过一些简单的投影来确定球是否与墙壁碰撞。



图中，我们可以看到，球处于他的运动向量的终点p1处。我们绘制一个蓝色的向量，从墙壁向量的起点（v2.p0）出发，到达球的中心。现在我们将这个新的向量在墙壁的法线上进行投影，得到向量v3（红色）。为了将球紧贴墙壁放置，我需要将它向墙壁的法线方向移动：


ball.r-v3.len


在示例代码中，我们计算出墙壁法线的单位向量：


v.lx = v.dy;
v.ly = -v.dx;


在runme函数里，我们检查所有的墙壁：


for(var i=1; i=0){
    //move object away from the wall
    ob.p1.x+=w.lx*pen;
    ob.p1.y+=w.ly*pen;
    //change movement
    var vb=bounce(ob, w);
    ob.vx=vb.vx;
    ob.vy=vb.vy;
  }
}


对于每一个墙壁，如果球撞进去了，我们就计算出撞进去的距离，再将球拉回来，然后用之前同样的方法去计算反弹之后的向量。


计算撞进去的距离的函数：


function findIntersection(v1, v2){
  //vector between center [...]]]></description>
			<content:encoded><![CDATA[<p><strong>球和线</strong></p>
<p>
到现在你可能已经厌倦了总是只有一个移动的点。倒不是说点本身有什么不好，它们是好的，但是毕竟，点只是点。你能在你的周围能看到多少个点？我相信不会很多。最后，我们将向前迈进一大步，开始移动一些更加真实的东东西 &#8211; 球。
</p>
<p>
我相信你在生活中看到过很多的球，所以你知道他们和点有什么不同。球是有宽度的。在我们的2D例子中，球是用圆来表示的，它有圆心坐标并且有半径。
</p>
<pre class="brush:as3">
game.myOb={r:10};
game.myOb.p0={x:150, y:100};
</pre>
<p>
已知一个运动的球的半径是10，另外我们知道球的中心坐标，它的移动向量和半径，我们要计算球撞上墙壁的会在哪儿。
</p>
<p><img src="http://www.tonypa.pri.ee/vectors/tut07_1.gif" alt="" /></p>
<p>
图中，灰色的圈圈表示球的中心与墙壁的交点。事实上球在更早的时候就碰到墙壁了。球碰到墙壁的时候，球的位置应该这样的，将墙壁向量（green）向它的法线方向移动一个半径的距离，然后求出这个新的向量和球的运动向量（红色）的交点。所以，我们可以不使用墙壁向量，而是用一个方向相同，起点位置不同的向量。
</p>
<p><strong>Axes method</strong></p>
<p>
球和线的交点也可以用别的方法来计算。下面就来研究下如何通过一些简单的投影来确定球是否与墙壁碰撞。
</p>
<p><img src="http://www.as4game.com/vectors/tut07_2.gif" alt="" /></p>
<p>
图中，我们可以看到，球处于他的运动向量的终点p1处。我们绘制一个蓝色的向量，从墙壁向量的起点（v2.p0）出发，到达球的中心。现在我们将这个新的向量在墙壁的法线上进行投影，得到向量v3（红色）。为了将球紧贴墙壁放置，我需要将它向墙壁的法线方向移动：
</p>
<pre class="brush:as3">
ball.r-v3.len
</pre>
<p>
在示例代码中，我们计算出墙壁法线的单位向量：
</p>
<pre class="brush:as3">
v.lx = v.dy;
v.ly = -v.dx;
</pre>
<p>
在runme函数里，我们检查所有的墙壁：
</p>
<pre class="brush:as3">
for(var i=1; i<5; i++){
  var w=game["v"+i];
  //if we have hit the wall
  var pen=ob.r-findIntersection(ob, w);
  if(pen>=0){
    //move object away from the wall
    ob.p1.x+=w.lx*pen;
    ob.p1.y+=w.ly*pen;
    //change movement
    var vb=bounce(ob, w);
    ob.vx=vb.vx;
    ob.vy=vb.vy;
  }
}
</pre>
<p>
对于每一个墙壁，如果球撞进去了，我们就计算出撞进去的距离，再将球拉回来，然后用之前同样的方法去计算反弹之后的向量。
</p>
<p>
计算撞进去的距离的函数：
</p>
<pre class="brush:as3">
function findIntersection(v1, v2){
  //vector between center of ball
  //and starting point of wall
  var v3={};
  v3.vx=v1.p1.x-v2.p0.x;
  v3.vy=v1.p1.y-v2.p0.y;
  //project this vector on the normal of the wall
  var v=projectVector(v3, v2.lx, v2.ly);
  //find length of projection
  v.len=Math.sqrt(v.vx*v.vx+v.vy*v.vy);
  return v.len;
}
</pre>
<p>
在这个例子中，尝试拖动墙壁四个角的点：
</p>
<p><object width="300" height="200"><param name="movie" value="http://www.as4game.com/vectors/vect7.swf" /><embed width="300" height="200" type="application/x-shockwave-flash" src="http://www.as4game.com/vectors/vect7.swf" ></embed></object></p>
<p>
注意，这个例子并没有考虑墙壁的长度，所有的墙壁都被认为是无限长的。这种方式可以用来保证球在盒子里面，而不会出去。在下一章节里面，我们会研究如何处理球和墙壁的角的碰撞。
</p>
<p>
你可以下载<a href="http://www.as4game.com/vectors/vect7.fla" target="_blank">fla源文件</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.as4game.com/blog/archives/440/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

