PDA

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


Kasap
06.03.2009, 01:47
Привет всем.

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

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

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
// этот тоже
var listener:Object = {};
listener.onPress = function():Void {
trace(1);
}
mc.addListener(listener);
Это в вашем контексте точно не будет работать.
А это работает.
mc.onPress = function():Void {
trace(1);
}
Вообще, код рабочий. Проверьте вызовы, объекты, где-то у вас засел жучок.

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

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

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

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

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

Котяра
07.03.2009, 01:21
Лично я решал эту проблему через hitTest. Кстати, любопытно, есть ли какой-то другой способ?
Есть. это основной головной геморой для АС2, успешно решенный с приходом АС3, нормальных эвентов и баблинга.
Для АС2 есть только костыли и чОткое планирование классов и экземляров.

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

Котяра
07.03.2009, 02:24
Неохота переписывать все на AS3, к изучению которого я еще не приступал. Я тут еще обнаружил, что событие onMouseMove работает глобально и не может быть назначено для конкретного мувика. Вообщем, укладываюсь спать удрученным.
Попробую повозиться с hitTest (спасибо Stargazer). Если не выйдет, буду мурыжить AS3.
Всем спасибо.
Мне бы твои проблемы. .. неохота видите-ли )
Я хотел, и добился у начальства разрешения переписать 15 000 строчек на as1 в классы as2 (22 000) а затем в as3 (..пока неизвестно.)
Уломать себя я думаю проще.