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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.07.2011, 12:43
Scorp2008 вне форума Посмотреть профиль Отправить личное сообщение для Scorp2008 Найти все сообщения от Scorp2008
  № 1  
Ответить с цитированием
Scorp2008
[+1 13.07.11]
[++1 13.07.11]

Регистрация: Dec 2009
Сообщений: 42
По умолчанию Пересечение линии и квадрата (для игры)

Всем привет еще раз
Вот раздобыл функцию пересечения линии и квадрата, собираюсь использовать я их для определения столкновения пули и врага в игре. До этого делал не совсем такие игры, а так как с математикой туго, то прошу совета, вот сама функция:
Код AS3:
		public static function InterLineSqr(p1, p2, p3, r) {
			var res = [];
			var x1 = p3.x-r;
			var x2 = p3.x+r;
			var y1 = p3.y-r;
			var y2 = p3.y+r;
			var dx = p1.x-p2.x;
			var dy = p1.y-p2.y;
			var dd = dx*dx+dy*dy;
			//
			//if ((p1.x>x1 && p1.x<x2) || (p2.x>x1 && p2.x<x2) || (p1.x<x1 && p2.x>x2) || (p2.x<x1 && p1.x>x2) || (p1.y>y1 && p1.y<y2) || (p2.y>y1 && p2.y<y2) || (p1.y<x1 && p2.y>y2) || (p2.y<x1 && p1.y>y2)) {
			//if ((p1.y>y1 && p1.y<y2) || (p2.y>y1 && p2.y<y2) || (p1.y<x1 && p2.y>y2) || (p2.y<x1 && p1.y>y2)) {
			var inter;
			inter = InterLineLine(p1, p2, {x:x1, y:y1}, {x:x1, y:y2});
			if (!(inter<0)) {
				res.push(inter);
			}
			inter = InterLineLine(p1, p2, {x:x1, y:y1}, {x:x2, y:y1});
			if (!(inter<0)) {
				res.push(inter);
			}
			inter = InterLineLine(p1, p2, {x:x2, y:y2}, {x:x2, y:y1});
			if (!(inter<0)) {
				res.push(inter);
			}
			inter = InterLineLine(p1, p2, {x:x2, y:y2}, {x:x1, y:y2});
			if (!(inter<0)) {
				res.push(inter);
			}
			//}   
			//}
			return res;
		}
насколько я понимаю p1 и p2 - это начало и конец линии (точки), а что такое p3 и r? И как её использовать если можно подробнее? Допустим имеется массив с врагами vragi и герой который стреляет, как я понимаю после нажатия кнопки мыши должны определяться точки линии (пуля типа) и проверяться со всем массивом не пересеклась ли линия с квадратом.. но вот как это в коде выглядит не совсем представляю. спасибо

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

Регистрация: Mar 2009
Сообщений: 207
Во-первых, тут используется функция InterLineLine(...), которой нет.
Во-вторых, данные о самом квадрате должны же куда то передаваться?
Вот где то они в параметрах запрятаны, видимо.
А где вы ее без описания взяли функцию эту?

Старый 10.07.2011, 12:59
Scorp2008 вне форума Посмотреть профиль Отправить личное сообщение для Scorp2008 Найти все сообщения от Scorp2008
  № 3  
Ответить с цитированием
Scorp2008
[+1 13.07.11]
[++1 13.07.11]

Регистрация: Dec 2009
Сообщений: 42
Функция та есть, вон она:

Код AS3:
		public static function InterLineLine(p1, p2, p3, p4) {
			var distAB, theCos, theSin, newX, ABpos;
			var NO = -1;
			//  Fail if either line segment is zero-length.
			var Ax, Ay, Bx, By, Cx, Cy, Dx, Dy;
			Ax = p1.x;
			Ay = p1.y;
			Bx = p2.x;
			By = p2.y;
			Cx = p3.x;
			Cy = p3.y;
			Dx = p4.x;
			Dy = p4.y;
			//  Fail if either line segment is zero-length.
			if (Ax == Bx && Ay == By || Cx == Dx && Cy == Dy) {
				return -1;
			}
			//  Fail if the segments share an end-point.                  
			if (Ax == Cx && Ay == Cy || Bx == Cx && By == Cy || Ax == Dx && Ay == Dy || Bx == Dx && By == Dy) {
				return -2;
			}
			//  (1) Translate the system so that point A is on the origin.                  
			Bx -= Ax;
			By -= Ay;
			Cx -= Ax;
			Cy -= Ay;
			Dx -= Ax;
			Dy -= Ay;
			//  Discover the length of segment A-B.
			distAB = Math.sqrt(Bx*Bx+By*By);
			//  (2) Rotate the system so that point B is on the positive X axis.
			theCos = Bx/distAB;
			theSin = By/distAB;
			newX = Cx*theCos+Cy*theSin;
			Cy = Cy*theCos-Cx*theSin;
			Cx = newX;
			newX = Dx*theCos+Dy*theSin;
			Dy = Dy*theCos-Dx*theSin;
			Dx = newX;
			//  Fail if segment C-D doesn't cross line A-B.
			if (Cy<0 && Dy<0 || Cy>=0 && Dy>=0) {
				return -3;
			}
			//  (3) Discover the position of the intersection point along line A-B.                  
			ABpos = Dx+(Cx-Dx)*Dy/(Dy-Cy);
			//  Fail if segment C-D crosses line A-B outside of segment A-B.
			if (ABpos<0 || ABpos>distAB) {
				return -4;
			}
			//  (4) Apply the discovered position to line A-B in the original coordinate system.                  
			var oX = Ax+ABpos*theCos;
			var oY = Ay+ABpos*theSin;
			//  Success.
			return {x:oX, y:oY};
		}
А вот насчёт остального я полный нуб, не знаю как использовать совсем А функции эти мне передал знакомый, который использовал эти функции с своих играх, но он мне помочь не может занят весь, еле выпросил сами функции.

Старый 10.07.2011, 13:23
Zik. вне форума Посмотреть профиль Отправить личное сообщение для Zik. Найти все сообщения от Zik.
  № 4  
Ответить с цитированием
Zik.
 
Аватар для Zik.

Регистрация: Nov 2007
Сообщений: 1,723
А зачем вам пересечение линии именно с квадратом? По-моему с кругом будет легче в плане реализации.

P.S: Actionscript 3.0 Collision

Старый 10.07.2011, 13:36
Scorp2008 вне форума Посмотреть профиль Отправить личное сообщение для Scorp2008 Найти все сообщения от Scorp2008
  № 5  
Ответить с цитированием
Scorp2008
[+1 13.07.11]
[++1 13.07.11]

Регистрация: Dec 2009
Сообщений: 42
Не знаю, так подсказали делать. Вот функция какая-то с кругом, но я не уверен с линией ли это пересечение, подскажите плиз:

Код AS3:
		public static function InterRayCir(p1, p2, sc, sc_r) {
			var EPS = 0.00000001;
			var dp = {};
			//
			dp.x = p2.x-p1.x;
			dp.y = p2.y-p1.y;
			var a = dp.x*dp.x+dp.y*dp.y;
			if (Math.abs(a)<EPS) {
				return [];
			}
			var b = 2*(dp.x*(p1.x-sc.x)+dp.y*(p1.y-sc.y));
			var c = sc.x*sc.x+sc.y*sc.y;
			c += p1.x*p1.x+p1.y*p1.y;
			c -= 2*(sc.x*p1.x+sc.y*p1.y);
			c -= sc_r*sc_r;
			var bb4ac = b*b-4*a*c;
			if (bb4ac<0) {
				return [];
			} else {
				var mu1 = (-b+Math.sqrt(bb4ac))/(2*a);
				var mu2 = (-b-Math.sqrt(bb4ac))/(2*a);
				//p = p1 + mu1 (p2 - p1)
				var r1 = {};
				r1.x = p1.x+mu1*(p2.x-p1.x);
				r1.y = p1.y+mu1*(p2.y-p1.y);
				if (mu1 === mu2) {
					return [r1];
				} else {
					var r2 = {};
					r2.x = p1.x+mu2*(p2.x-p1.x);
					r2.y = p1.y+mu2*(p2.y-p1.y);
					return [r1, r2];
				}
			}
		}
Ну и само собой вопрос о том как это использовать остается открытым Есть массив врагов, есть точки линии выстрела, а дальше то как, не соображаю ничерта

ps, вроде то что выше это луч с кругом. А как тогда линия с кругом.. но самое то главное как это все использовать может кто-нибудь подсказать


Последний раз редактировалось Scorp2008; 10.07.2011 в 13:44.
Старый 10.07.2011, 13:44
Zik. вне форума Посмотреть профиль Отправить личное сообщение для Zik. Найти все сообщения от Zik.
  № 6  
Ответить с цитированием
Zik.
 
Аватар для Zik.

Регистрация: Nov 2007
Сообщений: 1,723
Цитата:
Сообщение от Scorp2008 Посмотреть сообщение
Есть массив врагов, есть точки линии выстрела, а дальше то как, не соображаю ничерта
Если в качестве оружия пуля, а не линия, то можешь использовать обычный #hitTestPoint()

Старый 10.07.2011, 13:59
Scorp2008 вне форума Посмотреть профиль Отправить личное сообщение для Scorp2008 Найти все сообщения от Scorp2008
  № 7  
Ответить с цитированием
Scorp2008
[+1 13.07.11]
[++1 13.07.11]

Регистрация: Dec 2009
Сообщений: 42
оружие предполагается разное, в том числе и лазер например, а пуль там не будет вообще, ну т.е. например вы в Crimsoland играли? Видели как там все пули сделаны? Линиями (пистолет, автомат, дробовик - все на линиях держится). Это намного круче чем хиттестовые пульки, к тому же врагов будет немало, а хиттест жрет ресурсов. Вобщем мне нужна помощь именно по теме.

Старый 10.07.2011, 14:04
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 8  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Код AS3:
InterLineSqr(p1, p2, p3, r)
p1 - первая точка отрезка
p2 - вторая точка отрезка
p3 - центр квадрата
r - половина ширины квадрата, то бишь "радиус" квадрата.

Вернет, вроде как, массив точек пересечений (0 или 2, по идее).

Старый 10.07.2011, 14:05
Zik. вне форума Посмотреть профиль Отправить личное сообщение для Zik. Найти все сообщения от Zik.
  № 9  
Ответить с цитированием
Zik.
 
Аватар для Zik.

Регистрация: Nov 2007
Сообщений: 1,723
Цитата:
Сообщение от Scorp2008 Посмотреть сообщение
Видели как там все пули сделаны? Линиями
Пули сделаны так же точками, просто со шлейфом.
Цитата:
Сообщение от Scorp2008 Посмотреть сообщение
к тому же врагов будет немало, а хиттест жрет ресурсов
Если делать проверку на столкновение лишь с теми объектами, которые находятся в определённом секторе, то кол-во объектов не будет вас волновать.

Старый 10.07.2011, 14:09
Scorp2008 вне форума Посмотреть профиль Отправить личное сообщение для Scorp2008 Найти все сообщения от Scorp2008
  № 10  
Ответить с цитированием
Scorp2008
[+1 13.07.11]
[++1 13.07.11]

Регистрация: Dec 2009
Сообщений: 42
ZIK68 но я хочу чтобы некоторое оружие поражало цель мгновенно, а если делать пули с такой скоростью и проверять их хиттестом то мне думается некоторые будут тупо пролетать из-за высокой скорости. Про определенный сектор тоже не ясно, но пока это не рассматривается в виду того что я написал выше про скорости.

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

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

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


 


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


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