|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Sep 2017
Сообщений: 21
|
Случайные координаты движения автофигуры
Добрый день.
Помогите с решением. Есть скрипт программно создающий и двигающий фигуру - по определенным координатам. Но эти координаты жестко определены. Как заставить координаты - определяться случайным образом (чтобы при каждом запуске файла - движение фигуры было непохоже на предыдущее) ? //Создаём квадрат var quad:Shape = new Shape(); quad.graphics.beginFill(0x000000); quad.graphics.drawRect(0, 0, 32, 32); addChild(quad); var points:Array = [ new Point(10, 10), new Point(200, 100), new Point(50, 300), new Point(300, 300), new Point(0,0), new Point(200, 10)]; //Перечисляем через запятую любое кол-во точек var position:Number = 0; // позиция анимации var speed:Number = 1; // пикселей в кадр var distance = calculateDistance(points); // Общая длина пути this.addEventListener(Event.ENTER_FRAME, update); function calculateDistance(arr:Array):Number { var distance = 0; for(var i:int = 1; i < arr.length; i++) distance += Point.distance(arr[i] , arr[i-1]); return distance; } function update(e:Event):void { //Эта функция будет вызываться каждый кадр if(position > distance) return; var distanceSum:Number = 0; for(var i:int = 1; i < points.length; i++) { var currDist = Point.distance(points[i], points[i-1]); if(distanceSum + currDist > position) //Мы нашли промежуток, в котором находимся { var pos:Point = Point.interpolate(points[i], points[i-1], (position - distanceSum)/currDist); quad.x = pos.x; // quad меняем на кастомную фигуру quad.y = pos.y; break; } distanceSum += currDist; } position += speed; } |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
А почему бы на сделать напрямую через добавление нового метода, куда на входе можно передавать нужное количество точек, а на выходе получать массив из случайно сгенерированных через math.random координат в нужном количестве? А потом из полученного таким образом массива "набивать" попарно координаты точек.
|
|
|||||
//Создаём квадрат var quad:Shape = new Shape(); quad.graphics.beginFill(0x000000); quad.graphics.drawRect(0, 0, 32, 32); addChild(quad); var points:Array = []; var min:int = 5, max:int = 10; //Сколько точек будет - случайное число между 5 и 10. var numPoints:int = min + Math.round((max - min) * Math.random()); for(var i:int = 0; i < numPoints; i ++) points.push(new Point(Math.random()*(stage.stageWidth - quad.width), Math.random()*(stage.stageHeight-quad.height))); var position:Number = 0; // позиция анимации var speed:Number = 1; // пикселей в кадр var distance = calculateDistance(points); // Общая длина пути this.addEventListener(Event.ENTER_FRAME, update); function calculateDistance(arr:Array):Number { var distance = 0; for(var i:int = 1; i < arr.length; i++) distance += Point.distance(arr[i] , arr[i-1]); return distance; } function update(e:Event):void { //Эта функция будет вызываться каждый кадр if(position > distance) return; var distanceSum:Number = 0; for(var i:int = 1; i < points.length; i++) { var currDist = Point.distance(points[i], points[i-1]); if(distanceSum + currDist > position) //Мы нашли промежуток, в котором находимся { var pos:Point = Point.interpolate(points[i], points[i-1], (position - distanceSum)/currDist); quad.x = pos.x; // quad меняем на кастомную фигуру quad.y = pos.y; break; } distanceSum += currDist; } position += speed; }
__________________
There is no thing in this world that is not simple. |
|
|||||
Регистрация: Sep 2017
Сообщений: 21
|
ZackMercury, понятно.
Спасибо, что разъяснили. |
|
|||||
Понял, ща разъясню.
Math.random() возвращает случайное число от 0 до 1. Как мы знаем из математики, 0.999 * какое-то число - это 999 / 1000 часть этого числа, а 1 * какое-то число = само число. То же будет с 0.459, или с 0.790, все они при умножении будут давать какую-то часть числа. Это я к тому, что чтобы получить случайное число в диапазоне от 0 до какого-то числа, нужно умножить число от 0 до 1 на это самое число. Далее, на самом деле числа, получаемые случайным образом имеют много символов после точки: При умножении этого, скажем, на 100, чтобы получить случайное значение от 0 до 100, мы получим Чтобы получить целое число, его нужно округлить. Для этого используется функция Math.round. Вернёт случайное целое число от 0 до 100. Как же нам найти число в диапазоне? Никак, за вас это не написано. Мы просто прибавляем какое-то число к итоговому числу: Вернёт случайное число от 50 до 100. Как получить размер видимой области флеша, чтобы умножить ширину и высоту на случайное число от 0 до 1? Для этого используется stage.stageWidth, stage.stageHeight. вернёт случайную координату от 0 до ширины видимой области. вернёт случайную координату от 0 до высоты видимой области. Массивы. Массив в AS3 - это переменная, хранящая некоторый список каких-то объектов или значений. У нас в массиве будут храниться точки, по которым объект будет перемещаться. Объявляется массив так: Но мы ведь не знаем, какие именно точки мы будем туда добавлять и сколько их будет заранее! Пока что оставим его пустым. Из всех методов массива нас интересует тот, которым позволяет добавить в конец массива некоторое значение. В нашем случае, мы будем добавлять экземпляр класса "точка" - Point. Этот метод называется push, и аргументом он принимает то, что необходимо добавить в его конец. Отлично, теперь мы можем добавить в конец массива точку со случайными координатами: points.push(new Point(Math.random() * stage.stageWidth, Math.random() * stage.stageHeight)); Давайте определим минимум и максимум точек в массиве: Мы знаем, что чтобы минимальное число было 5, нужно прибавить его к результату умножения, а также то, что диапазон будет max-min, в нашем случае 10-5, т.е. 5. В итоге мы получим выражение 5 + случайное число от 0 до 5. Теперь в цикле добавим новую точку в массив numPoints раз
__________________
There is no thing in this world that is not simple. |
|
|||||
Регистрация: Sep 2017
Сообщений: 21
|
ZackMercury, а сейчас - еще более понятнее стало.
Спасибо за ответ. |
Часовой пояс GMT +4, время: 12:17. |
|
« Предыдущая тема | Следующая тема » |
|
|