Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ограничение при передвижении объекта [Math.max(Math.min())] (http://www.flasher.ru/forum/showthread.php?t=211747)

BornTOFree 29.10.2015 10:10

Ограничение при передвижении объекта [Math.max(Math.min())]
 
Вложений: 1
Не могу разобраться, как остановить объект, когда он упрется в грань другого объекта.
Не получается определить длину отрезка.

В примере, если тянуть за кружок, отрезок будет сокращаться до следующей грани, но за ее пределы он не должен заходить.

test.swf   (2.5 Кб)


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();
                }
        }
}


GBee 29.10.2015 10:38

Может стоит делать это снаружи? Например в обработчике moved. Проверять чтобы линия не вышла за границы соседские (не стала меньше иксом, чем сосед слева, и больше чем справа). А если стала - скидывать на соседские координаты +- оффсет?


Часовой пояс GMT +4, время: 02:14.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.