Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Сопоставление двух массивов
Flash Zone Forum > Macromedia Flash > Начинающим
Pi-Tech
Сидел скрипел мозгами, но не могу допехать, понимаю что решение наверняка плевое но не пойму как.
Код такой :
function drag() {
this.startDrag();
}
function drog() {
this.stopDrag();
}
var Arr:Array = [A1, A2];
var Brr:Array = [A1B, A2B];
for (i=0; i<Arr.length; i++) {
mc_mc = Arr[i];
mc_mc.onPress = drag;
mc_mc.onRelease = drog;
}
for (i=0; i<Brr.length; i++) {
bc_mc = Brr[i];
bc_mc.onPress = drag;
bc_mc.onRelease = drog;
}
_root.onEnterFrame = function() {
if (mc_mc.hitTest(bc_mc)) {
gotoAndStop(2);
}
};
Надо что бы как только координаты (или hitTest) клипов из массива Аrr равнялись координатам Brr происходило действие в частности gotoAndStop, у меня получаеться действие только когда последняя пара клипов сравнивается.
Просто клипов должно быть много и поэтому вручную условие для каждой пары прописывать муторно и глупо.
Заранее спасибо.
Pi-Tech
Блин ну кто нибудь помогите, возлагал на флешзону надежды, просто нигде не могу найти просто так не спрашивал бы.
Flashery
Проблема естественно плевая )))и смешная ---- не drog a drop )))

Код видать не сам писал ))

В остально помоч не могу АС плохо знаю ))))
Pi-Tech
Цитата(Flashery @ 30.11.2007 - 22:38) *
Проблема естественно плевая )))и смешная ---- не drog a drop )))

Код видать не сам писал ))

В остально помоч не могу АС плохо знаю ))))

Код писал сам а функцию хоть "хер" назови разницы никакой.
Тут загвоздка в том что я не пойму почему код нействует на последней паре массивов в частности A2 и A2B.
nikitar
Прикрепи исходник в архиве, что-то я не могу понять что ты ждёшь в результате.
Pi-Tech
Да там ничего нет два клипа наводяться на другую пару клипов, в произвольном порядке и когда одна пара накладываеться на другую происходит действие, так вот это действие у меня просходит только когда я последний клип массива накладываю. (да и кстати как файл присоединить sad.gif )
Вот упрощенная ситуация :

var YYY:Array = [AAA, WWW];
for (i=0; i<YYY.length; i++) {
var mc:MovieClip = YYY[i];
Button_btn.onPress = function() {
mc._alpha = 20;
};
}
как сдедать что бы у всех элементов массива альфа=20, а не только у клипа WWW, я понимаю что цикл заканчиваеться на нем поэтому не получаеться но как это обойти не пойму.
nikitar
Вот так, чтобы при нажатии на кнопку у всех элементов стала прозрачность равна 20

Код
var YYY:Array = [AAA, WWW];
Button_btn.onPress = function() {
for (i=0; i<YYY.length; i++) {
var mc:MovieClip = YYY[i];
mc._alpha = 20;
};
}
Pi-Tech
Спасибо что откликнутся, но я наверное слишком все таки упростил, свою задачу laugh.gif , я кажеться понимаю в чем причина моей неудачи, но как решить еще не пойму.
//два массива с мови клип
var Arr:Array = [A1, A2];
var Brr:Array = [A1B, A2B];
//делаем клипы первого массива перетаскиваемыми
for (i=0; i<Arr.length; i++) {
var ma:MovieClip = Arr[i];
ma.onPress = function() {
this.startDrag();
};
ma.onRelease = function() {
stopDrag();
};}
а дальше х.з. я и делал цикл по второму массиву и туда и сюда надо найти замену такому выражению
_root.onEnterFrame = function() {
if (A1.hitTest(A1B)&& A2.hitTest(A2B)) {
gotoAndStop(2);

я конечно могу посидеть часок и набить грубо говоря штук двести этих "ЕСЛИ" (клипов в массивах много), но согласись это не рационально.
tiHo
_root.onEnterFrame = function() {
if (Arr[i].hitTest(Brr[i]) && Arr[i+1].hitTest(Brr[i+1]) ) {
gotoAndStop(2);

}

может так прокатит
Pi-Tech
Нет не прокатило.
Сделал третий массив где свожу данные из этих двух, с командой trace() выводит вроде все правильно, а на деле ничего. sad.gif
nikitar
В общем, ошибка оказалась простой и незатейлевой.
Ты неправильно обращаешься к мувиклипам.
Вот я сделал код, который работает.


Код
var a:Array=new Array("mc1","mc3")
var b:Array=new Array("mc2","mc4")
for(i=0; i<a.length; i++){
    mc=a[i]
    this[mc].onPress=function(){
        this.startDrag();
    }
    this[mc].onRelease=function(){
        this.stopDrag();
    }
}

for(i=0; i<b.length; i++){
    mc=b[i]
    this[mc].onPress=function(){
        this.startDrag();
    }
    this[mc].onRelease=function(){
        this.stopDrag();
    }
}

this.onEnterFrame=function(){
    for(ab=0; ab<a.length; ab++){
        for(bb=0; bb<b.length; bb++){
            if(this[a[ab]].hitTest(this[b[bb]])){
            trace(a[ab]+"|"+b[bb]);
            }        
        }
    }
}
MustLive
Pi-Tech

В твоём случае имеются ошибки (логические) в коде, что приводит к его некорректной работе. А ты удивляешься, почему он так работает - алгоритм работает в точности, как ты его задал (указал перебор массивов вне onEnterFrame). Причём алгоритм изначально нерабочий, его нужно переделывать - как указать перебор массивов внутри onEnterFrame, так и правильно обращаться к массивам.

Цитата
у меня получаеться действие только когда последняя пара клипов сравниваетс

Ты указал перебор массивов в кадре, вне функции onEnterFrame, поэтому будут сравниваться только последние. Т.е. алгоритм работает как ты его и записал. Поэтому код нужно переделать. Посмотри на рабочий код, который nikitar привёл тебе сегодня.

Цитата
В общем, ошибка оказалась простой и незатейлевой.
Ты неправильно обращаешься к мувиклипам.

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

Две другие логические ошибки (в изначальном коде Pi-Tech) - это запись перебора массивов вне onEnterFrame, и некорректные условие сравнения. Которые ты, nikitar, исправил в своём коде. Лишь замечу, что ты явно ленишься использовать точки с запятой - у тебя то стоят ";", то нет - непостоянный стиль. Независимо от того, что флеш допускает не ставить точки с запятой, если уж ты их используешь, то используй их во всём коде wink.gif (т.е. используй один стиль написания).

Цитата
как сдедать что бы у всех элементов массива альфа=20

В массиве задай параметр прозрачности всем элементам.

Для массивов a и b код будет следующим (с учётом обработчиков onPress и onRelease):
Код
for (i=0; i<a.length; i++){
    mc=a[i];
    mc._alpha=20;
    this[mc].onPress=function(){
        this.startDrag();
    }
    this[mc].onRelease=function(){
        this.stopDrag();
    }
}

for (i=0; i<b.length; i++){
    mc=b[i];
    mc._alpha=20;
    this[mc].onPress=function(){
        this.startDrag();
    }
    this[mc].onRelease=function(){
        this.stopDrag();
    }
}
Pi-Tech
Спасибо за подсказку, буду сегодня сидеть работать над ошибками.
Насчет кавычек в массиве думал что это относиться только к текстовым данным ан нет, спасибо за науку.

P.S.Насчет цикла в цикла по массивам была у меня идея но я неправильное её реализовал, перетаскивание накрылось и я от нее отказался видать зря но в коде nikitara происходит действие когда любой из клипов одной пары накладываеться на другой а мне надо когда все наложены на свою пару из другого массива, но все равно спасибо, я это дело в другом месте применю.


Все мозг отказал, здаюся, не пойму. wacko.gif
nikitar
Цитата
P.S.Насчет цикла в цикла по массивам была у меня идея но я неправильное её реализовал, перетаскивание накрылось и я от нее отказался видать зря но в коде nikitara происходит действие когда любой из клипов одной пары накладываеться на другой а мне надо когда все наложены на свою пару из другого массива, но все равно спасибо, я это дело в другом месте применю.

Тогда тебе нужно дополнительно проверять совпадают ли НОМЕРА элементов в массивах.
Pi-Tech
Думал утро вечера мудренее, ошибался. Как же их проверить не перечисляя, не допру. Не хватает либо опыта либо мозгов (хочеться верить первого smile.gif )
Rohan
Создаем значицо класс. АктивИтем или как-то так. Каждому эгземплярчегу это класса задаем его таргет. Т.е., мувиклип какой-нить. После чего на маусапе проверяем волшебную пропертю _droptarget. Ламерство, канешна, но чтобы мозг не и*ать сойдет. Если этот самый дроптаргет - это таргет для данного эгземпляра - значит вуаля, все кул, попали куда надо. Иначе все не кул. Да, и ишо дроптаргет - это строчка, а не указатель на мувыг. Отак от. Когда-то делал мегоквиз со всякими мегодрагдропами, есть исходники, но заказчег в голову даст если че.
MustLive
Цитата
Думал утро вечера мудренее, ошибался. Как же их проверить не перечисляя, не допру.

Pi-Tech, не переживай, алгоритм там несложный, сейчас приведу пример wink.gif.

Цитата
Тогда тебе нужно дополнительно проверять совпадают ли НОМЕРА элементов в массивах.

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

Цитата
но в коде nikitara происходит действие когда любой из клипов одной пары накладываеться на другой а мне надо когда все наложены на свою пару из другого массива

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

В данном случае при связях 1-1 у тебя получаются два массива равной длины (одинаковое количество мувиков в массивах). Поэтому ты расположи связанные пары элементов на одинаковых местах в своих массивах (т.е. a[0] связан с b[0] и т.д.). Тогда алгоритм будет следующий:
Код
this.onEnterFrame=function(){
    for(i=0; i<a.length; i++){
        if(this[a[i]].hitTest(this[b[i]])){
            trace(a[i]+"|"+b[i]);
        }        
    }
}

Исходя из того, что массивы с мувиками имеют равную длину, то установку обработчиков можно указать в одном цикле:
Код
for (i=0; i<a.length; i++){
    mc=a[i];
    mc._alpha=20;
    this[mc].onPress=function(){
        this.startDrag();
    }
    this[mc].onRelease=function(){
        this.stopDrag();
    }
    mc=b[i];
    mc._alpha=20;
    this[mc].onPress=function(){
        this.startDrag();
    }
    this[mc].onRelease=function(){
        this.stopDrag();
    }
}

Цитата
Создаем значицо класс.

Использование ООП подхода для данной задачи - оптимальный вариант. Чтобы не внешняя процедура проверяла совпадение всех пар элементов, а чтобы проверка пересечения была инкапсулирована в каждый экземпляр класса. Но для начала процедурного подхода для Pi-Tech хватит, главное чтобы использовать оптимизированный алгоритм (который я привёл сегодня).
Pi-Tech
Большое спасибо всем за то что уделили внимание моей проблеме biggrin.gif. но наверное я плохо объяснил чего хочу добиться. Задача казалась не сложной, хотел для ребенка сделать пазлы что бы он их пораскладывал и поэтому искал решения сокращения такого кода
_root.onEnterFrame = function() {
if (A1._x == A1B._x && A2._x == A2B._x && A3._x == A3B._x&&
A4._x==A4B._x && A5._x==A5B._x && A6._x==A6B._x&&
A7._x==A7B._x && A8._x==A8B._x && A9._x==A9B._x &&
A10._x==A10B._x && A11._x==A11B._x && A12._x==A12B._x ) {
gotoAndStop(2);
}
};
}
//т.е. когда все элементы встают на место происходит переход на кадр 2
Но еще раз спасибо многое почерпнул из ваших примеров, по книжкам конечно хорошо, но с людьми лучше laugh.gif

Пойду почитаю, как там эти классы создаються.))))
nikitar
Код
this.onEnterFrame=function(){
    for(ab=0; ab<a.length; ab++){
        for(bb=0; bb<b.length; bb++){
            if(this[a[ab]].hitTest(this[b[bb]])){
                if(ab==bb){
                    trace("Правильно!")
                }
            }        
        }
    }
}


Если элемент на правильном элементе то выскакивает Правильно!.

Добавилось всего 1 условие.

Цитата
хотел для ребенка сделать пазлы что бы он их пораскладывал

С этого надо было начинать.
Pi-Tech
nikitar ты спишь вообще или как в фильме "спал на прошлой неделе")))). Спасибо тебе за помощь, но заметь у тебя происходит действие когда один клип из массива "а" наводиться на клип массива "b" т.е. один элемент встал на место и просиходит переход, а не когда все клипы на своих парах, я похожее делал но только добавлял дополнительное условие в первое if.
nikitar
Предыдущий мой код замени на этот и ПОСМОТРИ в чём отличие. Я думал, что ты на основе моего предыдущего кода догадаешься как посчитать количество совпадений, и если количество совпадений будет равно количеству элементов, следовательно надо осуществлять переход. Но ты не догадался, поэтому вот тебе код.

Код
this.onEnterFrame=function(){
    sovpali=0
    for(ab=0; ab<a.length; ab++){
        for(bb=0; bb<b.length; bb++){
            if(this[a[ab]].hitTest(this[b[bb]])){
                if(ab==bb){
                    sovpali++
                }
            }        
        }
    }
    if(sovpali==a.length){
        trace("все квадратики совпали")
    }
}
Pi-Tech
Насчет второго if была у меня попытка, но на такое решение каюсь не хватило меня. sad.gif , БОЛЬШОЕ спасибо за помощь.
Привет культурной столице России.
nikitar
Цитата
БОЛЬШОЕ спасибо за помощь.

Пожалуйста

Цитата
Привет культурной столице России.

Тебе тоже

PS. Становлюсь как MustLive. Отвечаю на каждую строчку smile.gif
Русская версия IP.Board © 2001-2008 IPS, Inc.