Тема: Генерация случайных чисел. Функция eval(). Свойство _currentFrame. Игра крестики-нолики
Отчет: Файлы с выполненными заданиями.
Случайные числа
Случайных чисел в ActionScript генерируются методом random() объекта Math (Math.random()). Данный метод возвращает случайное число в диапазоне от 0 до 1. Вероятность выпадения каждого из 1 000 000 000 000 000 возможных чисел одинакова и ничтожно мала.
На практике обычно бывает необходимо получать случайные значения в некотором промежутке от А до В, где А и В отличны от 0 и 1. Общая формула для получения случайных чисел в промежутке от А до В (А<В) имеет вид:
(B - А) * Math.random() + А.
Например, чтобы сгенерировать случайное число от 0 до 100, нужно набрать:
trace(100*Math.random());
Случайное число в промежутке от –10 до 20 дает следующий код:
trace(30*Math.random()-10); /
Иногда необходимо генерировать значение из какого‑то ограниченного множества целых величин. Например, расставляя корабли в игре «Морской бой», генерировать необходимо целые числа от 1 до 100. Чтобы решить эту задачу, метод Math.random() нужно использовать совместно с одним из методов округления.
|
|
Округление до целого числа
Многие свойства, параметры и характеристики выражаются целыми числами. Для округления до целых в ActionScript имеются три метода.
Метод Math.round() проводит округление до ближайшего целого. Если дробная часть числа больше или равна 0.5, то округление проводится в сторону увеличения (для отрицательных чисел – увеличения абсолютной величины):
trace(Math.round(1.5)); // Выводит: 2
trace(Math.round(3.6)); // Выводит: 4
trace(Math.round(3.4)); // Выводит: 3
trace(Math.round(-1.5)); // Выводит: -1
trace(Math.round(-3.6)); // Выводит: -4
trace(Math.round(-3.4)); // Выводит: -3
Метод Math.floor() округляет число до наименьшей ближайшей целой величины.
Например:
trace(Math.floor(2.99999999)); // Выводит: 2
trace(Math.floor(-2.99999999)); // Выводит: -3
//(-3 меньше, чем -2.99999999)
Метод Math.ceil() противоположен методу Math.floor(). Он возвращает ближайшее целое число, большее данного:
trace(Math.ceil(2.99999999)); // Выводит: 3
trace(Math.ceil(-2.99999999)); // Выводит: -2
Довольно часто возникает необходимость проводить округление не до целых, а до некоторого десятичного разряда. Однако метода, который позволял бы решать эту задачу, в ActionScript нет. Но при необходимости его можно создать.
Так, чтобы округлить число до n десятичных знаков, его нужно умножить на 10n, провести операцию округления, а затем поделить на 10n результат. Например:
function n_round(number, n) {
var f = Math.pow(10, n);
return Math.round(number*f)/f;
}
trace(n_round(10.19876784,3)); // Выводит: 10.199
Определение размеров рабочей области.
Каждый кадр имеет некоторое содержание, которое показано на графическом холсте, названном Stage.
Свойства _width и _height присущи и основной временной диаграмме _root. Причем их значения для _root определяются точно по таким же принципам, как и для обычных клипов. Распространенной ошибкой является попытка определить размер поля фильма как высоту и ширину _root.
|
|
Чтобы правильно решить эту задачу, нужно воспользоваться свойствами width и height объекта Stage (записываются без символа подчеркивания!):
trace([_root._height, _root._width]); // 0, 0, если _root пустой
trace([Stage. height, Stage. width ]);
// 400 550 — размер рабочей области
Задание 1
1. Создать новый Flash-документ.
2. Создать в нем слои Actions и Clip.
3. Создать символ MovieClip в виде квадрата 60х60.
4. Разместить экземпляр созданного символа в единственном кадре слоя Clip. При нажатии экземпляра он должен "убегать" в случайном направлении на случайное расстояние из диапазона 60-120 по каждой из осей. Квадрат не должен убегать за пределы рабочей области.
Задание 2
Создать поле для игры в крестики нолики
1. Создать новый Flash-документ с двумя слоями: Actions и Game.
2. Каждая отдельная клетки поля для игры представляет квадрат, имеющий три состояния: пусто, крестик и нолик. Создать символ MovieClip с тремя соответствующими кадрами. Дать символу имя cell.
3. В центре рабочей области слоя Game разместить 9 экземпляров клетки.
4. Протестировать флеш.
Задание 3
1. В каждой клетке поля игры непрерывно меняются кадры. Необходимо остановить проигрывание анимации у клипов-клеток методом stop().
Для программного управления дать клеткам следующие имена c00, c01, c02, c10 и т.д. Индексы состоят из номеров строки и столбца клетки.
Преобразование строк в идентификаторы. Функция eval()
Функция eval() позволяет динамически преобразовывать строки в идентификаторы объектов, клипов и функций.
row=1; col=2;
eval("c"+row+col+"_mc")._x=100; // c12_mc._x=100;
Довольно часто имена объектов используются как строки. Методы программного создания клипов требуют указания их имени в качестве строки (хотя они и возвращают ссылку на созданный объект).
for (var i = 0; i<100; i++)
_root.attachMovie("ball", "ball"+i, i);
В подобных случаях часто используется функция eval(). Чтобы остановить проигрывание i-го клипа, надо записать
eval("ball"+i).stop();
Если необходимо динамически создать идентификатор вложенного клипа, то его полный адрес должен быть получен в скобках функции eval(). Частой ошибкой является ее использование в качестве метода, например:
big_ball.eval("ball"+n)._x=100; // Нельзя
Чтобы получить доступ к расположенному на временной диаграмме клипа big_ball клипу balln, нужно набрать следующий код:
eval("big_ball.ball"+n)._x=100;
Функция eval() не совместима с оператором присваивания (точнее, выражение с ней не может являться левым операндом оператора "="). Для того чтобы создать переменную или свойство с динамически формируемым именем, нужно использовать функцию set() или оператор []:
eval("per"+i)="ActionScript"; //Ошибка
set("per"+i, "ActionScrip "); //Правильно, но устарело
this["per"+i]=" ActionScrip"; //Оптимально
Задание 4
1. В сценарии кадра закомментировать код остановки проигрывания клипов-клеток и переписать его в виде цикла.
Задание 5
1. Остановить автоматическое проигрывание клипов методом stop(), размещенным на первом кадре символа.