Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 不同位置的图形渲染不同_Flash_Actionscript 3 - Fatal编程技术网

Flash 不同位置的图形渲染不同

Flash 不同位置的图形渲染不同,flash,actionscript-3,Flash,Actionscript 3,当绘制两条线之间具有固定距离(1.75像素)且两条线的x值偏移量均为非整数的平行垂直线时,将根据偏移量绘制不同的线。下图中是两对非常接近的垂直线。正如你所看到的,它们看起来非常不同。这是令人沮丧的,尤其是在设置精灵动画时 如何确保具有非整数位置图形的精灵在视觉上显示相同的图像 package { import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode;

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

如何确保具有非整数位置图形的精灵在视觉上显示相同的图像

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位置有关。

尽管flash内部使用twips,但渲染时仍只能渲染到完整像素。据我所知,除了在设置.x位置之前将其转换为int之外,没有其他方法可以解决这个问题。然后必须有一个保持实际浮点位置的数字,并在设置.x之前将其转换为int

编辑:

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 ); } 专用函数drawButt(sp:Sprite,偏移量:Number):无效 { 变量px1:int=1+偏移量; 变量px2:Number=px1+1.75; sp.graphics.clear(); sp.graphics.lineStyle(1,0,1,true); sp.graphics.moveTo(px1,1); sp.graphics.lineTo(px100); sp.graphics.lineStyle(1,0,1,true); sp.graphics.moveTo(px2,1); sp.graphics.lineTo(px2100); }
请注意,上面示例中的所有数学都是在一个全局“twip”网格上的图形行。谢谢您的评论。它鼓励我编辑帖子并删除精灵的x位置,以简化对这个问题的描述。由于有时线条之间的亚像素空间可以被渲染,我想我的挑战是找出这些条件是什么。啊。。我的误解。但正如我所说,flash不能在亚像素上渲染。我不记得它是如何四舍五入的,但值在绘制之前肯定是四舍五入的。因此,确保它们相同的唯一方法是在绘制之前自己将其转换为int。我不知道为什么你必须使用子像素,但是如果你只是把px1转换成int,然后再加上1.75得到px2,你仍然可以让线彼此偏移1.75,它们在视觉上应该是一样的。我已将其编辑到我的帖子中。