Форум 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=184727)

fduch 25.09.2012 20:20

Как опросить обьект в обьекте?
 
Есть 2е картинки, мап и спрайт, нужно чтобы при нажатии на мап, двигалась сама картинка и все повешенные на нее обьекты, при этом нужно, чтобы была возможность перетаскивать эти сами обьекты.
Подскажите как.
Код AS3:

                        [Embed(source = "../lib/map.jpg")] var mapjpg:Class;
                        [Embed(source = "../lib/sprit1.png")] var spr1:Class;
 
                        var map: DisplayObject = new mapjpg();
                        var spr: DisplayObject = new spr1();
 
                        var sprite:Sprite = new Sprite();
                        addChild(sprite);
                        sprite.addChild (map);
 
                        spr.x = 1000;
                        spr.y = 0;
                        sprite.addChild(spr);
 
 
                        sprite.addEventListener(MouseEvent.MOUSE_DOWN, on_MD);
                        sprite.addEventListener(MouseEvent.MOUSE_UP, on_MU);
 
                        spr.addEventListener(MouseEvent.MOUSE_DOWN, aa1);
 
                          function aa1(e:MouseEvent):void {e.currentTarget.startDrag();}
                        function on_MD(e:MouseEvent):void {e.currentTarget.startDrag();}
                        function on_MU(e:MouseEvent):void {e.currentTarget.stopDrag();}


Wolsh 25.09.2012 20:43

Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite
        {
                [Embed(source = "../lib/map.jpg")] private const mapClass:Class;
                [Embed(source = "../lib/sprit1.png")] private const objClass:Class;
 
                public function Main():void
                {
                        var container:Sprite = new Sprite();
                        this.addChild(container);
                        var mapImage:Bitmap = new mapClass();
                        container.addChild(mapImage);
                        var mapObject:Sprite = new Sprite();
                        mapObject.addChild(new objClass());
                        container.addChild(mapObject);
 
                        container.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
                        container.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
                }
 
                private function mouseUpHandler(event:MouseEvent):void
                {
                        event.target.stopDrag();
                }
 
                private function mouseDownHandler(event:MouseEvent):void
                {
                        event.target.startDrag();
                }
        }
}

Добавлено через 5 минут
(Битмап не генерит мышиные события. Он не наследует InteractiveObject)

fduch 25.09.2012 21:01

спс.
Если не сложно объясните смысловую нагрузку этих строк
Код AS3:

                mapObject.addChild(new objClass());
                        container.addChild(mapObject);

зачем в принципе первая строчка?

Wolsh 25.09.2012 21:13

Объясняю: (Битмап не генерит мышиные события. Он не наследует InteractiveObject)
Поэтому битмап ( new objClass() ) добавляем в интерактивный контейнер — спрайт mapObject, чтобы он мог "ловить" нажатие мыши.
В вашем коде spr.addEventListener(MouseEvent.MOUSE_DOWN, aa1); не имеет смысла, потому что битмап spr никогда не пошлет событие MouseEvent.MOUSE_DOWN, соответственно обработчик аа1 никогда не будет вызван.

fduch 25.09.2012 21:22

Примерно понял, спс.
Еще вопрос тогда, как в вашем случае обратиться к mapObject?
Хотябы посмотреть координаты.
Код AS3:

                        container.addEventListener(MouseEvent.MOUSE_MOVE, mouseMOVE);
        function mouseMOVE (event:MouseEvent):void {
                                trace(mapObject.x);
                                trace(container.mapObject.x);
                }

Добавлено через 16 минут
функция незнает о таком обьекте... получается можно обратиться только к текущему?
А если надо например сравнить координаты нескольких обьектов на карте?

Добавлено через 27 минут
Если работать только с текущим обьектом, то получается примерно так
Код AS3:

                function mouseMOVE (event:MouseEvent):void {
                        if (event.target.x0) {event.target.x = 0;}
                        if (event.target.y0) {event.target.y = 0;}

Но остается вопрос как сверять другие координаты,
например, чтобы обьект нельзя было вытащить за пределы контейнера. МАПа точнее

Wolsh 25.09.2012 22:02

"Функция не знает" потому что переменная mapObject объявлена в другой функции — в конструкторе.
Если объявить mapObject как член класса (private var mapObject:Sprite) а не как локальную переменную конструктора, она будет видна для всех других членов класса, включая методы-обработчики. Если объектов много, можно нашпиговать ими массив и сделать его членом класса.

fduch 25.09.2012 22:04

глобальную переменную то я сделал, я думал, есть какойто более грамотный способ спс.

Wolsh 25.09.2012 22:07

Метод startDrag вообще-то принимает параметры, в том числе прямоугольник, в котором разрешено таскать объект :)
Другое дело, что прямоугольник надо будет пересчитывать для объектов разного размера, чтобы отделить лимитные поля справа и снизу (иначе объект будет уходить своей нижней границей ниже границы карты — прямоугольник определяет область, в которой может находиться точка (0, 0) таскаемого объекта).

fduch 25.09.2012 22:40

да, я в курсе.
Тока вот тут проблема возникла, если обьявить обе переменные глобальные, то mapImage.x и y всегда равны 0, даже когда обьект двигаешь, а вот координаты mapObject имеют нормальное значение(в пределах mapImage)
как мне узнать координаты mapImage?

Wolsh 25.09.2012 22:47

mapImage находится в контейнере, и относительно него никуда не смещается. Мы двигаем контейнер, в котором лежит mapImage и объекты. Координаты этого контейнера Вас и должны интересовать, а не картинки))

Добавлено через 6 минут
Цитата:

я думал, есть какойто более грамотный способ
Конечно есть — писать код в классах, а не в кадрах. Для объектов карты конечно же надо создать специальный класс MapItem extends Sprite. Создавать его экземпляры, передавая в конструктор картинку объекта (битмап) и какой-то идентификатор, чтобы всегда можно было узнать, что это за объект собственно, какую сущность он представляет. А далее можно еще создавать отдельные подклассы MapItem, например class Home extends MapItem, добавляя им уникальные только для них методы и свойства.


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

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