Actionscript 3: динамическое добавление фрагментов ролика, ограниченных к контейнеру - PullRequest
3 голосов
/ 17 октября 2010

Последнее редактирование: Решено!

Ну, я не смог найти ВЕСЬ ответ здесь, но я наконец-то получил то, что хотел.Большое спасибо за вашу помощь и терпение.

в качестве примечания: Я думаю, что, возможно, у меня возникли проблемы с использованием типов int и Number при более внимательном рассмотрении моего решенияЯ понял, что номер используется, а не int.Оказывается, число содержит числа с плавающей запятой, а int - нет.мои цифры, вероятно, округлялись всякий раз, когда я пытался исправить это сам.насколько я знаю, ответ TDI, возможно, был точным, и использование int для заполнения могло бы накапливать округленные числа ... О, хорошо, вы узнаете что-то каждый день ..

правильный код, чтобы ограничить видеоклипыдля контейнера видеоклипа контейнера (или спрайта или чего-то еще) в моде, который я искал, таков:

var picContainer:PicContainer = new PicContainer();
picContainer.x = stage.stageWidth / 2 - picContainer.width / 2;
picContainer.y = stage.stageHeight / 2 - picContainer.height / 2;
addChild(picContainer);

var totalPics:int = 17;

var pic:Pic = new Pic(); //make an instance just to get its width

var xRange:Number = picContainer.width - pic.width;
var spacing:Number = xRange / (totalPics - 1);

//A little optimization: only need to calculate this number ONCE:
var yLoc:Number = picContainer.height / 2 - pic.height / 2;

for(var i:int = 0; i < totalPics; i++) {
    pic = new Pic();
    pic.x = i * spacing;
    pic.y = yLoc;
    picContainer.addChild(pic);
}

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

БОНУСНОЕ СОДЕРЖАНИЕ! в качестве дополнительного бонуса (если кто-то найдетэтот поток ищет ответы ..) Вы также можете вывести вентилятор «Пика» из центральной точки (но они будут все в порядке слева направо), используя этот код:

var picContainer:PicContainer = new PicContainer();
picContainer.x = stage.stageWidth / 2 - picContainer.width / 2;
picContainer.y = stage.stageHeight / 2 - picContainer.height / 2;
addChild(picContainer);

var totalPics:int = 5;

var pic:Pic = new Pic(); //make an instance just to get its width

var padding:Number = (picContainer.width - (pic.width * totalPics))  / (totalPics + 1);

for(var i:int = 0; i < totalPics; i++) {
    pic = new Pic();
    pic.x = padding + i * (pic.width + padding);
    pic.y = picContainer.height / 2 - pic.height / 2;
    picContainer.addChild(pic);
}

Попробуйтеэто, они делают для больших док-движков миниатюр!

Первое редактирование: Ну, есть некоторый прогресс благодаря TDI, но не полное решение.

вы видите,проблема остается в том, что фрагменты ролика не полностью сдавливаются в контейнер, последние один или два остаются торчащими.

example:

alt text

мой пересмотренный код выглядит следующим образом:

var newPicContainer:picContainer = new picContainer();
var newPic:pic;

var picwidth:int = 100;
var amountofpics:int = 22;
var i:int;

//add a container
addChild(newPicContainer);

//center our container
newPicContainer.x = (stage.stageWidth/2)- (newPicContainer.width/2);
newPicContainer.y = (stage.stageHeight/2)- (newPicContainer.height/2);

var totalpicwidth:int = picwidth*amountofpics;

var totalpadding:int = newPicContainer.width - totalpicwidth;

var paddingbetween:int = (totalpadding / amountofpics);

for (i = 0; i < amountofpics; ++i)
{
    //make a new mc called newPic(and i's value)  eg. newPic1
    this['newPic' + i] = new pic();
    this['newPic' + i].width = picwidth;

    //add our pic to the container
    newPicContainer.addChild(this['newPic' + i]);

    //set the new pics X
    if (i != 0)
    {
        // if i is not 0, set newpic(i)s x to the previous pic plus the previous pics width and add our dynamic padding 
        this['newPic' + i].x = this['newPic' + (i-1)].x + picwidth + paddingbetween;
    }
    else
    {
        this['newPic' + i].x = 0;
    }
}

Еще раз спасибо всем заранее!

Исходное сообщение:

Здравствуйте, Первое размещение здесь.Надеюсь, я не ошибаюсь.Моя проблема заключается в следующем:

У меня есть довольно простой цикл for, который создает «эскиз» и помещает его рядом с предыдущим (с небольшим отступом) внутри содержащего фрагмента ролика.

var newPicContainer:picContainer = new picContainer();
var newPic:pic;
var amount:int = 9;
var i:int;

//Add our container
addChild(newPicContainer);

//center our container
newPicContainer.x = (stage.stageWidth/2)- (newPicContainer.width/2);
newPicContainer.y = (stage.stageHeight/2)- (newPicContainer.height/2);


for (i = 0; i < amount; ++i)
{
 newPic = new pic();
 newPicContainer.addChild(newPic);

    //just so i know it's adding them..
    trace(newPic.thisOne);
 newPic.thisOne = i;

    // set this one to its self (+5 for padding..) Times, the amount already placed. 
 newPic.x = (newPic.width+5) *i;
}

Мне интересно, есть ли какое-нибудь уравнение или «волшебная математика», которые я могу использовать, чтобы выяснить, какова длина контейнера, и добавить «миниатюры» относительно этого числа.в основном сдавливая миниатюры друг против друга, чтобы они все поместились внутри ..

что-то вроде:

newPic.x = (newPic.width *i) - stuff here to make it know not to go past the containing width;

Я должен признать, что я не слишком хорош в математике, и поэтомучасть кодирования ускользает от меня ..

спасибо заранее всем желающим ..

Ответы [ 3 ]

2 голосов
/ 17 октября 2010

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

//Container Width    
newPicContainer.width;

, либо newContainer также является родителем добавленных изображений:

//Container Width    
newPic.parent.width;

затемвам нужно получить общую длину занятых вами фотографий:

var arrayOfPics:array = [pic1, pic2, pic3, pic4, pic5];
var picsWidth:Number;

for each (var element:pic in arrayOfPics)
         picsWidth =+ element.width;

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

var totalPadding:Number = newPicContainer.width - picsWidth;

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

var padding:Number = totalPadding / arrayOfPics.length + 1;

сейчасВы можете просто добавить свои фотографии, включив отступ

for (var i:int = 0; i < arrayOfPics.length; i++)
    {
    newPicContainer.addChild(arrayOfPics[i]);
    (i == 0) ? arrayOfPics[i].x = padding : arrayOfPics[i].x = arrayOfPics[i - 1].x + arrayOfPics[i - 1].width + padding;
    }
1 голос
/ 17 октября 2010

Попробуйте это ...

 //maximum available length
 var maxLength:int; 

 // a single thumbnail width
 var picWidth:int = 100;

 // total number of pics in a container
 var maxNumPics:int;

 // as long as the maximum available length
 // is inferior to the container length 
 // add a new thumbnail
 while( maxLength < newPicContainer.length - 100 )
 { 
    maxLength += 100;
    maxNumPics += 1;
 } 

 // calculate the amount of available padding.
 var padding:Number =  ( newPicContainer.length - maxLength )/ maxNumPics; 

 //add your thumbs
 var picX:int;

 for( var i:int ; i < maxNumPics ; ++i )
 {
     var newPic:Pic = new Pic();
     newPic.x = picX;

     picX += padding + picWidth;
     newPicContainer.addChild( newPic ); 
 }
0 голосов
/ 17 октября 2010

Я бы рекомендовал вам взглянуть на использование среды Flex (это среда Flash), это значительно упростит построение такого вида.

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

Для получения дополнительной информации о Flex смотрите здесь

Для информации о FlexМакеты

...