Форум 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)
-   -   обращение к мувику, созданному в цикле (http://www.flasher.ru/forum/showthread.php?t=102404)

Warrgoth 14.10.2007 20:41

обращение к мувику, созданному в цикле
 
Допустим, нарисовал я мувик кнопки и поместил в библиотеку.
Потом делаю функцию, которая аттачит в цикле этот мувик и получаю столбик с пятью кнопками.
Параллельно в цикле пишу trace(mc._name);
Получаю ряд названий. Все нормально.

После исполнения цикла хочу обратится допустим к четвертой кнопке .. и получаю undefined.

Как решить эту проблему?
Возможно ли обратится к клипу и как это лучше сделать? :umnik2:

screamge 14.10.2007 20:48

Так как клип аттачится на сцену то ес-но можнополучить доступ к нему, зависит всё от того как вы аттачите и как обращаетесь.

Ostgur 14.10.2007 21:16

обращаться через переменную, которая должна быть равна аттачиваему элементу

CorC 15.10.2007 10:11

Создавать в том же цикле массив ссылок на клипы, или использовать имена для клипов типа "buttonN"+i

Мечтатель 23.08.2008 12:03

Вот код:
Код:

import mx.transitions.Tween;
import mx.transitions.easing.*;
var count:Number = 3;
for (var i:Number=0; i<count; i++){
var temp1:MovieClip=this.createEmptyMovieClip("ablock"+i,i);
temp1.lineStyle(2,0xFFFFFF,100);
temp1.moveTo(20,20);
temp1.lineTo(60,20);
temp1.lineTo(60,60);
temp1.lineTo(20,60);
temp1.lineTo(20,20);
temp1._x=+80*i;

var temp2:MovieClip = temp1.createEmptyMovieClip("bblock"+i,i);
temp2.beginFill(0xFF0000,100);
temp2.moveTo(22,22);
temp2.lineTo(58,22);
temp2.lineTo(58,58);
temp2.lineTo(22,58);
temp2.lineTo(22,22);
temp2.endFill();
temp2._alpha=0;

temp2.onRollOver=function(){
var light:Tween= new Tween(temp2, "_alpha", Regular.easeIn, 0,50, 10, false);
}
}

Вот вопрос:
Не могу собразить, как синтаксически правильно обратиться к имени динамически созданного MovieClip.

Здесь:
Код:

var light:Tween= new Tween(temp2, "_alpha", Regular.easeIn, 0,50, 10, false);
как я понимаю, я обращаюсь к временной переменной созданного мувиклипа, которая по окончании цикла примет значение "3", поэтому при наведении на любой из квадратов, заливка стартует в последнем. А как обратится к имени "мувика" в конкретной итерации цикла?

Заранее, благодарю за дельные подсказки.

Obi 23.08.2008 13:46

Код:

var mcArray:Array = new Array();
var count:Number = 3;

for (var i:Number=0; i<count; i++){
  var temp1:MovieClip=this.createEmptyMovieClip("ablock"+i,i);
  temp1._x=+80*i;
  mcArray.push(temp1);
}

в mcArray будут ссылки на созданные динамически объекты.

Мечтатель 23.08.2008 14:54

Obi, спасибо за ответ! Но не могли бы Вы расстолковать мне вот еще что:

Следуя Вашему методу, создаю массив:
Код:

var act:Array = new Array();
var count:Number = 3;

Далее идет цикл:
Код:

for (var i:Number=0; i<count; i++){
var temp1:MovieClip=this.createEmptyMovieClip("ablock"+i,i);
temp1.lineStyle(2,0xFFFFFF,100);
temp1.moveTo(20,20);
temp1.lineTo(60,20);
temp1.lineTo(60,60);
temp1.lineTo(20,60);
temp1.lineTo(20,20);
temp1._x=+80*i;

var temp2:MovieClip = temp1.createEmptyMovieClip("bblock"+i,i);
temp2.beginFill(0xFF0000,100);
temp2.moveTo(22,22);
temp2.lineTo(58,22);
temp2.lineTo(58,58);
temp2.lineTo(22,58);
temp2.lineTo(22,22);
temp2.endFill();
temp2._alpha=0;
act.push(temp2);

//Методом push вставляем элементы в массив (в моем случае ссылки на Movie
//Clips), теперь act cодержит пути к мувиклипам:
//_level0.ablock0.bblock0,_level0.ablock1.bblock1,_level0.ablock2.bblock2
 
//Теперь, если вручную прописать:
_level0.ablock0.bblock0.onRollOver=function(){
var light:Tween= new Tween(_level0.ablock0.bblock0, "_alpha", Regular.easeIn, 0,50, 10, false);}
_level0.ablock1.bblock1.onRollOver=function(){
var light:Tween= new Tween(_level0.ablock1.bblock1, "_alpha", Regular.easeIn, 0,50, 10, false);}
_level0.ablock2.bblock2.onRollOver=function(){
var light:Tween= new Tween(_level0.ablock2.bblock2, "_alpha", Regular.easeIn, 0,50, 10, false);}
}

то работает как надо: при наведении на первый квадрат - заливка стартует в первом, при наведении на второй - во втором и т.д.
А как же всетаки циклично это сделать? Как извлечь путь из массива

и вставить сюда:
Код:

ПУТЬ ИЗ МАССИВА.onRollOver=function(){
var light:Tween= new Tween(ПУТЬ ИЗ МАССИВА, "_alpha", Regular.easeIn, 0,50, 10, false);}

Возможно - это элементарно и просто, но, очень прошу помочь.

Obi 23.08.2008 15:08

Вообще, ни разу со встроенным твинером не работал, но предполагаю, что так должно работать:
Код:

for(var i:Number = 0; i < array.length; i++) {
  array[i].onRollOver = function() {
      new Tween(this, "_alpha", Regular.easeIn, 0,50, 10, false);
  }
}


Мечтатель 23.08.2008 15:49

Огромное спасибо, Obi! Все работает как НАДО! Полностью рабочий код ниже, можете проверить. )) Может и кому еще пригодится.

Код:

//1. Импортируем классы Tween и Easing
import mx.transitions.Tween;
import mx.transitions.easing.*;

//2. Создаем массив для хранения путей к динамически созданным Movie Clip'ам
var act:Array = new Array();

//3.Создаем переменную, которая, например хранит количество рядов, которое вернула БД MySQL при запросе.
var count:Number = 3;

//4.Запускаем серию циклов.
for (var i:Number=0; i<count; i++)// Создаем переменную i, устанавливаем ее
//значение равной нулю. Далее задаем условие выражения, которое у нас будет
//проверяться перед началом каждой итерации в цикле.
{
var temp1:MovieClip=this.createEmptyMovieClip("ablock"+i,i);//динамически
//создаем "мувик", который записываем во временную переменную temp1
temp1.lineStyle(2,0xFFFFFF,100);//параметры линии
temp1.moveTo(20,20);//начальное положение пера (х,у)
temp1.lineTo(60,20);// рисуем прямые
temp1.lineTo(60,60);
temp1.lineTo(20,60);
temp1.lineTo(20,20);
temp1._x=+80*i;//

var temp2:MovieClip = temp1.createEmptyMovieClip("bblock"+i,i);//динамически
//создаем "мувик", который записываем во временную переменную temp2
temp2.beginFill(0xFF0000,100);//создаем заливку красного цвета (цвет,
//прозрачность)
temp2.moveTo(22,22);
temp2.lineTo(58,22);
temp2.lineTo(58,58);
temp2.lineTo(22,58);
temp2.lineTo(22,22);
temp2.endFill();
temp2._alpha=0;
act.push(temp2);// push добавляет пути к Movie Clip'ам  в конец массива.

act[i].onRollOver=function(){
var light:Tween= new Tween(this, "_alpha", Regular.easeIn, 0,50, 10, false);}
}


NoCD 23.08.2008 20:12

Когда очень много кнопок, то можно использовать такой код:
---
Код:

button_index=5 // количество будущих кнопок
for(i=0;i< button_index;i++) //создаем цикл с индексом «i»
{    attachMovie("button","button_onPress"+i,i)//Создаем мувиклипы
//button_onPress" c индексом i

  _root["button_onPress"+i]._x=100 // координаты по оси X
    _root["button_onPress"+i]._y=50*i+100// координаты по оси Y
}

_root.onMouseDown = function() { // используем обработчик событий для левой кнопки
 
for(j=0;j< button_index;j++)// создаем цикл с индексом j, что бы пробежать по всем созданным мувиклипам
{
if(_root["button_onPress"+j].hitTest(_xmouse,_ymouse)) { //проверяем расположение курсора мышки при нажатии
    trace("Hello World") //с помощью trace видем «Hello World»
    trace("Кнопка номер "+j) //с помощью trace видем порядковый номер кнопки
}}}

---
немного модернизируем:
добавим в начало кода:
---
Код:

      mas=new Array() //Создаем массив «mas»
      mas=[«Петя»,10,01,«Bася»,«Hello»] // заполняем массив пятью текстовыми и цифровыми значениями

в обработчике кнопки добавим:
trace(«Содержание массива с индексом "+j+» = "+mas[j])

---
Теперь каждая кнопка по своему индексу будет обращаться к массиву «mas»


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

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