在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?这对我来说似乎是一个任意数字。
答案 0 :(得分:9)
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存储的精度接近于数字但略低(可能正好少一点?)