2013-07-06 3 views
0

Непонятное название, мое плохое.AS3 Использование многих слушателей событий, вызывающих проблемы, как уменьшить?

В принципе, у меня есть список имен. Пройдя через, я добавляю MovieClip, задаю ему 2 свойства, имя и идентификатор. MovieClip одновременно работает как кнопка, и я добавляю 4 прослушивателя, мышь вверх, вниз или вниз. Я делаю это с каждым именем. Функция, каждая из которых установлена, одинакова.

EX: enemyButton [i] .addEventListener (MouseEvent.MOUSE_UP, mouseUpHandler);

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

Я сузил проблему до того, что ее вызвали слушатели.

Функция так просто, как:

EX: Функция mouseUpHandler (е: MouseEvent): пустота {enemySelected (e.target.enemyID); }

Мой вопрос: слишком много слушателей может быть проблемой? и как я могу их уменьшить?

Вот отрывок из цикла:

var C:Class = Class(getDefinitionByName(enemies[i])); 
var c:* = new C(); 
c.gotoAndStop(1); 
enemyButton[i].enemyID = i; 
c.name = "select" + i; 
c.enemyID = i; 
trace(c.enemyID); 
enemyButton[i].addChild(c); 
enemyScroll.addChild(enemyButton[i]); 
enemyButton[i].enemyName.text = info[i][Const.NAME]; 
enemyButton[i].setChildIndex(enemyButton[i].getChildByName("enemyName"), enemyButton[i].numChildren-1); 

Спасибо.

+0

Можете ли вы опубликовать код цикла? Сколько объектов вы добавляете? Не должно быть проблем с количеством слушателей. – takteek

+0

Нет, кажется, ошибка, которую вы получаете, заключается в том, что вы обращаетесь к enemyButton [X], когда итерация ... с использованием объекта [X] ссылается на свойство на этом объекте, а одно из них недействительно для присоединения слушателя к. Однако, поскольку вы не размещали код и не сообщали точное сообщение об ошибке, это чистая спекуляция и может быть совершенно неправильным советом. –

+0

Это определенно странная проблема. Вчера вечером попробовал, может быть, 15 раз, чтобы получить ошибку, и не мог. Первая попытка сегодня, ошибка возникла. ReferenceError: Ошибка # 1069: Идентификатор свойства свойства не найден на flash.text.TextField, и значение по умолчанию отсутствует. \t в WarmingInDanger_fla :: MainTimeline/mouseUpHandler() –

ответ

0

Если enemyButton - это MovieClip (возможно, созданный с помощью attachMovie) и не сильно типизирован как класс EnemyButton, тогда свойство ID становится динамическим. В этой ситуации, если ваш список имен содержит неправильные данные (возможно, поле ID отсутствует), тогда свойство ID останется неопределенным в некоторых экземплярах MovieClip.

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

Это не имеет никакого отношения к слушателям событий.

+0

Я думал, что вы можете добавить свойство к объекту (MovieClip), просто добавив его. Пример: MovieClip mcTest, mcTest.aVar = 0. Цикл добавляет .enemyID к каждой кнопке. Идентификаторы верны, как и массивы. Вся основная информация для массивов находится в первом кадре. При этом он не подводит и не перезагружает что-либо. Когда я нажимаю кнопку, время от времени она показывает, что ошибка иногда 3 в строке, но если я нажму на нее снова, она будет работать нормально. Обычно проблема возникает только тогда, когда я намеренно перехожу к кадру, содержащему кнопки, и щелкаю его как можно быстрее. –

+0

Я понял, что здесь происходит не так. Я еще не думал о исправлении (что должно быть довольно просто.) Проблема была вызвана тем, где я нажал кнопку. Так как враг MovieClip был добавлен в кнопку «окно», целью прослушивателей событий будет либо поле, либо графическое изображение врагов. Я добавил идентификатор к обоим, так что он работал большую часть времени, но некоторые пятна были опущены. Так что, в основном, мне просто нужно выяснить, какая кнопка нажата в общем, не оставляя на ней «мертвую зону». Спасибо. –

0

Итак, вы просто хотите создать кучу кнопок с уникальными свойствами и знать, какая кнопка была нажата последним. В общем, очень плохой идеей реализовать кнопку кнопки за пределами объекта кнопки. Зачем? Потому что вы работаете с объектно-ориентированным языком. Хорошая новость заключается в том, что вы работаете с as3 и он рассматривает функцию как объекты, так что вы можете назначить функцию вар, как это:

var callback:Function = function(name:String, enemyId:int){ /*do something*/ } 

И .. вы можете передать функцию в качестве параметра другой функции

function setCalback(func:Function){} 

button.setCallback(callback); 

Итак, вам действительно нужно создать свой собственный класс кнопок, добавить в него слушателей, добавить обработчики (статические обработчики уменьшат использование памяти) и передать ему функцию обратного вызова, которая будет вызываться, когда пользователь нажимает кнопку.

0

Не стоит спамить, но это было легко исправлено, хотя ответы, возможно, были лучшим методом.

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

Итак, решена.

Спасибо за помощь.

Смежные вопросы