Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.09.2017, 17:00
odeon16 вне форума Посмотреть профиль Отправить личное сообщение для odeon16 Найти все сообщения от odeon16
  № 1  
Ответить с цитированием
odeon16

Регистрация: Sep 2017
Сообщений: 21
По умолчанию Случайные координаты движения автофигуры

Добрый день.
Помогите с решением.

Есть скрипт программно создающий и двигающий фигуру - по определенным координатам.
Но эти координаты жестко определены.

Как заставить координаты - определяться случайным образом (чтобы при каждом запуске файла - движение фигуры было непохоже на предыдущее) ?

Код AS3:
//Создаём квадрат
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;
}

Старый 29.09.2017, 17:40
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 2  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
А почему бы на сделать напрямую через добавление нового метода, куда на входе можно передавать нужное количество точек, а на выходе получать массив из случайно сгенерированных через math.random координат в нужном количестве? А потом из полученного таким образом массива "набивать" попарно координаты точек.

Старый 29.09.2017, 17:59
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 3  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Код AS3:
//Создаём квадрат
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.

Старый 29.09.2017, 20:00
odeon16 вне форума Посмотреть профиль Отправить личное сообщение для odeon16 Найти все сообщения от odeon16
  № 4  
Ответить с цитированием
odeon16

Регистрация: Sep 2017
Сообщений: 21
ZackMercury, понятно.
Спасибо, что разъяснили.

Старый 29.09.2017, 20:46
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 5  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Понял, ща разъясню.
Math.random() возвращает случайное число от 0 до 1. Как мы знаем из математики, 0.999 * какое-то число - это 999 / 1000 часть этого числа, а 1 * какое-то число = само число. То же будет с 0.459, или с 0.790, все они при умножении будут давать какую-то часть числа.
Это я к тому, что чтобы получить случайное число в диапазоне от 0 до какого-то числа, нужно умножить число от 0 до 1 на это самое число.
Далее, на самом деле числа, получаемые случайным образом имеют много символов после точки:
Код:
0.51246123...
При умножении этого, скажем, на 100, чтобы получить случайное значение от 0 до 100, мы получим
Код:
51.246123...
Чтобы получить целое число, его нужно округлить. Для этого используется функция Math.round.
Код AS3:
Math.round(Math.random()*100)
Вернёт случайное целое число от 0 до 100.

Как же нам найти число в диапазоне? Никак, за вас это не написано. Мы просто прибавляем какое-то число к итоговому числу:
Код AS3:
Math.round(Math.random()*50) + 50
Вернёт случайное число от 50 до 100.

Как получить размер видимой области флеша, чтобы умножить ширину и высоту на случайное число от 0 до 1?
Для этого используется stage.stageWidth, stage.stageHeight.
Код AS3:
stage.stageWidth * Math.random()
вернёт случайную координату от 0 до ширины видимой области.
Код AS3:
stage.stageHeight * Math.random()
вернёт случайную координату от 0 до высоты видимой области.

Массивы. Массив в AS3 - это переменная, хранящая некоторый список каких-то объектов или значений.
У нас в массиве будут храниться точки, по которым объект будет перемещаться.

Объявляется массив так:
Код AS3:
var arr:Array = [..., ..., ...];
Но мы ведь не знаем, какие именно точки мы будем туда добавлять и сколько их будет заранее!
Пока что оставим его пустым.
Из всех методов массива нас интересует тот, которым позволяет добавить в конец массива некоторое значение. В нашем случае, мы будем добавлять экземпляр класса "точка" - Point.
Этот метод называется push, и аргументом он принимает то, что необходимо добавить в его конец.

Отлично, теперь мы можем добавить в конец массива точку со случайными координатами:

Код AS3:
points.push(new Point(Math.random() * stage.stageWidth, Math.random() * stage.stageHeight));
Теперь подумаем, как можно было бы сделать это случайное количество раз?
Давайте определим минимум и максимум точек в массиве:

Код AS3:
var min:int = 5, max:int = 10; //Сколько точек будет - случайное число между 5 и 10.
Мы знаем, что чтобы минимальное число было 5, нужно прибавить его к результату умножения, а также то, что диапазон будет max-min, в нашем случае 10-5, т.е. 5. В итоге мы получим выражение 5 + случайное число от 0 до 5.
Код AS3:
var numPoints:int = min + Math.round((max - min) * Math.random());
Теперь в цикле добавим новую точку в массив numPoints раз
Код AS3:
for(var i:int = 0; i < numPoints; i ++) 
points.push(new Point(Math.random()*(stage.stageWidth - quad.width), Math.random()*(stage.stageHeight-quad.height)));
__________________
There is no thing in this world that is not simple.

Старый 30.09.2017, 00:26
odeon16 вне форума Посмотреть профиль Отправить личное сообщение для odeon16 Найти все сообщения от odeon16
  № 6  
Ответить с цитированием
odeon16

Регистрация: Sep 2017
Сообщений: 21
ZackMercury, а сейчас - еще более понятнее стало.
Спасибо за ответ.

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:57.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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