<?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>ActionScript 3 Lover &#187; position</title>
	<atom:link href="http://as3blog.com/tag/position/feed/" rel="self" type="application/rss+xml" />
	<link>http://as3blog.com</link>
	<description>Focus on ActionScript 3</description>
	<lastBuildDate>Thu, 19 Nov 2009 04:51:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>闲话Flash中对小数坐标处理的问题</title>
		<link>http://as3blog.com/as3/fix-decimal-fraction-position-in-actionscript/</link>
		<comments>http://as3blog.com/as3/fix-decimal-fraction-position-in-actionscript/#comments</comments>
		<pubDate>Sat, 14 Feb 2009 04:28:41 +0000</pubDate>
		<dc:creator>Aw</dc:creator>
				<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[Decimal Fraction]]></category>
		<category><![CDATA[position]]></category>

		<guid isPermaLink="false">http://as3blog.com/as3/fix-decimal-fraction-position-in-actionscript/</guid>
		<description><![CDATA[Update: 具体项目中，其实可以用扩展Sprite类并建立setter和getter来实现，不再赘述了。
一个头痛了几天的bug终于fixed……我真的是太迟钝了。
最近，遇到这样一个案例，需要以非常缓慢的速度移动某几个物体，而且，这些物体之间还会发生“无损弹性碰撞”（修正主义万恶的高中课本翻译的是“完全弹性碰撞”，我个人觉得Perfect Collision应该为“无损”更易理解吧？）
总之，这些物体的速度（即位移增量）可能灰常灰常小。小到什么程度呢？这么说吧，由于所有的值都是根据动量守恒定律和能量守恒定律（还记得这俩公式的同学你们可以去解放美帝国主义了）算出来的，因为难免出现某一个物体从某一个角度撞击另一个物体之后，两者中某一物体的某一方向（x或者y）上的速度被“中和”掉了。
刚才提到，在计算机语言中，速度即位移增量。ActoinScript的写法则是：

fuckCERNET.x += fuckCERNET.vx; //fuckCERNET is an instance of some dynamic class

当fuckCERNET.vx &#60; 1/20时，Flash则不再渲染。这是根据FlashPlayer万恶的内部机制来实现的。根据我和一些美帝国主义的Flasher讨论，发现，FlashPlayer对物体x、y属性是有保护的：

Implementation
  public function get x():Number
  public function set x(value:Number):void

为什么要有这个保护呢，也不难理解：肯定是因为你直接让一个物体移动到0.001的位置上后计算机（FlashPlayer）不知道怎么去显示它：计算机是根据像素组成的，例如我们通常所说的1024&#215;768：即便你的影片再高清再无码，你放到80&#215;60的显示器上还是只能显示4800个点。
虽然“万恶”，但不得不承认FlashPlayer很聪明地回避了这样的问题，甚至，很优雅地通过一个setter来解决了问题，我们可以想象这个setter可能会是：

public function set x(value:Number):void {
  if (value &#60; 0.05) value = 0;
  // blah .. blah
}

好的，知道这个之后，就好办了。每次速度改变（即碰撞的时候）做一次“最低值判断”：当速度标量（即不考虑方向）不为0（实际上这种情况很小）但小于0.05时，让速度等于0.05就好，可以用我写的这个函数来修正：

private function fixDecimalFractionPosition(value:Number):Number {
  if (Math.abs(value) &#60; .05) {
    return [...]]]></description>
			<content:encoded><![CDATA[<p>Update: 具体项目中，其实可以用扩展Sprite类并建立setter和getter来实现，不再赘述了。</p>
<p>一个头痛了几天的bug终于fixed……我真的是太迟钝了。</p>
<p>最近，遇到这样一个案例，需要以非常缓慢的速度移动某几个物体，而且，这些物体之间还会发生“无损弹性碰撞”（修正主义万恶的高中课本翻译的是“完全弹性碰撞”，我个人觉得Perfect Collision应该为“无损”更易理解吧？）</p>
<p>总之，这些物体的速度（即位移增量）可能灰常灰常小。小到什么程度呢？这么说吧，由于所有的值都是根据动量守恒定律和能量守恒定律（还记得这俩公式的同学你们可以去解放美帝国主义了）算出来的，因为难免出现某一个物体从某一个角度撞击另一个物体之后，两者中某一物体的某一方向（x或者y）上的速度被“中和”掉了。</p>
<p>刚才提到，在计算机语言中，速度即位移增量。ActoinScript的写法则是：</p>
<blockquote>
<pre>fuckCERNET.x += fuckCERNET.vx; //fuckCERNET is an instance of some dynamic class</pre>
</blockquote>
<p>当fuckCERNET.vx &lt; 1/20时，Flash则不再渲染。这是根据FlashPlayer万恶的内部机制来实现的。根据我和一些美帝国主义的Flasher讨论，发现，FlashPlayer对物体x、y属性是有保护的：</p>
<blockquote>
<pre>Implementation
  public function get x():Number
  public function set x(value:Number):void</pre>
</blockquote>
<p>为什么要有这个保护呢，也不难理解：肯定是因为你直接让一个物体移动到0.001的位置上后计算机（FlashPlayer）不知道怎么去显示它：计算机是根据像素组成的，例如我们通常所说的1024&#215;768：即便你的影片再高清再无码，你放到80&#215;60的显示器上还是只能显示4800个点。</p>
<p>虽然“万恶”，但不得不承认FlashPlayer很聪明地回避了这样的问题，甚至，很优雅地通过一个setter来解决了问题，我们可以想象这个setter可能会是：</p>
<blockquote>
<pre>public function set x(value:Number):void {
  if (value &lt; 0.05) value = 0;
  // blah .. blah
}</pre>
</blockquote>
<p>好的，知道这个之后，就好办了。每次速度改变（即碰撞的时候）做一次“最低值判断”：当速度标量（即不考虑方向）不为0（实际上这种情况很小）但小于0.05时，让速度等于0.05就好，可以用我写的这个函数来修正：</p>
<blockquote>
<pre>private function fixDecimalFractionPosition(value:Number):Number {
  if (Math.abs(value) &lt; .05) {
    return (value &gt; 0) ? .05 : -.05;
  }
  return value;
}</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://as3blog.com/as3/fix-decimal-fraction-position-in-actionscript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
