Flash对小数坐标的处理

小数坐标的设值问题

先看一个例子:

    var a:Sprite = new Sprite();
    a.x = 0;
    for(var i:int = 0; i < 100; i++){
        a.x += 0.04;
    }
    trace(a.x);

trace输出:0

为什么不是4?

在进行物理运动计算时,低速移动会出现这种应用场景。在Flash中设置DisplayObject的x, y值增量小于0.05时,设值会被忽略,因为Flash对x, y属性是有保护的。

为什么要保护了,我们可想像显示器是以像素为单位显示的,而x = 0.01与x = 0.02展现出来并不会有差别,小于0.05的增量直接忽略避免后续逻辑的执行也算出于性能上的考虑。setter逻辑大概如此:

public function set x(value:Number):void{
    if(value < 0.05)
        value = 0;
    //……
}

知道原因解决也就简单了,订制DisplayObject重写setter对小于0.05的值作暂存处理,批量更改。

小数坐标的渲染方案

前文已经提到显示器以整数像素为单位展示,Flash坐标存在小数值,如果Sprite.x = 0.2在显示器上的展现效果是怎样的呢?

下面这个例子,创建一批黑色、白色的方块,一黑一白两两一组。每组的两个方块白色置于黑色之上,y坐标相等,分别展示x坐标差值为0、0.1、0.2……0.9、1这11种情况下的显示效果:

flash-place-color-list.png

上面是放大后的图片,从上到下白色块x坐标相对于黑色块从0增加到1,左边渐变部分宽1px,绿色值为这1px区域RGB值。

可以看出小数位在.2、.4、.7、.9时灰度变化。Flash在处理小数坐标时会以边缘1px区域Alpha值体现小数位的变化。

标签:flash, 坐标, 像素

添加新评论