Нужно уметь рисовать стрелки с помощью мышки и уметь ее выбирать

#flash #actionscript-3 #actionscript #flash-cs5

#flash #actionscript-3 #actionscript #flash-cs5

Вопрос:

Я пытаюсь создать флэш-приложение, которое позволит пользователю рисовать стрелки на экране / холсте с помощью мыши. Таким образом, если они нажмут и удержат левую кнопку мыши в координатах 23,12 и отпустят левую кнопку в 84,45, между 2 точками будет нарисована линия со стрелкой во второй координате.

Мне также нужно, чтобы каждую отдельную стрелку можно было выбирать, чтобы их можно было перемещать или удалять (я знаю, как это сделать!).

Если бы кто-нибудь мог мне помочь и указать правильное направление (например, пример или учебное пособие), я был бы очень признателен!

Ответ №1:

Поскольку это ваш первый вопрос:

введите описание изображения здесь

 package
{
    import flash.display.CapsStyle;
    import flash.display.Graphics;
    import flash.display.JointStyle;
    import flash.display.LineScaleMode;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;

    [SWF(percentWidth = 100, percentHeight = 100, backgroundColor = 0xefefef, frameRate = 30)]
    public class Arrows extends Sprite
    {

        public var arrows:Vector.<Sprite> = new Vector.<Sprite>();

        public var canvas:Sprite;

        public var lineColor:uint = Math.random() * 0xffffff;

        public var lineWeight:Number = 5;

        private var startPoint:Point;


        public function Arrows()
        {
            super();

            addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
        }

        protected function addedToStageHandler(event:Event):void
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;

            addCanvas();
        }

        protected function addCanvas():void
        {
            canvas = new Sprite();
            addChild(canvas);

            lineColor = Math.random() * 0xffffff;

            // give alpha for interaction
            var g:Graphics = canvas.graphics;
            g.beginFill(0x0, 0.0);
            g.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
            g.endFill();

            // listen for mouse down
            canvas.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
        }

        protected function mouseDownHandler(event:MouseEvent):void
        {
            canvas.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);

            // mark start point
            startPoint = new Point(event.localX, event.localY);

            // start rendering
            canvas.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

            // listen for mouse up / out to end arrow
            canvas.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
            canvas.addEventListener(MouseEvent.MOUSE_OUT, mouseUpHandler);
        }

        protected function enterFrameHandler(event:Event):void
        {
            var angle:Number = polarAngle(new Point(mouseX, mouseY), new Point(startPoint.x, startPoint.y));

            // draw line
            var g:Graphics = canvas.graphics;
            g.clear();

            // give alpha for interaction
            g.beginFill(0x0, 0.0);
            g.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
            g.endFill();

            g.lineStyle(lineWeight, lineColor, 1, true, LineScaleMode.NORMAL, CapsStyle.SQUARE, JointStyle.MITER);
            g.moveTo(startPoint.x, startPoint.y);
            g.lineTo(mouseX, mouseY);

            // draw arrow head
            g.moveTo(mouseX - (20 * Math.cos((angle - 45) * Math.PI / 180)),
                     mouseY - (20 * Math.sin((angle - 45) * Math.PI / 180)));

            g.lineTo(mouseX   (5 * Math.cos((angle) * Math.PI / 180)),
                     mouseY   (5 * Math.sin((angle) * Math.PI / 180)));

            g.lineTo(mouseX - (20 * Math.cos((angle   45) * Math.PI / 180)),
                     mouseY - (20 * Math.sin((angle   45) * Math.PI / 180)));
        }

        protected function polarAngle(point:Point, center:Point=null):Number
        {
            if (!center)
                center = new Point(0, 0);

            return Math.atan2(point.y - center.y, point.x - center.x) * 180 / Math.PI;
        }

        protected function mouseUpHandler(event:MouseEvent):void
        {
            canvas.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
            canvas.removeEventListener(MouseEvent.MOUSE_OUT, mouseUpHandler);

            // stop rendering
            canvas.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);

            // push canvas to arrows collection
            arrows.push(canvas);

            // add a fresh canvas
            addCanvas();
        }

    }
}
 

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

Комментарии:

1. Привет — спасибо за код! Я ОЧЕНЬ новичок в Flash и AS3, но мне дали этот проект на работе. У меня есть это в моем проекте Flash, и я могу создать объект следующим образом (поэтому я знаю, что он доступен): var a:Arrows = new Arrows(); но я не уверен, что делать дальше… Сейчас я чувствую себя идиотом, но у меня сжатые сроки. Извините, что я такой новичок!

2. Я добавил ваш код в файл под названием Arrows.as и я добавил эту строку в свой файл fla (оба файла находятся в одном каталоге): var a:Стрелки = новые стрелки ();

3. Неважно! Я не добавлял его на сцену: addChild( a); Спасибо за ваш ответ — вы сэкономили мне кучу времени!!!