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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 19.05.2008, 22:45
Vertax вне форума Посмотреть профиль Отправить личное сообщение для Vertax Найти все сообщения от Vertax
  № 8  
Ответить с цитированием
Vertax

Регистрация: Oct 2005
Сообщений: 207
Код:
//Пригодится
ANGLE2D = function (X1, Y1, X2, Y2){return 180 * Math.atan2((X2 - X1), (Y2 - Y1)) / Math.PI;}
LEN2D = function (X1, Y1, X2, Y2){return Math.sqrt(Math.pow(X1 - X2, 2) + Math.pow(Y1 - Y2, 2));}
COS = function (ANGLE) {return Math.cos(ANGLE * Math.PI / 180);}
SIN = function (ANGLE) {return Math.sin(ANGLE * Math.PI / 180);}

Object.prototype.copy = function ()
{
	var nOBJ = {};
	for (var i in this) nOBJ[i] = this[i];
	return nOBJ;
}

//Делаем вектор
vector = function (X, Y, DX, DY)
{
	var OBJ = {};
	OBJ.x = X;
	OBJ.y = Y;
	OBJ.dx = DX;
	OBJ.dy = DY;
	OBJ.speed = Math.sqrt(DX * DX + DY * DY);
	return OBJ;
}

var B1 = vector(100, 100, 5, 0); //Цель
var B2 = vector(400, 400, 40, 0); //Стрелок

SIMULATE = function (LVL, LEN)
{
	if (LVL > 100) return false; //Если более 100 шагов, то болт
	BTEMP1.x += BTEMP1.dx;
	BTEMP1.y += BTEMP1.dy;
	bANGLE = 90-ANGLE2D(BTEMP2.x, BTEMP2.y, BTEMP1.x, BTEMP1.y);
	currLEN = LEN2D(BTEMP1.x, BTEMP1.y, BTEMP2.x, BTEMP2.y);
	if (currLEN < BTEMP2.speed) return {len:LEN, lvl: LVL}; //Если растояние до цели меньше шага, то попали
        //Если нужно более точно, то {len:LEN + currLEN
	BTEMP2.x += COS(bANGLE) * BTEMP2.speed;
	BTEMP2.y += SIN(bANGLE) * BTEMP2.speed;
	return SIMULATE(LVL + 1, LEN + BTEMP2.speed);
}

//Создаю временные копии
var BTEMP1 = B1.copy();
var BTEMP2 = B2.copy();

if (T = SIMULATE(0, 0)) //Это не опечатка
{
	COOF = LEN2D(B2.x, B2.y, BTEMP1.x, BTEMP1.y) / T.len;
	
	//Искомые точки
	TC = {};
	TC.x = (BTEMP1.x - B1.x) * COOF + B1.x;
	TC.y = (BTEMP1.y - B1.y) * COOF + B1.y;
	
	//Для примера
	_root.lineStyle(1, 0xFF0000);
	_root.moveTo(B1.x, B1.y);
	_root.lineTo(TC.x, TC.y);
	_root.lineStyle(1, 0x0000FF);
	_root.moveTo(B2.x, B2.y);
	_root.lineTo(TC.x, TC.y);
}
Думаю разберешся.

P.S. Поэксперементировал... ну флеш над дробями и издевается. В примере красный шар должен летать четко по зеленой линии.
Вложения
Тип файла: zip test4.zip (5.8 Кб, 83 просмотров)


Последний раз редактировалось Vertax; 20.05.2008 в 01:48.
Создать новую тему   Часовой пояс GMT +4, время: 03:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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