2010-10-16 3 views
3

Последнее изменение: Решено!Actionscript 3: Динамическое добавление мувиклипов, ограниченных контейнером

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

как примечание стороны: Я думаю, что, возможно, у меня были проблемы с использованием типов int и Number, при ближайшем рассмотрении моего решения я понял, что 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

BONUS CONTENT! в качестве дополнительного бонуса (если кто-то найдет эту тему в поисках ответов ..) у вас также может быть фанат «pic» из центральной точки (но они все равно будут в порядке слева направо), используя этот код :

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; 
    } 
} 

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

Оригинал сообщения:

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

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

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; 

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

благодаря любым берущих заранее ..

ответ

2

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

//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; 
    } 
+0

Привет, большое спасибо за ваш вклад! Я видел, что вы там сделали, и по большей части это блестяще! Тем не менее, мне нужен был хороший час, чтобы разгадать логику, поскольку вы использовали некоторые методы кодирования, которые я раньше не видел (это утверждение было похоже на «Wha ..?»). Во всяком случае, проблема остается с этим подходом, так как даже при том, что он сжимает клипы в хорошем состоянии, они не полностью сквозируют в контейнер и немного отрубают с правой стороны. У вас (или кто-либо еще) есть идея о том, как это исправить? Я отредактировал свой основной пост, чтобы отразить мой новый код. Спасибо =) – Partack

+0

Мне пришлось отредактировать свой ответ, так как я писал «длину», где он должен был быть «шириной» относительно свойства экранных объектов. свойства длины для массивов. – TheDarkIn1978

+0

Ohhhh ... Так что это расстояние между длиной и шириной.Я думал, что это было неправильно, xD, спасибо за вашу помощь в этом, хотя ваш ответ не совсем дал мне то, что я искал, это помогло мне понять, как я должен был думать о том, какие цифры нужно проверять чтобы получить ответы. как мое редактирование подсказывает вверх, я нашел решение, и это очень близко к тому, что вы делали, поэтому очень большое спасибо за ваше время и терпение, чтобы ответить на мой вопрос =) – Partack

0

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

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

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

Для info on Flex Layouts

+0

Здравствуйте, Спасибо, что нашли время, чтобы прочитать мой вопрос, это простая дилемма, которую я имею, заключается в том, чтобы интегрироваться в гораздо более широкое приложение, и мне не удобно «оставлять гнездо» для использования «вспомогательных» фреймворков в данный момент времени. хотя ссылки, которые вы мне дали, были очень вдохновляющими, и я добавил их в закладки для дальнейшего изучения, потому что звуки гибкости действительно замечательные! =) – Partack

1

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

//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); 
} 
Смежные вопросы