Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Рандом в заданных пределах (http://www.flasher.ru/forum/showthread.php?t=98233)

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

Цитата:

Сообщение от Cкептик
В заданныйх пределах алгоритм элементарен:

Код:

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

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


Проснулись?

GreatRash 13.07.2007 11:46

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

Cкептик 14.07.2007 01:05

Цитата:

Сообщение от GreatRash
: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

Цитата:

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

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

iNils 14.07.2007 18:37

Цитата:

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

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


Часовой пояс GMT +4, время: 05:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.