/**************************************************************** * * Modern Carpentry Spiderweb * * Investigations into Dual Parented Display Objects * * @version 0.2 * @author Thomas Saunders * * Licensed under GPL version 3 * see http://modern-carpentry.com/workshop/spiderweb/license.txt * * *****************************************************************/ package com.modernCarpentry.spiderweb.display { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; public class DualParentSprite extends Sprite { public var ox:Number; public var oy:Number; protected var _parent1:DualParentSprite; protected var _parent2:DualParentSprite; protected var _children:Array = new Array(); protected var _origin:Boolean = false; protected var _position:Number; protected var _generation:int; protected var _dragging:DualParentSprite; protected var _isDragging:Boolean = false; public function DualParentSprite(generation:int, parent1:DualParentSprite=null, parent2:DualParentSprite=null, position:Number =-1 ):void { _generation = generation; _position = position; if(parent1 == null || parent2 == null) { _origin = true; trace("created an unparented dual parent sprite"); trace("an adam, or an eve, if you will..."); } else { _parent1 = parent1; _parent2 = parent2; _parent1.addEventListener(Event.CHANGE, onParentChange); _parent2.addEventListener(Event.CHANGE, onParentChange); } addEventListener(Event.ADDED_TO_STAGE, onStage); } public function getPointOnLine(position:Number):Point { return new Point(_parent1.x+((_parent2.x - _parent1.x)*(position+.05)), _parent1.y+((_parent2.y - _parent1.y)*(position+.05))); } public function get children():Array { return _children; } override public function get numChildren():int { return _children.length; } public function addDualParentedChild(child:DualParentSprite):void { _children.push(child); } public function update():void { draw(); } public function get isDragging():Boolean { return _isDragging; } protected function onStage(event:Event):void { removeEventListener(Event.ADDED_TO_STAGE, onStage); if( _generation == 0 ) { addEventListener(MouseEvent.MOUSE_DOWN, mdown); buttonMode = true; } draw(); } protected function onParentChange(event:Event):void { if(event.target == _parent1) { // trace("updating due to change in parent1"); } else { // trace("updating due to change in parent2"); } draw(); } protected function draw():void { graphics.clear(); switch(_generation) { case 0: graphics.beginFill(0); graphics.drawCircle(0, 0, 6); graphics.endFill(); break; case 1: graphics.lineStyle(2, 0); graphics.moveTo(_parent1.x, _parent1.y); graphics.lineTo(_parent2.x, _parent2.y); break; case 2: graphics.beginFill(0x110000); var p1:Point = _parent1.getPointOnLine(_position); var p2:Point = _parent2.getPointOnLine(_position); graphics.endFill(); graphics.lineStyle(1, 0x333333); graphics.moveTo(p1.x, p1.y); graphics.lineTo(p2.x, p2.y); break; } dispatchEvent(new Event(Event.CHANGE)); } protected function mdown(event:MouseEvent):void { stage.addEventListener(MouseEvent.MOUSE_UP, mup); _isDragging=true; _dragging = event.target as DualParentSprite; _dragging.graphics.clear(); _dragging.graphics.beginFill( 0xff0000 ); _dragging.graphics.drawCircle( 0, 0, 6 ); _dragging.graphics.endFill(); startDrag(); } protected function mup(event:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_UP, mup); _isDragging=false; _dragging.graphics.clear(); _dragging.graphics.beginFill( 0 ); _dragging.graphics.drawCircle( 0, 0, 6 ); _dragging.graphics.endFill(); _dragging.ox = _dragging.x; _dragging.oy = _dragging.y; stopDrag(); dispatchEvent(new Event(Event.CHANGE)); } protected function onResize(event:Event):void { } } }