PDA

Просмотр полной версии : загрузка случайных клипов без повтора


niks77
18.03.2009, 11:20
проблемма: загрузка нескольких случайных клипов на сцену из массива так, чтобы они не повторялись.
На форуме нашел несколько сообщении на эту тему. Мне не удалось привязать их к моему примеру. Или не работало или было черезчур сложно. Хорошо бы остаться в рамках Flash MX
Пробую следующее

myArray = new Array("a", "b", "c", "d");
{
var r = Math.ceil(Math.random(1)*4);

attachMovie("mc"+r, "mcr",0, {_x:210, _y:220});

myArray2 = myArray.splice("mc"+r,1);

var p = Math.ceil(Math.random(1)*3);
attachMovie("mc"+p, "mcp",10, {_x:310, _y:320});
}

Два клипа из 4 появляются на сцене, но время от времени они повторяются
/myArray2 = myArray.splice("mc"+r,1);/ или не работает или работает не верно(удаляет не тот клип)
В реальности клипов будет 50, из них 30 случаиных должны появится на сцене, но не повторятся.
Кто поможет?

nOobCrafter
18.03.2009, 11:35
Ну за детсад.. Я ж тебе отписал уже:
function myRandNumber(min:Number, max:Number):Number
{
var randomNumb:Number = Math.round(Math.random() * (max - min)) + min;
return randomNumb;
}

function getRandomIntArray(len:Number):Array
{
var A:Array = [];
var found:Boolean = false;
var un:Number;

while (A.length != len)
{
un = myRandNumber(1, len);
found = false;
for (var i = 0; i < A.length; i++)
{
if (A[i] == un)
{
found = true;
break;
}
}
if (!found) A.push(un);
}
return A;
}

var rand_arr:Array = getRandomIntArray(50); // так применяем
var rand:Number;
trace(rand_arr)

for (var i:Number = 0; i < 30; i++)
{
rand = rand_arr[i];
trace(rand)
}

_SAM_
18.03.2009, 13:03
Создаешь массив, Берешь за индекс массива "i" рондомешь его в указанных рамках:



Пример

В следующем примере возвращается случайное число в указанном диапазоне.

function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.round(Math.random()*(max-min))+min;
return randomNum;
}
for (var i = 0; i<25; i++) {
trace(randRange(4, 11));
}

Подгружаешь клип в первый слой, адрес берешь с массива, и адрес подгруженной картинки удаляешь с массива Array.splice()
Потом опять генеришь случайное число от 0 до Array.length() — количество элементов в массиве, грузишь клип, удаляешь... и так пока не выгрузишь все.
Тебе надо:
http://www.flasher.ru/forum/showthread.php?t=93300
там класс Мath и Array

iNils
18.03.2009, 13:12
niks77, для оформления своего кода, надо использовать теги .

nOobCrafter
18.03.2009, 14:09
_SAM_ извиняюсь, но чем предложенный тобой способ отличается от моего? Если хочется диапазон не с 1, а от N то неужто трудно добавить аргумент типа
function getRandomIntArray(N:Number, len:Number):Array
.......
un = myRandNumber(N, len);
....
Просто данный вариант заточен именно под галереи где счет идет с 1 \ 0...

niks77
18.03.2009, 14:59
nOobCrafter
На счет детсада - верно. Мне как раз под 60. Скоро снова в дет сад пора....
По сути... Возможно и даже уверен твой скрипт очень хорош. Пробую с ним чего то делать. Ничего не получается ( у меня Flash MX).
Просьба простая: конкретный работающии скрипт: 4 mc, 2 случайных из них грузятся на сцену в определенные точки причем не повторяясь( см.выше)
_SAM_
По этому пути я и шел. Создал массив. Случаиный член атачится на сцену, затем создаю массив2 за вычетом использованного члена первоначального массива и рандомно опять attach. Однако здесь /myArray2 = myArray.splice("mc"+r,1);/что то не верно. Что?

А вообще, всем спасибо

nOobCrafter
18.03.2009, 15:29
итак, в библиотеке имеем 4 мувика с линкейдж именами btn1, btn2, btn3, btn4...
function myRandNumber(min:Number, max:Number):Number
{
var randomNumb:Number = Math.round(Math.random() * (max - min)) + min;
return randomNumb;
}

function getRandomIntArray(len:Number):Array
{
var A:Array = [];
var found:Boolean = false;
var un:Number;

while (A.length != len)
{
un = myRandNumber(1, len);
found = false;
for (var i = 0; i < A.length; i++)
{
if (A[i] == un)
{
found = true;
break;
}
}
if (!found) A.push(un);
}
return A;
}

var rand_arr:Array = getRandomIntArray(4); // так применяем
var rand:Number; // переменная для случайного числа
// дальше код аттача, там важно только 2 строчки, остальное для наглядности
for(var i:Number = 1; i <= 2; i++)
{
rand = rand_arr[i]; /// !!!!!!
var btn:MovieClip = _root.attachMovie("btn" + rand, "Symbol" + i, _root.getNextHighestDepth()) /// !!!!
// все тчо ниже можно не писать, остальное только для наглядности..
btn._x = 10 + (btn._width + 5) * (i - 1);
btn._y = (Stage.width - btn._width) / 2;

var txt = btn.createTextField("my_txt", 1, 0, 0, 50, 20);
txt.autoSize = true;
txt.selectable = false;
txt._x = (btn._width - txt._width) / 2;
txt._y = (btn._height - txt._height * 2) / 2;
var my_fmt:TextFormat = new TextFormat();
my_fmt.bold = true;
my_fmt.color = 0x333333;
my_fmt.font = "Trebuchet MS"
my_fmt.size = 10;
txt.text = rand; // в текстовое поле загоняем номер
txt.setTextFormat(my_fmt); // применяем текстформат
}