Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Событие onPress и динамический клип (http://www.flasher.ru/forum/showthread.php?t=122265)

Kasap 06.03.2009 01:47

Событие onPress и динамический клип
 
Привет всем.

Есть скрипт, который после второго клика пользователя по мувику "field" рисует стрелку по двум координатам. После создания пытаюсь определить стрелке событие onPress, но ничего не получается. Подскажите, как можно отследить это событие.

Actions для клипа "field":

Код AS1/AS2:

on (press) {
        // рисование стрелки
        function Arrow(objName:String, x1:Number, y1:Number, x2:Number, y2:Number, color, alpha) {
                if(color == undefined) color = 0x000000;
                if(alpha == undefined) alpha = 100;
 
                var mc:MovieClip = _root.field.createEmptyMovieClip( objName, _root.field.getNextHighestDepth());
 
                mc.lineStyle(2, 0, 100);
                mc.moveTo(x1, y1);
                mc.lineTo(x2, y2);
 
                // рисуем стрелку на конце линии
                var arrow:MovieClip = mc.attachMovie( "arrowHead", "arrowHead", 0 );
 
                arrow._x = x2;
                arrow._y = y2;
                arrow._rotation = Math.atan2(y2 - y1, x2 - x1 ) * ( 180 / Math.PI );
 
                // пытаемся определить функцию для события клика по стрелке
                // этот вариант не работает
                mc.onPress = function():Void {
                        trace(1);
                }
 
                // этот тоже
                var listener:Object = {};
                listener.onPress = function():Void {
                        trace(1);
                }
                mc.addListener(listener);
 
                return mc;
        }
 
        /* Если включен режим рисования стрелок */
        if(_root.drawMode) {
                // первый клик
                if(_root.c.length == 0) {
                        // запоминаем координаты
                        _root.c[0] = [_root.field._xmouse, _root.field._ymouse];
                }
                // второй клик
                else if(_root.c.length == 1) {
                        // запоминаем координаты
                        _root.c[1] = [_root.field._xmouse, _root.field._ymouse];
 
                        // массив со стрелками
                        var ArrowName:String = "arrow" + _root.arrows.length;
                        _root.arrows.push(ArrowName);
 
                        // рисуем стрелку                       
                        _root.arrows[ArrowName] = Arrow(ArrowName, _root.c[0][0], _root.c[0][1], _root.c[1][0], _root.c[1][1]);
 
                        // очищаем координаты
                        _root.c = new Array();
 
                        // функция отключает режим рисования
                        _root.toogleDrawMode();
                }
        }
}
 
// _root.c - массив с координатами стрелки

Рисование стрелки работает на ура, а вот хочется еще добавить возможность ее редактирования. Заранее благодарю.

alexcon314 06.03.2009 09:13

Код AS1/AS2:

// этот тоже
var listener:Object = {};
listener.onPress = function():Void {
        trace(1);
}
mc.addListener(listener);

Это в вашем контексте точно не будет работать.
А это работает.
Код:

mc.onPress = function():Void {
        trace(1);
}

Вообще, код рабочий. Проверьте вызовы, объекты, где-то у вас засел жучок.

Kasap 06.03.2009 22:29

Вложений: 1
Я в тупике. Уже себе мозг вывихнул :)
Сам понимаю, что должно работать, но ошибки найти не могу. Дайте намёк, где и что искать. К посту прилагаю исходник.

Kasap 07.03.2009 00:15

В ходе изучения обнаружил вот какую вещь.
Стрелки рисуются на клипе field, у которого уже назначено событие onPress. Это событие перекрывает событие стрелки.

Stargazer 07.03.2009 01:15

Цитата:

Сообщение от Kasap (Сообщение 803632)
В ходе изучения обнаружил вот какую вещь.
Стрелки рисуются на клипе field, у которого уже назначено событие onPress. Это событие перекрывает событие стрелки.

Есть такое дело. Даже более того. Если родительскому клипу назначить любой из onPress, onRelease и подобных, то все вложенные в него клипы перестают реагировать вообще на все эти обработчики. То есть на практике у меня получилос, что не просто перекрывается какое-то одно событие, а родительский клип хватает все мышиные события на себя и ничего не оставляет вложенным клипам.

Лично я решал эту проблему через hitTest. Кстати, любопытно, есть ли какой-то другой способ?

Котяра 07.03.2009 01:21

Цитата:

Сообщение от Stargazer (Сообщение 803652)
Лично я решал эту проблему через hitTest. Кстати, любопытно, есть ли какой-то другой способ?

Есть. это основной головной геморой для АС2, успешно решенный с приходом АС3, нормальных эвентов и баблинга.
Для АС2 есть только костыли и чОткое планирование классов и экземляров.

Kasap 07.03.2009 01:35

Неохота переписывать все на AS3, к изучению которого я еще не приступал. Я тут еще обнаружил, что событие onMouseMove работает глобально и не может быть назначено для конкретного мувика. Вообщем, укладываюсь спать удрученным.
Попробую повозиться с hitTest (спасибо Stargazer). Если не выйдет, буду мурыжить AS3.
Всем спасибо.

Котяра 07.03.2009 02:24

Цитата:

Сообщение от Kasap (Сообщение 803658)
Неохота переписывать все на AS3, к изучению которого я еще не приступал. Я тут еще обнаружил, что событие onMouseMove работает глобально и не может быть назначено для конкретного мувика. Вообщем, укладываюсь спать удрученным.
Попробую повозиться с hitTest (спасибо Stargazer). Если не выйдет, буду мурыжить AS3.
Всем спасибо.

Мне бы твои проблемы. .. неохота видите-ли )
Я хотел, и добился у начальства разрешения переписать 15 000 строчек на as1 в классы as2 (22 000) а затем в as3 (..пока неизвестно.)
Уломать себя я думаю проще.


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

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