Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   перетаскивание объекта по одной оси (http://www.flasher.ru/forum/showthread.php?t=208132)

PrincessRoma 05.06.2014 23:57

перетаскивание объекта по одной оси
 
Нужно сделать драг объекта по одной указанной оси ( ось передается в конструктор вместе с остальными координатами). Причем весь код хочется уместить внутри объекта, т.к. чтобы ничего в главный класс приложения не добавлять - просто создаем объект и добавляем на сцену, тягаем по оси, которую указали при создании.

Выкладываю код всего класса :
Код AS3:

package 
{
 
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class utils_DragBlock extends Sprite
        {
                var WIDTH,HEIGHT: Number;
                var ORIENT: String;
                var MEM: Number;
 
                public function utils_DragBlock(_WIDTH:Number,_HEIGHT:Number,_ORIENT: String)
                {
                        WIDTH=_WIDTH;
                        HEIGHT=_HEIGHT;
                        ORIENT=_ORIENT;
 
                        //HOR - drag only in oY axis
                        //VER - drag only in oX axis
                        if (ORIENT=='HOR')
                        {
                                MEM=x;
                        }
                        if (ORIENT=='VER')
                        {
                                MEM=y;
                        }
 
                        drawBlock(_WIDTH,_HEIGHT);
                        this.addEventListener(MouseEvent.MOUSE_DOWN,_mouseDown);
                }
 
                function _mouseDown(e:MouseEvent)
                {
                        startDrag();
                        this.addEventListener(MouseEvent.MOUSE_MOVE,_mouseMove);
                        this.addEventListener(MouseEvent.MOUSE_UP,_mouseUp);
                }
 
                function _mouseUp(e:MouseEvent)
                {
                        stopDrag();
                        this.removeEventListener(MouseEvent.MOUSE_MOVE,_mouseMove);
                        this.removeEventListener(MouseEvent.MOUSE_UP,_mouseUp);
                }
 
                function _mouseMove(e:MouseEvent)
                {
                        if (ORIENT=='HOR')
                        {
                                if (x!=MEM)x=MEM;
                        }
                        if (ORIENT=='VER')
                        {
                                if (y!=MEM)y=MEM;
                        }
                }
 
                function drawBlock(_WIDTH:Number,_HEIGHT:Number)
                {
                        trace('DRAW DRAG BLOCK');
                        this.graphics.beginFill(0xFFCC00,0.9);
                        this.graphics.drawRect(0,0,_WIDTH,_HEIGHT);
                        this.graphics.endFill();
                }
 
        }
 
}

Работает абсолютно никак, собственно причины две:

во-первых свойства x и y вызываемые внутри класса никак не отражают реального расположения объекта в контейнере-родителе.

во-вторых переприсваивание координаты по MOUSE_MOVE при параллельном использовании метода startDrag() выдает прямо-таки эпилептические подергивания объекта, даже если всю реализацию написать в основной класс приложения и все листенеры сделать в него ( отпадает проблема с координатами, однако такое решение меня не устраивает )

Собственно вопрос:
Как все же адекватно написать класс объекта, позволяющего красиво тащить себя по двум осям?

Добавлено через 2 минуты
P.S. По одной оси из указанных двух, пардон )

Добавлено через 2 минуты
P.P.S. Из двух возможных. Я и впрямь не специально.

samana 06.06.2014 00:16

Можно как-то так:
Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        /**
        * ...
        * @author samana
        */

        public class DragBlock extends Sprite
        {
                static public const HORIZONTAL:String = "horizontal";
                static public const VERTICAL:String = "vertical";
 
                private var orient:String;
 
                public function DragBlock(w:Number,h:Number,orient:String)
                {
                        this.orient = orient;
 
                        graphics.beginFill(0xCC00CC);
                        graphics.drawRect(0, 0, w, h);
                        graphics.endFill();
 
                        addEventListener(Event.ADDED_TO_STAGE, addedToStage);
                        addEventListener(Event.REMOVED_FROM_STAGE, removedFromStage);
                }
 
                private function removedFromStage(e:Event):void
                {
                        removeEventListener(Event.REMOVED_FROM_STAGE, removedFromStage);
 
                        removeEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
                        stage.removeEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
                        stage.removeEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
                }
 
                private function addedToStage(e:Event):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
 
                        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
                {
                        if (orient == HORIZONTAL) x = parent.mouseX;
 
                        if (orient == VERTICAL) y = parent.mouseY;
 
                }
 
        }
 
}


PrincessRoma 06.06.2014 06:05

А ведь неплохо работает! Спасибо ) добавил только:
Код AS3:

if (orient == HORIZONTAL) x = parent.mouseX-(WIDTH/2);
if (orient == VERTICAL) y = parent.mouseY-(HEIGHT/2);

чтобы блок при передвижении не ускальзывал от курсора на самый краешек, и все классно)


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

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