AS3 x和y属性精度

时间:2010-10-30 02:42:21

标签: flash actionscript-3 rendering coordinates precision

在ActionScript 3(和IIRC 2)中,显示对象上的x和y属性始终存储为0.05的倍数。

obj.x = 66.6666之类的内容与obj.x = 66.65

相同

大多数时候,这没关系。但有时我最终会得到速度很慢的物体,例如每秒1个像素。 1/60(fps)=每帧0.017像素。 obj.x += 0.017从不实际更改x值,因为它会四舍五入到最接近的0.05。 这迫使我改写x& y DisplayObject的属性,以便它们不会被舍入。

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

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

2 个答案:

答案 0 :(得分:9)

来自Wikipedia article on Twips

  

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

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

答案 1 :(得分: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存储的精度接近于数字但略低(可能正好少一点?)