Просмотр полной версии : Рандом в заданных пределах
GreatRash
09.07.2007, 16:58
Как получить случайное число в заданных пределах, типа как в PHP random(10, 30); выдаст случайное число в пределах от 10 до 30, а во Flash как?
Че-то я не пойму как Math.random(); работает...
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;
};
вроде по игрек сдвигается, но только один раз (вниз не едет).
Чего не так пишу?
у тебя наверное кадр заново воспроизводится и срабатывает первая строчка 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;
}
};
че-то вообще какая-то фигня получается...посмотрите кто-нить, если не лень.
Попутно еще вопрос, как дублировать клип из библиотеки, а не с рабочего стола?
мне кажется вся проблема в дублировании.
чтоб взять клип из библиотеки - 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;
}
};
тоже самое...
А нафига функцию каждый кадр переписывать?
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 чайник
В заданныйх пределах алгоритм элементарен:
// случайное число от 0 до 9
n = 10;
number = int(Math.random()*n);
В заданныйх пределах алгоритм элементарен:
// случайное число от 0 до 9
n = 10;
number = int(Math.random()*n);Проснулись?
GreatRash
13.07.2007, 11:46
:taunt: ха-ха-ха посмешил мужик!!!
но за алгоритм спасибо, этот и впрямь попроще будет...
хотя стоп, он же тлько от нуля предел берет...не подходит
:taunt: ха-ха-ха посмешил мужик!!!
но за алгоритм спасибо, этот и впрямь попроще будет...
хотя стоп, он же тлько от нуля предел берет...не подходит
Окей, сделаем так (случайное число от 5 до 10):
a = 5;
b = 10;
num = int(Math.random()*(b - a + 1) + a);
Теперь - я полагаю - подходит? :drinks:
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);
}
}
Вот в принципе все :-)
Den_Sao_Pin, приведенный код — ActionScript 1 чистейшей воды (наличие типизации — это ещё не AS2).
Den_Sao_Pin
14.07.2007, 15:18
тем более ;-)
Cкептик, я не зря написал "проснулись", вы видели 2-ой пост данной темы (на первой странице)?
Сравните и вы поймете, что мой вариант - правильней.
Сравните и вы поймете, что мой вариант - правильней.Не вижу. Я вижу только собственную интерпретацию вопроса и использование устарелого метода int. А фактически, ваш код округляет числа, а у БигДана нет, поставь он Math.round, было бы тоже самое, но в вопросе не упоминалось, что числа должны быть целыми.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.