Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Алгоритмы] Синхронизация движения объектов (http://www.flasher.ru/forum/showthread.php?t=208693)

PsychoTech 15.08.2014 18:23

Синхронизация движения объектов
 
Доброго времени суток коллеги-форумчане.
Прошу вашей помощи ибо сам уже запутался.
Вопрос в следующем: я описываю класс в котором есть визуальные элементы и в этом же классе описываю событие клика, по которому каждый экземпляр должен начать двигаться в ту или иную сторону зависимости от положения. Проблема возникла в следующем. Как заставить все экземпляры класса двигаться одновременно при щелчке на одном из них. Экземпляры естественно создаются в другом классе, причем динамически с помощью массива.
в общем такая беда. Третий день бьюсь.
в первом варианте я синхронизировал через событие onFrame где слушал булеву каждого экземпляра и приравнивал если появлялась положительная все двигалось а теперь почему-то перестало.
Пока без кода ибо лень в данный момент копипастить. но если надо. добавлю. мне кажется я упускаю какую-то маленькую деталь.

Rivexe 15.08.2014 19:11

Возможно у вас неудобная архитектура проекта. Как у вас происходит навешивание клика - в цикле на каждый объект или на весь контейнер с объектами?

PsychoTech 15.08.2014 19:31

нет клик навешивается в основном классе где описывается весь класс, который уже вызывается в родителе. Получается что класс описывает все что должен делать каждый экземпляр. Проще говоря поведение описано в классе и экземпляр слушается как должен, но только 1 тот на котором щелкнули а остальные не реагируют. Вот мне нужно чтобы все отзывались дружно. Толкнул одного остальные тоже подвинулись. Раньше это было двигались, но не останавливались. Когда я исправил и сделал остановку другие почему-то перестали синхронизироваться. Я добавил пару переменных, и их тоже в синхрон передал. такое впечатление что они тупо перестали слушаться булевы движения.
То есть в классе есть булева переменная которая ложна по умолчанию. В синхроне как только появляется правда все остальные экземпляры тоже получают правду и по идеи должны начать движение. сейчас приведу код синхронизации

Код AS3:

if (arr_icon[controlRoll].Moving) {
 
                                arr_icon[0].Moving = arr_icon[controlRoll].Moving;
                                arr_icon[1].Moving = arr_icon[controlRoll].Moving;
                                arr_icon[2].Moving = arr_icon[controlRoll].Moving;
                                arr_icon[3].Moving = arr_icon[controlRoll].Moving;
                                arr_icon[4].Moving = arr_icon[controlRoll].Moving;
                                arr_icon[0].LRDirect = arr_icon[controlRoll].LRDirect;
                                arr_icon[1].LRDirect = arr_icon[controlRoll].LRDirect;
                                arr_icon[2].LRDirect = arr_icon[controlRoll].LRDirect;
                                arr_icon[3].LRDirect = arr_icon[controlRoll].LRDirect;
                                arr_icon[4].LRDirect = arr_icon[controlRoll].LRDirect;
                                arr_icon[0].anglerot = arr_icon[controlRoll].anglerot;
                                arr_icon[1].anglerot = arr_icon[controlRoll].anglerot;
                                arr_icon[2].anglerot = arr_icon[controlRoll].anglerot;
                                arr_icon[3].anglerot = arr_icon[controlRoll].anglerot;
                                arr_icon[4].anglerot = arr_icon[controlRoll].anglerot;
 
                        }else {
                                arr_icon[0].Moving = false;
                                arr_icon[1].Moving = false;
                                arr_icon[2].Moving = false;
                                arr_icon[3].Moving = false;
                                arr_icon[4].Moving = false;
                        }

arr_icon - как наверно догадались - массив в котором все экземпляры храняться
Moving - булева переменная двигаться или нет
LRDirect - переменная цифровая отвечающая за направление движения
anglerot - это угол проще говоря расстояние на которое они должны сместиться.
вот в общем anglerot добавил чтобы они не двигались бесконечно и соответствено передаю его остальным ибо он определяется в том экземпляре на котором кликнули. Еще раз повторюсь без последней модификации все двигалось просто была ошибка для устранения которой добавил переменную.

Gerbert 15.08.2014 19:41

Это не синхронизация, это ...изм! Переделайте все это в циклы для начала и объясните, как у Вас двигаются объекты, одинаково или нет.

Rivexe 15.08.2014 19:42

ну если в основном, тогда при срабатывание события, просто пробегайтесь по массиву объектов и присваивайте нужному параметру нужное значение

PsychoTech 15.08.2014 19:58

Цитата:

Это не синхронизация, это ...изм! Переделайте все это в циклы для начала и объясните, как у Вас двигаются объекты, одинаково или нет.
Причем здесь изм? О_о. На счет циклов я как-то не очень ровно дышу к циклам в ENTER_FRAME а именно там весь этот код находиться и ничего больше. Прдеметы двигаются одинаково ибо они лишь экземпляры одного и того же класса.

Цитата:

ну если в основном, тогда при срабатывание события, просто пробегайтесь по массиву объектов и присваивайте нужному параметру нужное значение
Это как я чет не понял? Я вроде здесь и пробегаюсь. Клик описан как говорилось раньше в другом классе. Клик всего лишь задает переменную двигаться в правду и задает угол смещения от положения обьекта по которому ткнули.

Вся идея в том чтобы обьект после клика встал на место так называемого первого обькта. и соответственно остальные тоже должны "подвинуться"

Zebestov 15.08.2014 20:18

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

Rivexe 15.08.2014 20:18

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

caseyryan 15.08.2014 20:34

Цитата:

На счет циклов я как-то не очень ровно дышу к циклам в ENTER_FRAME
А зря.
Ваш код можно минимизировать до такого:
Код AS3:

if (arr_icon[controlRoll].Moving) {
        for (var i:String in arr_icon) {
                if (arr_icon[i] == arr_icon[controlRoll]) continue;
                arr_icon[i].Moving = arr_icon[controlRoll].Moving;
                arr_icon[i].LRDirect = arr_icon[controlRoll].LRDirect;
                arr_icon[i].anglerot = arr_icon[controlRoll].anglerot;
        }
 
} else {
        for (i in arr_icon) {
                arr_icon[i].Moving = false;
        }
}


PsychoTech 15.08.2014 20:49

Цитата:

А зря.
Ваш код можно минимизировать до такого:
Код AS3:

Код AS3:

if (arr_icon[controlRoll].Moving) {
        for (var i:String in arr_icon) {
                if (arr_icon[i] == arr_icon[controlRoll]) continue;
                arr_icon[i].Moving = arr_icon[controlRoll].Moving;
                arr_icon[i].LRDirect = arr_icon[controlRoll].LRDirect;
                arr_icon[i].anglerot = arr_icon[controlRoll].anglerot;
        }
 
} else {
        for (i in arr_icon) {
                arr_icon[i].Moving = false;
        }
}


да я в принципе так и собирался сделать просто в процессе это нагляднее. и поскольку опыта не так много такой код не понизит FPS?

Цитата:

Каждый экземпляр класса мог бы предоставлять публичный метод, который инициирует начало движения. Тогда остается лишь дождаться клика, определить, что это именно тот клик, который нам нужен (какие там критерии у тебя) и сказать родителю-собирателю, чтобы сказал своим, что таки надо двигать. И уже этот класс-контейнер пробегается в цикле по всем экземплярам и вызывает у них метод типа chegoStoimKogoZhdem(kudaBezhatX, kudaBezhatY). Как-то так.
Так изначально и делал а потом столкнулся с проблемой как определить на ком щелкнули, потому что e.target.... и так далее не дала результата. а как реализовать видимо тямы не хватает. поэтому собственно и сделал описание класса в котором есть публичная булева разрешающая и запрещающая движение. А собственно ваш публичный метод "когождем" описан в ENTER_FRAME и как только переменная движения становиться TRUE движение начинается до тех пор пока обработка движения не поставит FALSE. Де факто получается следующее: Всем экземплярам сообщается:
пройти по описанию 1 метр расстояния;
пройти влево\вправо;
можно идти;


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

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