2010-10-30 87 views
6

在ActionScript 3(和IIRC 2)中,显示对象上的x和y属性总是以0.05的倍数存储。AS3 x和y属性精度

所以像obj.x = 66.6666相同obj.x = 66.65

大多数时候,这并不重要。但有时候我可能会遇到移动速度非常慢的物体,例如每秒1个像素。 1/60(fps)=每帧0.017个像素。 obj.x += 0.017从来没有实际上改变x值,因为它四舍五入到最接近的0.05。
这迫使我重写DisplayObject的x属性,以便它们不被舍入。

我可以理解舍入坐标到最接近的整数值进行渲染。使用更高级的渲染器,我甚至可以理解四舍五入可以用二进制表示的分数(例如0.25)。但0.05不能完全用二进制表示。

那么为什么Flash的创建者决定将其舍入到最接近的.05?对我来说,这似乎是一个任意的数字。

回答

9

Wikipedia article on Twips

闪存内部计算任何 使用与缇像素(或像素的1/20 )。精灵,电影剪辑和 在舞台上的任何其他物体是 定位与缇。结果,(例如) 精灵的坐标总是0.05 (即1/20)(即1/20)的倍数。

解决方法是将坐标存储在数字中,然后将其分配给displayobject的属性。

+0

好的,但我的问题更多地是关于什么广告使用.05倍数的优势在于。 – Ponkadoodle 2010-10-30 03:18:59

+3

根据SWF文件格式规范,“Twips是尺寸和精度之间的良好折中,它们为缩放和精确放置对象提供了亚像素精度,同时每个坐标消耗很少的位。” – 2010-10-30 06:29:49

+0

这个答案不是你要找的吗? – 2010-11-21 04:01:42

5

更妙的是,精度是的DisplayObject的其他属性不同...考虑下面的代码:

var tmp:Number = 1/17; 
var s:Sprite = new Sprite(); 
s.scaleX = tmp; 
s.scaleY = tmp; 
s.x = tmp; 
s.y = tmp; 
s.rotation = tmp; 
trace(tmp); 
trace(s.scaleX); 
trace(s.scaleY); 
trace(s.x); 
trace(s.y); 
trace(s.rotation); 

它将输出

0.058823529411764705 
0.0588235294117647 
0.0588235294117647 
0.05 
0.05 
0.058823529411764705 

这意味着旋转存储在数精度,X y以缇为单位(倍数为0.05),scaleX和scaleY存储的精度接近于Number,但稍小一点(可能恰好少一点?)

+0

这是很好的知道。干杯。 – Jono 2012-02-14 22:11:40

+1

这很难找,也很荒谬。数字应该存储为数字;这种任意舍入只是要求脚本的麻烦,比如转换坐标时的累积错误,严重的是,一个BIT的缩放精度较低?这就像有人故意破坏系统。这就像是“哦,这是一个数字,所以我可以用它来计算,除了,不,不能,因为它没有警告就在引擎盖下倒圆角。” – Triynko 2014-06-18 21:08:31