Ежик
offline
Опыт:
2,536Активность: |
2 вопроса \\Jass
Хочу узнать как делать 2 функции. А нужно их соеденить. В общем при моём событии надо выбрать всех юнитов(врагов) в радиусе 99999 (вся карта) от моего юнита(u) и добавить в локальный отряд(g). Потом выявить самого ближнего юнита в группе от (u) и обратится к этому выбранному юниту. |
26.10.2010, 18:17 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Klop
Папа римский
offline
Опыт:
13,006Активность: |
Ежик,
в функции отряда проверяй дистанцию между Пикнутым и твоим юнитом и заноси их в массив,затем проверяй на самую маленькую дистанцию цикл - Кол-во пикнутых юнитов-1 if Mas[i] > Mas[i+1] then Min = Mas[i] else Mas[i+1] я смогу сделать пример,но только вечером,щас у меня нет времени ты пользуешся JNGP? Вообще вместо массива лучше думаю использовать Hashtable,но тогда обязательно в конце его надо будет очищать |
26.10.2010, 19:49 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ManWhoKnows
just another wc3 modmaker
offline
Опыт:
915Активность: |
самый простой и ресурсоёмкий метод - решать перебором всех врагов через цикл, и сравнивать их расстояния до u. можно использовать, если функция вызывается редко. в ином же случае - это будет жутко неудобно и лагово. найти оптимальное решение задачи гораздо проще если знать её контекст. может быть в твоём случае подойдёт организация движка, который будет следить за всем юнитами на карте, может быть можно решить с помощью триггеров. так что ты расскажи поподробней. p.s. если чтото придёт в голову, обязательно напишу. |
26.10.2010, 19:54 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Master_chan
Полуночный командир
offline
Опыт:
15,660Активность: |
Mr_KLOP:
нет не лучше Отредактировано Master_chan, 26.10.2010 в 20:17. |
26.10.2010, 19:57 | #4
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ManWhoKnows
just another wc3 modmaker
offline
Опыт:
915Активность: |
и вообще, как я сказал выше, это плохой метод, если врагов будет много функция вернёт тебе не ближайшего врага а supremeLAG
и если уж на то пошло, и очень хочется сделать перебор, ни массив, ни тем более, хэштаблица вообще не нужны. Отредактировано ManWhoKnows, 26.10.2010 в 21:18. |
26.10.2010, 19:59 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Ежик
offline
Опыт:
2,536Активность: |
Mr_KLOP, Был бы благодарен. Подожду конечно) JNPG есть. Мне что нужно,используется спелл и выбирается ближайший юнит, и приминяющий юнит бежит к этому юниту.Может есть возможность зделать легче? |
26.10.2010, 20:03 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
spellwerk
offline
Опыт:
4,869Активность: |
а если последовательно выбирать войнов на расстоянии 100, потом 200, 300 и так пока не найдешь
|
26.10.2010, 20:45 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ManWhoKnows
just another wc3 modmaker
offline
Опыт:
915Активность: |
Чтобы не насоветовали ещё чего, вот:
((код jass
#include "cj_types_priv.j"
globals boolexpr enemy_filter player filter_player endglobals boolean enemy_filter_c () {
if IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()),filter_player) {return true} return false } unit NearEnemy(unit u) {
group g = CreateGroup() unit n real dist,r,d,x1,y1 if enemy_filter == null {enemy_filter = Condition(function enemy_filter_c)} filter_player = GetOwningPlayer(u) GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,enemy_filter) n = FirstOfGroup(g) if n == null {return null} x1 = GetUnitX(u) y1 = GetUnitY(u) d = x1 - GetUnitX(n) r = y1 - GetUnitY(n) dist = SquareRoot(d * d + r * r) u = n GroupRemoveUnit(g,n) loop { n = FirstOfGroup(g) exitwhen n == null d = x1 - GetUnitX(n) r = y1 - GetUnitY(n) r = SquareRoot(d * d + r * r) if r < dist { dist = r u = n } GroupRemoveUnit(g,n) } DestroyGroup(g) g = null return u } )) в итоге ты получаешь функцию NearEnemy(unit u) которая возвратит ближайшего врага юнита u |
26.10.2010, 20:58 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Ежик
offline
Опыт:
2,536Активность: |
~ManWhoKnows,
Спасибо тебе. Но чтото я не совсем пойму работу кода. Немог ты скинуть это всё в карту? У меня ошибки( в JNPG. А если зделаеш так,то буду очень блогодарен. Цитата:
|
|
26.10.2010, 21:12 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ManWhoKnows
just another wc3 modmaker
offline
Опыт:
915Активность: |
это сиджасс cjass.xgm.ru/files/?cJassSetup.exe
скачай, установи в папку JNPG и юзай. (ты точно также можешь писать и на обычном синтаксисе)
кстати, можно заюзать идею с последовательным выбором юнитов на расстоянии, (например 1000, 5000, 10000, вся карта) это ускорит. |
26.10.2010, 21:17 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Ежик
offline
Опыт:
2,536Активность: |
Цитата:
Мм. Напиши плиз как должен работать эти функции. Циклом? Или как? |
|
26.10.2010, 21:37 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ManWhoKnows
just another wc3 modmaker
offline
Опыт:
915Активность: |
на основе того что я дал выше, внутрь надо сунуть ещё один цикл. и вместо GroupEnumUnitsInRect
использовать GroupEnumUnitsInRange значение рэндж брать 1000 и прибавлять, скажем, по 4000 каждый цикл, выйдти из цикла когда рэндж будет больше 9000 ^^ и использовать уже оригинальную проверку из той функции что я писал. но минус такого подхода в том, что чем дальше будет враг, тем медленней будет исполнятся функция. Отредактировано ManWhoKnows, 26.10.2010 в 22:30. |
26.10.2010, 21:44 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Klop
Папа римский
offline
Опыт:
13,006Активность: |
ManWhoKnows, твой метод плох человек не сильно разберается в Jass,от того что ты дал код,он не понимает что там как происходит,он не сможет его использовать так как ему надо,я же свой метод взял на понимании как на простейшом уроке программирования определить минимальное значения массива
т.е сравнить каждый элемент массива и в переменную min его записывать,нечего про быстроту неговорил а только про самый простой способ это реализовать и понимать |
26.10.2010, 23:43 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ManWhoKnows
just another wc3 modmaker
offline
Опыт:
915Активность: |
Mr_KLOP, слушай, ты чо вмазался? парой постов выше твои сообщения были понятны, а теперь какой-то поток слов, я вообще не понимаю о чём ты говоришь. |
27.10.2010, 00:24 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Klop
Папа римский
offline
Опыт:
13,006Активность: |
ManWhoKnows, ладно забей,я знаю что я карявый мастер джазза и у меня свои логика построения кода я вышлю пример,а автор пусть посмотри что ему лучше быстрота или моё не быстрое
По поводу примера 1. При использовании спелла Удар грома,пикаются все вражеские живие юниты записывается каждый пикнутый юнит в массив Thunder_U с индексом [Thunder_I] который увеличивается на единицу при каждом пике,т.е создался массив пикнутых юнитов 2.Присваиваем переменной min значение первого пикнутого юнита(Thunder_U[1]) 3.В карте нестандартный код сделал функцию расчёта дистанции свою без локаций » Функция Distance Код:
4. Запускаю цикл до переменной Thunder_I и проверяю дистанцию юнита min с Thunder_U[i],если дистанция min больше Thunder_U[i],тогда присваиваем min значение Thunder_U[i] 5.После окончания цикла выполняем нужные дейсвия с юнитом min,у меня он Удаляется с карты и вылазит сообщение растояния 6.Обнуляю массив и остальные переменные Работает долговато,но работает,незнаю если вариант не устраивает ,то хорошо ненадо мне описывать,что он геморойный и не стоит его осуждать,меня это бесит,читаем мой статус Вроде всё,спасибо за внимание » Вот мой код Код:
|
27.10.2010, 00:45 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|