根据位置渲染图形

时间:2010-04-13 18:30:52

标签: flash actionscript-3

当绘制两条线之间具有固定距离的平行垂直线(1.75像素),并且两条线都具有非整数x值偏移时,将根据偏移量不同地绘制线条。下图是两对非常靠近的垂直线。如你所见,它们看起来非常不同。这很令人沮丧,尤其是在为精灵设置动画时。

alt text http://img94.imageshack.us/img94/8606/lines2.png

任何想法如何确保精灵与非整数位置的图形在视觉上显示相同?

package
{

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;

public class tmpa extends Sprite
{

private var _sp1:Sprite;
private var _sp2:Sprite;
private var _num:Number;

public function tmpa( ):void
{
    stage.align = StageAlign.TOP_LEFT;
    stage.scaleMode = StageScaleMode.NO_SCALE;

    _sp1 = new Sprite( );
    drawButt( _sp1, 0 );
    _sp1.x = 100;
    _sp1.y = 100;

    _num = 0;
    _sp2 = new Sprite( );
    drawButt( _sp2, _num );
    _sp2.x = 100;
    _sp2.y = 200;

    addChild( _sp1 );
    addChild( _sp2 );

    addEventListener( Event.ENTER_FRAME, efCb, false, 0, true );
}

private function efCb( evt:Event ):void
{   _num += .1;
    if (_num > 400)
    {   _num = 0;
    }
    drawButt( _sp2, _num );
}

private function drawButt( sp:Sprite, offset:Number ):void
{
    var px1:Number = 1 + offset;
    var px2:Number = 2.75 + offset;

    sp.graphics.clear( );
    sp.graphics.lineStyle( 1, 0, 1, true );
    sp.graphics.moveTo( px1, 1 );
    sp.graphics.lineTo( px1, 100 );

    sp.graphics.lineStyle( 1, 0, 1, true );
    sp.graphics.moveTo( px2, 1 );
    sp.graphics.lineTo( px2, 100 );
}

}
}

从原始帖子编辑,认为问题与精灵的x位置有关。

1 个答案:

答案 0 :(得分:1)

虽然flash内部使用twips,但渲染时仍然只能渲染为全像素。除了在设置.x位置之前转换为int之外,没有办法(我知道)解决这个问题。然后,您必须有一个保持实际浮点位置的数字,并在设置之前将其转换为int .x

编辑:

private function drawButt( sp:Sprite, offset:Number ):void
{
    var px1:int = 1 + offset;
    var px2:Number = px1 + 1.75;

    sp.graphics.clear( );
    sp.graphics.lineStyle( 1, 0, 1, true );
    sp.graphics.moveTo( px1, 1 );
    sp.graphics.lineTo( px1, 100 );

    sp.graphics.lineStyle( 1, 0, 1, true );
    sp.graphics.moveTo( px2, 1 );
    sp.graphics.lineTo( px2, 100 );
}