Нужна помощь в завершении выбора инструмента bumptop-ish - PullRequest
1 голос
/ 29 августа 2010

Я нахожусь в процессе создания инструмента выделения в стиле Bumptop.Прямо сейчас я дошел до создания самого инструмента (который на самом деле работает довольно хорошо) и распространения некоторых случайных квадратных элементов на сцене.Это класс, который создает инструмент выбора:

package com.reyco1.medusa.selectiontool
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;

    public class SelectionBase extends Sprite
    {
        private var points:Array = [];

        public function SelectionBase()
        {
            super();
            addEventListener(Event.ADDED_TO_STAGE, initialize);
        }

        private function initialize(e:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, initialize);

            points.push(new Point(mouseX, mouseY));          stage.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
        }

        private function handleMouseMove(e:MouseEvent):void
        {           
            graphics.clear();

            graphics.beginFill(0x33CCFF, .5);
            graphics.drawCircle(0, 0, 20);
            graphics.endFill();

            graphics.moveTo(0, 0);
            graphics.lineStyle(1.5, 0x33CCFF, .5);
            graphics.lineTo(mouseX, mouseY);

            points.push(new Point(mouseX, mouseY));

            graphics.beginFill(0x33CCFF, .1);
            graphics.moveTo(points[0].x, points[0].y);

            for (var i:uint = 1; i < points.length; i++)
            {
                graphics.lineTo(points[i].x, points[i].y);
            }

            graphics.lineTo(points[0].x, points[0].y);
            graphics.endFill();

            dispatchEvent(new Event("UPDATE"));
        }

        public function clear():void
        {
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
            graphics.clear();
        }
    }
}

И это класс документа, который его реализует:

package
{
    import com.reyco1.medusa.selectiontool.SelectionBase;

    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.display.StageAlign;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;

    [SWF(width = '1024', height = '768', backgroundColor = '0x000000')]
    public class SelectionToolPrototype extends Sprite
    {
        private var selectionTool:SelectionBase;

        public function SelectionToolPrototype()
        {                         
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.quality = StageQuality.MEDIUM;
                    stage.addEventListener(MouseEvent.MOUSE_DOWN, handleDown);
            stage.addEventListener(MouseEvent.MOUSE_UP,     handleUp);  

            placeShapesRandomly();
        }

        private function placeShapesRandomly():void
        {
            for(var a:Number = 0; a<25; a++)
            {
                var s:Sprite = new Sprite();
                s.graphics.beginFill(Math.random() * 0xCCCCCC);
                s.graphics.drawRect(0, 0, 50, 50);
                s.graphics.endFill();
                s.x = Math.floor(Math.random() * 900 - 40) + 40;
                s.y = Math.floor(Math.random() * 700 - 40) + 40;
                s.rotation =  Math.floor(Math.random() * 360 - 40) + 40;
                s.buttonMode = true;
                addChild(s);
            }
        }

        private function handleUp(e:MouseEvent):void
        {
            selectionTool.removeEventListener("UPDATE", handleToolUpdate);
            removeChild(selectionTool);
            selectionTool = null;
        }

        private function handleDown(e:MouseEvent):void
        {
            selectionTool = new SelectionBase();
            selectionTool.addEventListener("UPDATE", handleToolUpdate);
            selectionTool.x = mouseX;
            selectionTool.y = mouseY;
            addChild(selectionTool);
        }

        private function handleToolUpdate(e:Event):void
        {
            // logic to determin if items are within selection goes here        
        }
    }
}

Я пытался использовать обнаружение столкновений с помощью BitmapData идаже используя библиотеки столкновений, такие как CDK, но я не могу заставить что-либо работать.У кого-нибудь есть идея, что мне следует использовать в handleToolUpdate(e:MouseEvent);?Спасибо!

Обновление:

Я сломаю это.В основном я пытаюсь создать прототип инструмента BumpTop Lasso или Selection.

Мне нужна помощь в выяснении, какие объекты либо сталкиваются, либо имеют точку в границах нарисованного лассо.

Я загрузил то, что у меня есть, на мой сервер здесь: http://labs.reyco1.com/bumptop/SelectionToolPrototype.html. Вы можете увидеть источник, щелкнув правой кнопкой мыши и выбрав «Просмотр источника».

Как я уже говорил в своем предыдущем посте, я пыталсяс помощью тестирования коллизий Bitmapdata и даже пытался использовать Collision Detection Kit, но безрезультатно.Заранее спасибо.

1 Ответ

0 голосов
/ 14 июля 2011

Перебирайте экранный объект, к которому вы прикрепляете свои случайные спрайты, и, используя для каждого, проверяйте их значение hitTestObject для вашего экземпляра selectionTool.

Вот документы Adobe для hitTestObject ():

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#hitTestObject%28%29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...