ActionScript — очистка графики с помощью ошибки JointStyle.MITER?

Я столкнулся с нежелательным эффектом использования JointStyle.MITER при очистке/перерисовке графики.

Мой проект включает в себя управление настраиваемой линейной графикой как с круглыми, так и с острыми краями, поэтому я хотел бы использовать стиль соединения под углом.

Когда толщина линии значительно увеличивается, даже круглые области линии затрагиваются стилем митры. Хотя я нахожу это прискорбным, это понятно, а не ошибка, о которой я говорю. ошибка (?) возникает, когда уменьшение толщины линии не полностью очищает графику, как указано в коде, делать это каждый раз при изменении толщины, оставляя артефакты линейной графики там, где когда-то была линия. Артефакты также оставляют острые края, а не только закругленные углы.

Я использую Flash Player версии 10.1.53.64 на Mac OS X Snow Leopard (10.6.4).

Вы можете проверить это, запустив мой пример кода ниже. используйте левую и правую стрелки клавиатуры, чтобы изменить толщину обводки круглого прямоугольника.

Обновление: графические артефакты поверхностны. Перетаскивание формы по их местоположению после их появления удалит их. Код обновлен с возможностью перетаскивания.

package
{
import flash.display.CapsStyle;
import flash.display.JointStyle;
import flash.display.LineScaleMode;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;

public class StrokeWidth extends Sprite
    {
    private var roundRect:Sprite = new Sprite();
    private var strokeThickness:Number = 6;

    public function StrokeWidth()
        {
        addEventListener(Event.ADDED_TO_STAGE, init);
        }

    private function init(evt:Event):void
        {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownEventListener);
        roundRect.addEventListener(MouseEvent.MOUSE_DOWN, mouseEventListener);
        roundRect.addEventListener(MouseEvent.MOUSE_UP, mouseEventListener);

        drawRoundRect();
        roundRect.x = roundRect.y = 100;
        addChild(roundRect);
        }

    private function drawRoundRect():void
        {
        roundRect.graphics.clear();
        roundRect.graphics.lineStyle(strokeThickness, 0x000000, 1.0, true, LineScaleMode.NONE, CapsStyle.NONE, JointStyle.MITER);
        roundRect.graphics.beginFill(0xFF0000);
        roundRect.graphics.drawRoundRect(0, 0, 400, 200, 100);
        }

    private function mouseEventListener(evt:MouseEvent):void
        {
        switch  (evt.type)
                {
                case MouseEvent.MOUSE_DOWN: roundRect.startDrag();  break;
                case MouseEvent.MOUSE_UP:   roundRect.stopDrag();   
                }
        }

    private function keyDownEventListener(evt:KeyboardEvent):void
        {
        switch  (evt.keyCode)
                {
                case Keyboard.LEFT:     strokeThickness -= 1;       break;
                case Keyboard.RIGHT:    strokeThickness += 1;
                }

        drawRoundRect();
        }
    }
}

альтернативный текст


person Chunky Chunk    schedule 09.11.2010    source источник


Ответы (2)


интересный. проблема была вызвана тем, что для режима масштабирования lineStyle не было установлено значение none:

LineScaleMode.NONE

изменение его на обычное устраняет проблему:

LineScaleMode.NORMAL
person Chunky Chunk    schedule 11.11.2010
comment
СПАСИБО!! Как раз искал решение той же проблемы. Решение сработало отлично! :-) - person Simon East; 13.02.2011

а как насчет воссоздания формы?

person www0z0k    schedule 09.11.2010
comment
представьте анимацию толщины линии. я полагаю, что будет намного быстрее и проще просто очистить графику и перерисовать ее, вместо того чтобы удалять предыдущую фигуру из списка отображения, создавать экземпляр новой фигуры, рисовать фигуру и добавлять ее в список отображения. я имею в виду, разве не в этом суть функции clear()? - person Chunky Chunk; 09.11.2010
comment
@TheDarkInI1978: может, маскировка? - person www0z0k; 09.11.2010
comment
это идея, но на данный момент меня больше интересует, является ли это реальной ошибкой или нет. кроме того, я не уверен, что маскирование вообще сработает, поскольку эти графические артефакты поверхностны. если вы преобразуете фигуру в спрайт и сделаете ее перетаскиваемой, фигура действует как ластик артефактов, когда она перемещается по ним. - person Chunky Chunk; 10.11.2010
comment
Не думаю, что воссоздание поможет. У меня была такая же ошибка при выполнении Graphics.clear() и перерисовке линий, только чтобы на экране оставались определенные края. Но исправление LineScaleMode сработало отлично! - person Simon East; 13.02.2011