Не могу разобраться, как остановить объект, когда он упрется в грань другого объекта.
Не получается определить длину отрезка.
В примере, если тянуть за кружок, отрезок будет сокращаться до следующей грани, но за ее пределы он не должен заходить.
Main
Код AS3:
package {
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite {
private var contLine:Sprite = new Sprite();
private var line:SquareGraphic;
private var _markers:Array = [];
private var arrLine:Array = [];
private var cumulateW:Number = 0
public function Main():void {
addChild(contLine);
for (var i:int = 0; i < 8; i++) {
line = new SquareGraphic(50 + Math.random() * 70, 30, 0xCCCCCC, 1, 0x0);
contLine.addChild(line);
line.alpha = 0.5;
line.x = cumulateW;
arrLine.push(line);
cumulateW += line.width;
var marker:Marker = new Marker(cumulateW, 15);
addChild(marker);
_markers[i] = marker;
}
addEventListener(Marker.MOVED, moved);
}
private function moved(e:Event=null):void {
for (var i:int = 0; i < _markers.length; i++) {
var pMarker:Number = 0;
if (i > 0) {
pMarker = _markers[i - 1].x;
}else{
pMarker = 0;
}
arrLine[i].x = pMarker;
arrLine[i].update(_markers[i].x - pMarker, 30);
}
}
}
}
Marker
Здесь я пытался с помощью Math.max;min останавливать перемещение.
Код AS3:
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
public class Marker extends Sprite {
static public const MOVED:String = "move";
public function Marker(xPos:int = 0, yPos:int = 0) {
graphics.lineStyle(0.1);
graphics.beginFill(0xFFFFFF);
graphics.drawCircle(0, 0, 5);
graphics.endFill();
x = xPos;
y = yPos;
buttonMode = true;
addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
}
private function mouseDown(e:MouseEvent):void {
stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
}
private function stage_mouseUp(e:MouseEvent):void {
stage.removeEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
stage.removeEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
}
private function stage_mouseMove(e:MouseEvent):void {
x = e.stageX;
dispatchEvent(new Event(MOVED, true));
}
override public function get x():Number { return super.x;}
override public function set x(value:Number):void {
//!!
//value = Math.max(0, 0);
//value = Math.min(0, 0);
if (x != value) {
super.x = value;
}
}
}
}
Код AS3:
package {
import flash.display.Graphics;
import flash.display.Sprite;
public class SquareGraphic extends Sprite {
public var g:Sprite;
private var thickness:Number;
private var colorLine:uint;
private var initWidth:Number;
private var initHeight:Number;
private var color:uint;
public function SquareGraphic(initWidth:int, initHeight:int, color:uint = 0x000000, thickness:Number = 0, colorLine:uint = 0xFFFFFF) {
g = new Sprite()
addChild(g)
this.thickness = thickness;
this.color = color;
this.colorLine = colorLine;
this.initWidth = initWidth
this.initHeight = initHeight;
g.graphics.beginFill(color);
if(thickness > 0)g.graphics.lineStyle(thickness, colorLine, 1, true, "none", "round");
g.graphics.drawRect(0, 0, initWidth, initHeight);
g.graphics.endFill();
}
public function update(initWidth:Number, initHeight:Number):void {
this.initWidth = initWidth
this.initHeight = initHeight;
g.graphics.clear();
g.graphics.beginFill(color);
if(thickness > 0)g.graphics.lineStyle(thickness, colorLine);
g.graphics.drawRect(0, 0, initWidth, initHeight);
g.graphics.endFill();
}
}
}