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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.05.2008, 18:28
AleXNoD GD вне форума Посмотреть профиль Отправить личное сообщение для AleXNoD GD Посетить домашнюю страницу AleXNoD GD Найти все сообщения от AleXNoD GD
  № 1  
Ответить с цитированием
AleXNoD GD
 
Аватар для AleXNoD GD

Регистрация: Jan 2006
Адрес: Минск
Сообщений: 195
Отправить сообщение для AleXNoD GD с помощью ICQ
По умолчанию Стрельба по движущимся целям

День добрый, уважаемые флэшеры.

Давно хочу сделать ИИ, который будет стрелять по игроку, рассчитывая его траекторию, то есть туда, где он ДОЛЖЕН появиться, если не изменит скорость или направление. В баллистике это называется упреждением. У кого есть мысли, как всё это перенести на AS?

Скажем, есть два объекта (b1 и b2). Одна из них - пуля (b1), другая - цель (b2). b2 летит с произвольной скоростью в произвольном направлении. А задача b1 - определить, где будет находиться b2 в тот момент, когда s1/v1 = s2/v2 (s - пройденное расстояние, v - скорость, соответственно s/v - время, которое должно быть одинаковым). Для наглядности приведу рисунок.

__________________
Русские флеш игры

Старый 19.05.2008, 18:48
Vertax вне форума Посмотреть профиль Отправить личное сообщение для Vertax Найти все сообщения от Vertax
  № 2  
Ответить с цитированием
Vertax

Регистрация: Oct 2005
Сообщений: 207
Движение перса и движение пули - это по сути вектора. Сложи их (вектора или прирощения по осям) и получишь требуемую точку.

Старый 19.05.2008, 18:58
AleXNoD GD вне форума Посмотреть профиль Отправить личное сообщение для AleXNoD GD Посетить домашнюю страницу AleXNoD GD Найти все сообщения от AleXNoD GD
  № 3  
Ответить с цитированием
AleXNoD GD
 
Аватар для AleXNoD GD

Регистрация: Jan 2006
Адрес: Минск
Сообщений: 195
Отправить сообщение для AleXNoD GD с помощью ICQ
Для начала необходимо найти эти вектора) На рисунке конечный вариант, а изначально вектор (b1-ТС) неизвестен. Известны лишь скорости, местоположения объектов и направление b2.
__________________
Русские флеш игры

Старый 19.05.2008, 19:06
Vertax вне форума Посмотреть профиль Отправить личное сообщение для Vertax Найти все сообщения от Vertax
  № 4  
Ответить с цитированием
Vertax

Регистрация: Oct 2005
Сообщений: 207
A = Вектор стрельбы: b1-b2 (известен)
B = Вектор ходьбы: b2-TC легко найти зная скорость
C (требуемый) = A + B

Старый 19.05.2008, 19:27
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 5  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Хм.. Физика, 8 класс:
X Final = Current _X + Xmov*time;
Y Final = Current _Y + Ymov*time;

Старый 19.05.2008, 19:27
AleXNoD GD вне форума Посмотреть профиль Отправить личное сообщение для AleXNoD GD Посетить домашнюю страницу AleXNoD GD Найти все сообщения от AleXNoD GD
  № 6  
Ответить с цитированием
AleXNoD GD
 
Аватар для AleXNoD GD

Регистрация: Jan 2006
Адрес: Минск
Сообщений: 195
Отправить сообщение для AleXNoD GD с помощью ICQ
4:

Дык ТС неизвестна
Она дана чисто для примера, но её и надо вывести.
Для ясности:



Цитата:
Сообщение от Psycho Tiger
Хм.. Физика, 8 класс:
X Final = Current _X + Xmov*time;
Y Final = Current _Y + Ymov*time;
Не знаю, откуда эти формулы, но они явно не подходят. Тут без тригонометрии нельзя.
__________________
Русские флеш игры


Последний раз редактировалось iNils; 19.05.2008 в 20:16.
Старый 19.05.2008, 20:15
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 7  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Как движение задано?
Если я правильно понял, то дан угол движения и скорость этого движения, тогда:
Xmov=cos(angle)*speed;
Ymov=sin(angle)*speed;

Далее,
X Final = Current _X + Xmov*time;
Y Final = Current _Y + Ymov*time;

Откуда формулы? Сейчас в голове вывел
Обьясню:
Сначала находим скорость по оси Х, это будет xMov - далее, если скорость не измениться - то через time секунд он будет в текущей позиции плюс эта скорость по оси Х умноженная на время.
Аналогично и для _Y

Старый 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 Кб, 79 просмотров)


Последний раз редактировалось Vertax; 20.05.2008 в 01:48.
Старый 20.05.2008, 19:22
goarcade вне форума Посмотреть профиль Отправить личное сообщение для goarcade Найти все сообщения от goarcade
  № 9  
Ответить с цитированием
goarcade

Регистрация: Sep 2006
Сообщений: 32
Psycho Tiger
Vertax
В условии сказано же: -"Известны лишь скорости, местоположения объектов и направление b2."
направление b1 неизвестно!

AleXNoD GD

точка TC это b2+V2*t, где t неизвестное число, а V вектор скорости b2.

t находится из уравнения такого вида

length((b2+V2*t)-b1) = v1*t
где v1 величина скорости b1

должно получится квадратное уравнение. Решаем, получаем t, ну и находим TC = b2+V2*t


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

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

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


 


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


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