![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
|
Доброго времени суток коллеги-форумчане.
Прошу вашей помощи ибо сам уже запутался. Вопрос в следующем: я описываю класс в котором есть визуальные элементы и в этом же классе описываю событие клика, по которому каждый экземпляр должен начать двигаться в ту или иную сторону зависимости от положения. Проблема возникла в следующем. Как заставить все экземпляры класса двигаться одновременно при щелчке на одном из них. Экземпляры естественно создаются в другом классе, причем динамически с помощью массива. в общем такая беда. Третий день бьюсь. в первом варианте я синхронизировал через событие onFrame где слушал булеву каждого экземпляра и приравнивал если появлялась положительная все двигалось а теперь почему-то перестало. Пока без кода ибо лень в данный момент копипастить. но если надо. добавлю. мне кажется я упускаю какую-то маленькую деталь. |
|
|||||
|
Регистрация: Jun 2013
Сообщений: 133
|
Возможно у вас неудобная архитектура проекта. Как у вас происходит навешивание клика - в цикле на каждый объект или на весь контейнер с объектами?
|
|
|||||
|
Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
|
нет клик навешивается в основном классе где описывается весь класс, который уже вызывается в родителе. Получается что класс описывает все что должен делать каждый экземпляр. Проще говоря поведение описано в классе и экземпляр слушается как должен, но только 1 тот на котором щелкнули а остальные не реагируют. Вот мне нужно чтобы все отзывались дружно. Толкнул одного остальные тоже подвинулись. Раньше это было двигались, но не останавливались. Когда я исправил и сделал остановку другие почему-то перестали синхронизироваться. Я добавил пару переменных, и их тоже в синхрон передал. такое впечатление что они тупо перестали слушаться булевы движения.
То есть в классе есть булева переменная которая ложна по умолчанию. В синхроне как только появляется правда все остальные экземпляры тоже получают правду и по идеи должны начать движение. сейчас приведу код синхронизации 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; } Moving - булева переменная двигаться или нет LRDirect - переменная цифровая отвечающая за направление движения anglerot - это угол проще говоря расстояние на которое они должны сместиться. вот в общем anglerot добавил чтобы они не двигались бесконечно и соответствено передаю его остальным ибо он определяется в том экземпляре на котором кликнули. Еще раз повторюсь без последней модификации все двигалось просто была ошибка для устранения которой добавил переменную. |
|
|||||
|
Banned
Регистрация: Aug 2014
Сообщений: 461
|
Это не синхронизация, это ...изм! Переделайте все это в циклы для начала и объясните, как у Вас двигаются объекты, одинаково или нет.
|
|
|||||
|
Регистрация: Jun 2013
Сообщений: 133
|
ну если в основном, тогда при срабатывание события, просто пробегайтесь по массиву объектов и присваивайте нужному параметру нужное значение
|
|
|||||
|
Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
|
Цитата:
Цитата:
Вся идея в том чтобы обьект после клика встал на место так называемого первого обькта. и соответственно остальные тоже должны "подвинуться" |
|
|||||
|
Lorem ipsum
|
Каждый экземпляр класса мог бы предоставлять публичный метод, который инициирует начало движения. Тогда остается лишь дождаться клика, определить, что это именно тот клик, который нам нужен (какие там критерии у тебя) и сказать родителю-собирателю, чтобы сказал своим, что таки надо двигать. И уже этот класс-контейнер пробегается в цикле по всем экземплярам и вызывает у них метод типа chegoStoimKogoZhdem(kudaBezhatX, kudaBezhatY). Как-то так.
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Jun 2013
Сообщений: 133
|
Скорее всего будет проще, если вы скинете небольшой исходник по которму можно будет уже более подробно разобраться и потыкать что у вас получилось.
|
|
|||||
|
Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
|
Цитата:
вот первый класс package Cirk_Utility { import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.text.TextField; import flash.display.*; import flash.events.*; import flash.geom.*; import flash.text.engine.*; import flash.text.*; import My_Utility.Cirk2; /** * ... * @author @PsYcHoTeChNiCk */ public class Elemet extends Sprite { private var Face: Shape; // рисунок public var front_level: Number; // это служебная перменная на далекое будущее не суть важна private var colors: uint; public var Moving: Boolean = false; public var anglerot: Number = 0; // поворот задается позднее private var spinout: Number = 0; // текущий угол поворота private var LRDirect: Number; // направление движение private var scale_arr: Array = new Array(1, 0.75, 0.5, 0.5, 0.75); // это временно для визуального private var levels: Array = new Array(0,1,2,3,4); // слежения private var place: Array = new Array(0, 1, 2, -2, -1); //пришлось сделать чтобы определять направление движения private var thisplace: Number; //собственно тоже самое только для 1 экземпляра private var float: Number = 0; // что-то вроде счетчика как в for i public var SetCtrl: Cirk2; //это я уже перекличку устроил private var Ctrl: Number //вывод локали public function Elemet(color: Number) { super(); if (color == 0) { colors = 0x0000ff; } if (color == 1) { colors = 0x00ff00; } if (color == 2) { colors = 0xff0000; } if (color == 3) { colors = 0x00ffff; } if (color == 4) { colors = 0xff00ff; } spinout = color * 72; //распределям позиции при указании примечание: 72=360 / 5; Ctrl = color; // см выше thisplace = place[color]; позиция для передачи // дальше рисуем Face = new Shape(); Face.graphics.lineStyle(5, colors); Face.graphics.beginFill(colors, 0.5); Face.graphics.drawCircle(0, 0, 50); addChild(Face); // закончили малевание //задаем позицию this.x = 200 * Math.sin((spinout * Math.PI) / 180); this.y = (200 * Math.cos((anglerot*0 * Math.PI) / 180))/5; this.MyScale(scale_arr[color]); this.front_level = levels[color]; addEventListener(MouseEvent.CLICK, onClick); addEventListener(Event.ENTER_FRAME, onFrame); } /че делаем при клике ниже private function onClick(e:MouseEvent): void { Moving = true;// разрешаем движение anglerot = thisplace * 72; //узнаем сколько нужно пройти с + и - if (thisplace != 0) { //если на первом месте нам не нужно ничего двигать if (thisplace > 0) { /двигаемся вправо или влево LRDirect = 1; }else { LRDirect = 0; } } SetCtrl.controlRoll = Ctrl; // а это собственно перекличка } public function MyScale(i: Number):void { // тут понятно думаю this.scaleX = i; this.scaleY = i; } // далее собственно движение private function onFrame(e:Event):void { if (Moving) { //если разрешено двигаться двигаемся. if (LRDirect == 0) { //если вправо значит будем прибавлять if (float != anglerot) { // тут счетчик сравниваем соответствует ли расстоянию spinout += 1; float -= 1; }else {// если путь пройден запрещаем двигаться и сбрасывам счетчик чтобы можно было двигаться много раз Moving = false; float = 0; } }else { // все тоже только для другого направления if (float != anglerot) { spinout -= 1; float += 1; }else { Moving = false; float = 0; } } } собственно двигаемся this.x = 200 * Math.sin((spinout * Math.PI) / 180); this.y = (200 * Math.cos((spinout * Math.PI) / 180)) / 5; } } } package My_Utility { import Cirk_Utility.Elemet; import Cirk_Utility.Platforma; import flash.display.*; import flash.events.*; import flash.geom.*; import flash.text.engine.*; import flash.text.*; /** * ... * @author @PsYcHoTeChNiCk */ public class Cirk2 extends Sprite { private var ikon: Elemet; private var plat_form: Platforma; private var outstr: TextField; private var arr_icon: Array = new Array(); private var scale_arr: Array = new Array(1, 0.75, 0.5, 0.5, 0.75); private var levels: Array = new Array(0, 1, 4, 3, 2); public var controlRoll: Number; public function Cirk2() { super(); outstr = new TextField(); outstr.background = false; outstr.text = " "; outstr.visible = true; outstr.x = 0; outstr.y = -200; outstr.textColor = 0xffffff; outstr.autoSize = TextFieldAutoSize.CENTER; addChild(outstr); for (var i: int = 0; i < 5; i++) { var label: Elemet = new Elemet(i); arr_icon.push(label); addChild(arr_icon[i]); } addEventListener(Event.ENTER_FRAME, onFrame); } private function onFrame(e: Event):void { 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; } } } } Добавлено через 3 минуты Цитата:
Добавлено через 15 часов 29 минут И тишина... неужели такая сложная задача заставить двигаться одновременно несколько копий одного объекта. |
|
|||||
|
Цитата:
Ваш код можно минимизировать до такого: 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; } }
__________________
Ко мне можно и нужно обращаться на ты) |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:00. |
|
|
« Предыдущая тема | Следующая тема » |
|
|