質問

グラフィックスをクリア/再描画するときに、JointStyle.miterを使用することの望ましくない効果に出くわしました。

私のプロジェクトでは、丸いエッジとシャープなエッジの両方でカスタムライングラフィックを管理することが含まれているため、マイタージョイントスタイルを使用したいと思います。

ラインの厚さが大幅に増加すると、ラインの丸い領域でさえマイタースタイルの影響を受けます。私はこれを残念だと思いますが、それは理解でき、私が言及しているバグではありません。バグ(?)は、ラインの厚さを減らすとグラフィックスを完全にクリアしないときに発生します。これは、厚さが変わるたびにコードによってそうするように指示され、ライングラフィックのアーティファクトがかつてあった場所に残っています。アーティファクトは、丸い角だけでなく、鋭いエッジも残されます。

Mac OS X Snow Leopard(10.6.4)でフラッシュプレーヤーバージョン10.1.53.64を使用しています。

これは、以下のサンプルコードを実行してテストできます。左右のキーボードの矢印を使用して、丸い長方のストロークの厚さを変更します。

アップデート: グラフィックスアーティファクトは表面的です。それらが表示された後、その場所に形状をドラッグすると、それらが削除されます。ドラッグ機能で更新されたコード。

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();
        }
    }
}

alt text

役に立ちましたか?

解決

面白い。 LinestyleのスケールモードがNOに設定されていたため、問題が発生しました。

LineScaleMode.NONE

それを通常に変更すると、問題が修正されます。

LineScaleMode.NORMAL

他のヒント

形状を再現するのはどうですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top