XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Anufis

offline
Опыт: 6,290
Активность:
Проверка проходимости и ее ускорение
Попробовал поглядеть в поиске, но ничего толкового как-то не нашел.
На карте клиффов нет и проходимость может быть загорожена только дестрактаблами или юнитами-зданиями. Проходимость проверяю так
Код:
private item CheckItem
private boolexpr CheckPath_be
private rect CheckPath_R=Rect(-32.,-32.,32.,32.)

boolean CheckPath_f() {
  if GetItemTypeId(GetFilterItem())!='ckng' then
    TempBoolean=true
  endif
  return false
}

boolean CheckPath(real x,real y) {
  real difx
  real dify
  SetItemPosition(CheckItem,x,y)
  difx=GetWidgetX(CheckItem)-x
  dify=GetWidgetY(CheckItem)-y
  if difx>=-2. and difx<=2. and dify>=-2. and dify<=2. then
    return true
  endif
  MoveRectTo(CheckPath_R,x,y)
  TempBoolean=false
  EnumItemsInRect(CheckPath_R,CheckPath_be,null)
  return TempBoolean
}


Можно ли как-то оптимизировать и имеет ли смысл?
Старый 28.08.2013, 19:33
DioD

offline
Опыт: 45,134
Активность:
конечная цель проверки?
Старый 28.08.2013, 20:25
Anufis

offline
Опыт: 6,290
Активность:
1. При полете снарядов проверка на столкновение с препятствием, чтобы он исчез
2. для искуственного интеллекта рдд-моба, чтобы он не стрелял в стену(снарядами, которые ломаются об препятствия)
3. для скиллов, которые нельзя применять сквозь препятствия и нахождения конечной точки вот таким вот кодом
Код:
location CheckPath2 (real x1,real y1,real x2,real y2) {
  real angle=abp(x1,y1,x2,y2)
  real v1=50.*CosBJ(angle)
  real v2=50.*SinBJ(angle)
  integer n=R2I(Distance(x1,y1,x2,y2)/50.)
  loop
    if not CheckPath(x1+v1,y1+v2) then
      return Location(x1,y1)
    endif
    set n=n-1
    exitwhen n<0
    set x1=x1+v1
    set y1=y1+v2
  endloop
  return Location(x1,y1)
}

boolean CheckPath3 (real x1,real y1,real x2,real y2) {
  real angle=abp(x1,y1,x2,y2)
  real v1=50.*CosBJ(angle)
  real v2=50.*SinBJ(angle)
  integer n=R2I(Distance(x1,y1,x2,y2)/50.)
  loop
    if not CheckPath(x1+v1,y1+v2) then
      return false
    endif
    set n=n-1
    exitwhen n<0
    set x1=x1+v1
    set y1=y1+v2
  endloop
  return true
}
Старый 28.08.2013, 20:40
Bornikkeny
Silenced by Bornikkeny
offline
Опыт: 24,410
Активность:
А есть вариант на vjass?
Старый 28.08.2013, 21:30
J64_

offline
Опыт: 4,724
Активность:
#define
{
	private STEP = 50.
	private STEP_HALF = 25.
	private ITEM_ID = 'ckng'
}

private item CheckItem
private rect CheckPath_R = Rect(-STEP_HALF, -STEP_HALF, STEP_HALF, STEP_HALF)
private real CheckPath2_X
private real CheckPath2_Y

boolean CheckPath_f()
{
	if GetItemTypeId(GetFilterItem()) != ITEM_ID)
	{
		TempBoolean = true
	}
	return false
}

boolean CheckPath(real x, real y)
{
	real difx
	real dify
	SetItemPosition(CheckItem, x, y)
	difx = GetWidgetX(CheckItem) - x
	dify = GetWidgetY(CheckItem) - y
	if ((difx >= -2.) && (difx <= 2.) && (dify >= -2.) && (dify <= 2.))
	{
		return true
	}
	MoveRectTo(CheckPath_R, x, y)
	TempBoolean = false
	EnumItemsInRect(CheckPath_R, FilterFunc(function CheckPath_f), null)
	return TempBoolean
}

boolean CheckPath2Ex(real dx, real dy)
{
	real l = SquareRoot(dx * dx + dy * dy)
	integer n = R2I(l / STEP)
	dx = dx / l * STEP
	dy = dy / l * STEP
	loop
	{
		if (!CheckPath(CheckPath2_X, CheckPath2_Y))
		{
			return false
		}
		CheckPath2_X += dx
		CheckPath2_Y += dy
		n--
		exitwhen (n < 0)
	}
	return true
}
boolean CheckPath2 (real x1, real y1, real x2, real y2) 
{
	CheckPath2_X = x1
	CheckPath2_Y = y1
	return CheckPath2Ex(x2 - x1, y2 - y1)
}
Старый 29.08.2013, 17:46
DioD

offline
Опыт: 45,134
Активность:
не ясно зачем регион, ведь можно получить координаты предмета напрямую...
Старый 29.08.2013, 18:10
Anufis

offline
Опыт: 6,290
Активность:
Цитата:
Сообщение от DioD
не ясно зачем регион, ведь можно получить координаты предмета напрямую...

Так как если где-то лежат предметы, и при проверке координат проверочный итем смещается и функция возращает результат, что проходимости нет, хотя на самом деле там просто лежат рандомные итемы.
Старый 29.08.2013, 19:38
Melissa
Я всегда хочу как лучше!
offline
Опыт: 31,696
Активность:
Можно создавать наземный юнит в испытываемой точке и проверять дистанцию от позиции юнита до этой точки.
Если далеко - точка не проходима
Старый 30.08.2013, 01:00
Bornikkeny
Silenced by Bornikkeny
offline
Опыт: 24,410
Активность:
NatureKid, тоже вариант, и по моему даже лучший вариант :-)
Старый 30.08.2013, 01:48
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



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