Нужна помощь в завершении выбора инструмента bumptop-ish
Я нахожусь в процессе создания инструмента выделения в стиле 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 ответ
Переберите экранный объект, к которому вы прикрепляете свои случайные спрайты, и, используя для каждого, проверяйте их значение hitTestObject в сравнении с вашим экземпляром selectionTool.
Вот документы Adobe для hitTestObject ():
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html