PDA

Просмотр полной версии : Помогите с формулой для расстановки превьюх на сцене


sxstudio
02.04.2007, 00:56
Ну обломал голову - ничего не могу поделать с собой. Смысл такой, есть цикл for от 1 до 12 с шагом 1. каждый цикл создает эмптимуви и кладет туда картинку из лоадмуви.Вообщем ничего слоджного. но также в цикле выставляю координаты этим мувикам с картинками. нужно чтобы было 3 ряда картинок по 4 картинки в каждом ряду.
Методом научного подбора подобрал вот такую формулу:

for (i; i<=12; i++) {
var mc = this.attachMovie("picture", "p"+i, i, {num:i});
mc._x = (i%4*159)+100; // 159 это просто коэфиент -длина картинки + 100 смещение от края
mc._y = Math.ceil(i/4)*105; // это вроде верно
}



Это полностью рабочий код, но в этом варианте он кладет 4 ую по номеру картинку в первый ряд на первую позицию с левого края, что неверно, в каждом ряду ситуация такая же.

И это неудивительно т.к.
trace выдает (i=1%4 =====>1 | i=2%4 =====>2 | i=3%4 =====>3 | i=4%4 =====>0)
нужно чтоб соответственно при i=1 координаты были 0, при 2 - 1*159, при 3 - 2*159 и при 4 - 3*150 во втором ряду тже самое...
Ошибка в красном.

Если кто догадался намекните - спасибо заранее

etc
02.04.2007, 01:04
Рассуждаем логически:
i = 0, следовательно остаток 0, т.е. _x = 100;
i = 1 — 1
i = 2 — 2

i = 4 — 0
i = 5 — 1

i = 12 — 0
Здеь вроде нормально.
Чего получить-то хотели? У вас начальное значение i вообще не задано.

sxstudio
02.04.2007, 01:15
начальное ессно = 1. это все понятно.. я же говорю в целом все работает. единственное что смущает - это последовательность загрузки.
к примеру в такой фомуле как у меня сначала загружается вторая слева картника в первом ряду потом третья слева потом 4, а только потом первая в этом ряду. и так с каждым рядом и это не удивительно т.к. по номеру первая картинка на самом деле является 4 ой. хочу чтоб последовательность была русской - тоесть слева направо четко и последовательно.. грубо говоря все тодже самое но только чтоб все по очереди они грузились

etc
02.04.2007, 01:21
Потому что цикл единовременен, браузер за раз получает команду загрузки 12-ти картинок. А в каком порядке на самом деле они будут грузиться — как повезет. В вашем случае нужно отказаться от цикла и грузить картинки последовательно — сразу после загрузки одной, грузить следующую по порядку, пока картинки вообще есть.

sxstudio
02.04.2007, 01:28
нет, опять не поняли вы меня. с этим тоже все впорядке.. тут создан холдер класс и в цикле ссылка на функцию, которая при успешной и полной загрузке одной картинки инициализирует загрузку второй под следующим номером. так первая успешно загруженная картинка инициализирует загрузку второй.. суть не в этом, повторюсь. механизм инициализации отточен. картинки грузятся не хаотично а по порядку. смысл в формуле.

etc
02.04.2007, 01:38
Ошибка не в i%4, а в Math.ceil(i/4)*105;
i = 0 — 0
i = 1 — 1

i = 5 — 2
Math.ceil округляет до следующего целого.
Вам нужно использовать вложенный цикл.

sxstudio
02.04.2007, 01:48
ну так с _y же все верно он работает исправно разбивая по 4 фотки в 3 ряда. цикл в цикле о чем речь, поясните плз.

etc
02.04.2007, 01:55
Ну так i же от единицы начинается, значит первый клип будет во втором столбике первого ряда! (1%4 равен единице, т.е. _x = 259, а _y равен 105)

Требуемое получается вот так:

for (i=0; i<12; i++) {
var mc = this.attachMovie("picture", "p"+i, i, {num:i});
mc._x = ((i%4)*159)+100;
mc._y = Math.floor(i/4)*105;
}

sxstudio
03.04.2007, 01:46
Ваш код не верен т.к. в хмл из нодов которого грузятся картинки нет нулевого нода, а следовательно нет нулевой картинки..

Вашел из положения ужасно, но вот так.

var i = 1;
for (i; i<=12; i++) {
var mc = this.attachMovie("picture", "p"+i, i, {num:i});
if ((i%4) == 0) {
mc._x = 577;
} else if ((i%4) == 1) {
mc._x = 100;
} else if ((i%4) == 2) {
mc._x = 259;
} else {
mc._x = 418;
}

mc._y = Math.ceil(i/4)*105;

}

etc
03.04.2007, 01:48
Ваш код не верен т.к. в хмл из нодов которого грузятся картинки нет нулевого нода, а следовательно нет нулевой картинки..[/code]
Это скорее ваш XML неверен. Если вывести числа, соответствующие номеру мувика, то все нормально, от 0 и вперед. И ничего не мешает прибавить единичку в нужных местах.

NtM
04.04.2007, 00:09
/*
colCount - количество столбцов, в твоём случае 4
currN - текущий номер картинки
wdxPrev - размер картинки + расстояние между картинками
массив картинок от 0 до n
*/

var coord = {};
coord.r= Math.floor(currN /_colCount); //номер строки
coord.c= currN % _colCount; //номер столбца
//координаты
coord.xx= coord.c*wdxPrev;
coord.yy= coord.r*wdxPrev;

iNils
04.04.2007, 00:15
NtM, плюс за отсутствие тегов.

this.create
04.04.2007, 00:56
sxstudio
Известны ли заранее размеры картинок? Картинки все одинаковые по размеру или разные?

NePridymal
04.04.2007, 14:24
А зачем такие сложности? Математические вычисления и все такое? Не проще ли ввести дополнительную переменную, в которой будет хранится позиция ячейки для мувика по иксу? Например так:


var xPosition = 0;
for (i; i<=12; i++) {
var mc = this.attachMovie("picture", "p"+i, i, {num:i});
mc._x = (xPosition*159)+100; // 159 это просто коэфиент -длина картинки + 100 смещение от края
xPosition = (xPosition >= 3) ? 0 : xPosition+1;
trace(xPosition);
mc._y = Math.ceil(i/4)*105; // это вроде верно
}