PDA

Просмотр полной версии : Рандом в заданных пределах


GreatRash
09.07.2007, 16:58
Как получить случайное число в заданных пределах, типа как в PHP random(10, 30); выдаст случайное число в пределах от 10 до 30, а во Flash как?
Че-то я не пойму как Math.random(); работает...

BigDan
09.07.2007, 17:01
function newRandom(min:Number,max:Number):Number {
return min+Math.random()*(max-min);
}

GreatRash
09.07.2007, 17:23
Спасибо, работает!

Еще вопрос, вот я дублирую клип, и он появляется в заданных пределах рандомно. А как мне сделать, чтобы он (этот продублированный клип) передвигался вниз?

пишу код:

_root.onEnterFrame = function() {
function newRandom(min:Number, max:Number):Number {
return Math.ceil(min+Math.random()*(max-min));
}
x = newRandom(0, 200)+18;
d = this.getNextHighestDepth();
var new_mc:MovieClip = movie.duplicateMovieClip("mc"+d, d);
new_mc._x = x;
new_mc._y += 10;
};


вообще стоит все на месте...ну точнее по Х рандомится, а по У стоят клипы как вкопанные.

пишу:

y = 0;
_root.onEnterFrame = function() {
function newRandom(min:Number, max:Number):Number {
return Math.ceil(min+Math.random()*(max-min));
}
y ++;
x = newRandom(0, 200)+18;
d = this.getNextHighestDepth();
var new_mc:MovieClip = movie.duplicateMovieClip("mc"+d, d);
new_mc._x = x;
new_mc._y += y;
};


вроде по игрек сдвигается, но только один раз (вниз не едет).

Чего не так пишу?

VladBD
09.07.2007, 18:28
у тебя наверное кадр заново воспроизводится и срабатывает первая строчка y=0. Проверь под отладчиком.

GreatRash
09.07.2007, 18:41
Если б так было, то клипы наверное дергались бы???
trace(y); показывает 1,2,3,4,5... и т.д.

Den_Sao_Pin
09.07.2007, 20:19
Приветствую,
во-первых, не используй зарезервированные термины, а именно x и y в качестве имен переменных,
во-вторых, если я тебя правильно понял (то есть дублированные мувики должны менять координаты и на х и у), то вот получается такой рабочий вариант:
_root.onEnterFrame = function() {
function newRandom(min:Number, max:Number):Number {
return Math.ceil(min+Math.random()*(max-min));
}
randX = newRandom(0, 200)+18;
randY = newRandom(5,50);
d = this.getNextHighestDepth();
var new_mc:MovieClip = movie.duplicateMovieClip("mc"+d, d);
new_mc.onEnterFrame = function(){
this._y +=randY;
this._x -=randX;
}
};

Den_Sao_Pin
09.07.2007, 20:26
соответственно, randY и randX меняешь на любые значения, и дубликаты будут двигаться в указанном направлении ;-)

GreatRash
10.07.2007, 11:31
Den_Sao_Pin
переделал немножко код (мне не надо чтоб рандомно по игрек двигались клипы):

_root.onEnterFrame = function() {
function newRandom(min:Number, max:Number):Number {
return Math.ceil(min+Math.random()*(max-min));
}
randX = newRandom(0, 200)+18;
randY = 10;
d = this.getNextHighestDepth();
var new_mc:MovieClip = movie.duplicateMovieClip("mc"+d, d);
new_mc.onEnterFrame = function(){
this._y +=randY;
this._x = randX;
}
};


че-то вообще какая-то фигня получается...посмотрите кто-нить, если не лень.

Попутно еще вопрос, как дублировать клип из библиотеки, а не с рабочего стола?

BigDan
10.07.2007, 12:55
мне кажется вся проблема в дублировании.

чтоб взять клип из библиотеки - attachMovie()

GreatRash
10.07.2007, 13:30
Написал так:


_root.onEnterFrame = function() {
function newRandom(min:Number, max:Number):Number {
return Math.ceil(min+Math.random()*(max-min));
}
randX = newRandom(0, 200)+18;
randY = 10;
d = this.getNextHighestDepth();
var new_mc:MovieClip = attachMovie("movie", "mc"+d, d);
new_mc.onEnterFrame = function(){
this._y +=randY;
this._x = randX;
}
};


тоже самое...

Kikasso
10.07.2007, 13:44
А нафига функцию каждый кадр переписывать?

GreatRash
10.07.2007, 13:52
Чтоб клипов много было, ну типа как снег, только вертикально вниз и в заданной области.

Den_Sao_Pin
11.07.2007, 00:14
Если ты хочешь создать вариант "падающего снега", хочу тебе предложить нечто схожее в плане алгоритма. Чуть изменишь - и получишь свой снег ;-) файл здесь: http://mozgoedy.narod.ru/files/bla_mod.rar

GreatRash
12.07.2007, 12:01
файл не открывается, у меня FlashMX 2004, а у вас???

Den_Sao_Pin
12.07.2007, 13:07
8 flash

GreatRash
12.07.2007, 14:01
Я так и думал...ну так, что? С МХ кто-нить поможет? Я в AS чайник

Cкептик
12.07.2007, 19:53
В заданныйх пределах алгоритм элементарен:

// случайное число от 0 до 9

n = 10;
number = int(Math.random()*n);

iNils
12.07.2007, 20:34
В заданныйх пределах алгоритм элементарен:

// случайное число от 0 до 9

n = 10;
number = int(Math.random()*n);Проснулись?

GreatRash
13.07.2007, 11:46
:taunt: ха-ха-ха посмешил мужик!!!
но за алгоритм спасибо, этот и впрямь попроще будет...
хотя стоп, он же тлько от нуля предел берет...не подходит

Cкептик
14.07.2007, 01:05
:taunt: ха-ха-ха посмешил мужик!!!
но за алгоритм спасибо, этот и впрямь попроще будет...
хотя стоп, он же тлько от нуля предел берет...не подходит

Окей, сделаем так (случайное число от 5 до 10):

a = 5;
b = 10;
num = int(Math.random()*(b - a + 1) + a);

Теперь - я полагаю - подходит? :drinks:

iNils
14.07.2007, 01:16
Cкептик, я не зря написал "проснулись", вы видели 2-ой пост данной темы (на первой странице)?

Den_Sao_Pin
14.07.2007, 14:06
Ладно, Флеш то у меня 8, но АкшнСкрипт - второй ;-)
Предварительно создаешь три мувика с любыми именами (в самих мувиках: первый кадр actions содержит команду stop(); следующий кадр называется hit) - в свойствах Linkage (правая кнопка на мувике в библиотеке - для того, чтобы можно было обращаться к мувику из AS по имени) прописываешь имена: bla1_mc, bla2_mc, bla3_mc.
//С уважением, Den_Sao_Pin. http://mozgoedy.narod.ru/

_global.cDepth = 5;


//Задаю высоту экрана

var stageHeight:Number = 160;


//код для непрерывного появления восклицаний
this.onEnterFrame = function() {
/*если хочешь, чтобы появлялось больше экземпляров-вторую цифру поменяй на меньшую; вообще, смысл этого следующий: если случайное число из диапазона от 0 до 5, равно 0, то происходит следующее*/
if (randRange(0, 5) == 0) {
//прикрепляю мувики к сцене
var randomBla:Number = randRange(1, 3);
var thisMC:MovieClip = this.attachMovie("bla"+randomBla+"_mc", "bla"+_global.cDepth+"_mc", _global.cDepth);
_global.cDepth++;
//выставляю место появления
var randomX:Number = randRange(30,450);
var randomY:Number = randRange(170,220);
thisMC._x = randomX;
thisMC._y = randomY;
var scale = randRange(70, 100);
//изменяю масштаб восклицаний
thisMC._xscale = scale;
thisMC._yscale = scale;
thisMC._alpha = scale;
}
thisMC.onEnterFrame = function() {
//двигаю новые мувики по направлению вверх
var speed:Number = randRange(3,8);
this._y -= speed;
//немного сдвигаю по х + меняю масштаб
this._x -= .4;
this._xscale +=speed/3;
this._yscale +=speed/3;
//при выходе за пределы границы экрана - второй кадр мувика bla
if (this._y<stageHeight) {
this.gotoAndPlay("hit");
var ymov = this._y;
//это уже пошли изменения для второго кадра
ymov -= speed;
xmov *= 0.5;

this._alpha -=speed/1.2;
this._xscale -=2*speed;
this._yscale -=2*speed;
//если мувик "подбирается" к самому верху - удаляю его, чтобы он не загружал память
if (this._y<50) {
this.removeMovieClip();
}
}
}

//функция для задания случайных чисел в заданном диапазоне
function randRange(minNum:Number, maxNum:Number):Number {
return (Math.floor(Math.random()*(maxNum-minNum+1))+minNum);
}
}
Вот в принципе все :-)

etc
14.07.2007, 14:17
Den_Sao_Pin, приведенный код — ActionScript 1 чистейшей воды (наличие типизации — это ещё не AS2).

Den_Sao_Pin
14.07.2007, 15:18
тем более ;-)

Cкептик
14.07.2007, 17:02
Cкептик, я не зря написал "проснулись", вы видели 2-ой пост данной темы (на первой странице)?

Сравните и вы поймете, что мой вариант - правильней.

iNils
14.07.2007, 18:37
Сравните и вы поймете, что мой вариант - правильней.Не вижу. Я вижу только собственную интерпретацию вопроса и использование устарелого метода int. А фактически, ваш код округляет числа, а у БигДана нет, поставь он Math.round, было бы тоже самое, но в вопросе не упоминалось, что числа должны быть целыми.