【问题标题】:Rendering of graphics different depending on position图形的渲染因位置而异
【发布时间】:2010-04-13 18:30:51
【问题描述】:

绘制平行垂直线时,它们之间的距离固定(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 位置有关的原始帖子进行编辑。

【问题讨论】:

  • 请注意,以上示例行中的所有数学运算都位于全局“twip”网格上。

标签: flash actionscript-3


【解决方案1】:

虽然 Flash 内部使用缇,但在渲染时仍然只能渲染到全像素。除了在设置 .x 位置之前强制转换为 int 之外,没有办法(据我所知)解决此问题。然后,您必须拥有一个保持实际浮点位置的 Number,并在设置 .x

之前将其转换为 int

编辑:

私有函数 drawButt( sp:Sprite, offset:Number ):void { var px1:int = 1 + 偏移量; 变量 px2:数字 = 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); }

【讨论】:

  • 感谢您的评论。它鼓励我编辑帖子并删除精灵的 x 位置,以简化对这个问题的描述。由于有时可以渲染线条之间的亚像素空间,我想我的挑战是找出这些条件是什么。
  • 啊……我误会了。但正如我所说,flash 不能在子像素上渲染。我不记得它是如何四舍五入的,但该值在绘制之前肯定是四舍五入的。因此,确保它们相同的唯一方法是在绘制之前将其转换为 int。我不知道你为什么必须使用子像素,但如果你只是将 px1 转换为一个 int,然后将 1.75 添加到它以获得 px2,你仍然可以让线条彼此偏移 1.75,它们应该视觉上是一样的。我已将其编辑到我的帖子中。
猜你喜欢
  • 1970-01-01
  • 2011-12-08
  • 2019-04-15
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多