ActionScript - تطهير الرسومات مع bug المشترك.
-
30-09-2019 - |
سؤال
لقد صادفت تأثيرًا غير مرغوب فيه لاستخدام insostyle.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();
}
}
}
المحلول
مثير للإعجاب. تم سبب المشكلة لأن وضع مقياس Linestyle لم يتم تعيينه على شيء:
LineScaleMode.NONE
تغييره إلى إصلاح المشكلة:
LineScaleMode.NORMAL
نصائح أخرى
ماذا عن إعادة إنشاء الشكل؟