代码之家  ›  专栏  ›  技术社区  ›  Ponkadoodle

AS3 X和Y属性精度

  •  6
  • Ponkadoodle  · 技术社区  · 15 年前

    在ActionScript3(和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。
    这将强制我重写DisplayObject的X&Y属性,以便它们不被舍入。

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

    那么,为什么flash的创建者们决定四舍五入到最近的0.05?在我看来,这是一个任意的数字。

    2 回复  |  直到 8 年前
        1
  •  9
  •   Gray    15 年前

    Wikipedia article on Twips :

    flash内部计算任何 使用像素和twips(或1/20 像素的)精灵、电影剪辑和 舞台上的任何其他物体都是 用细枝定位。因此, 坐标(例如) 精灵总是0.05的倍数 (即1/20)。(即1/20)。

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

        2
  •  5
  •   Max Dohme    15 年前

    更好的是,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存储在twips(0.05的倍数)中,scalex和scaley存储在接近数字但略少一点的精度中(可能正好少一点?)