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

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

Закрытая тема
 
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Как найти всех юнитов между 2-мя точками
Я столкнулся с одной проблемой, вобщем мне нужно найти всех юнитов между 2-мя точками, чтобы потом добавить их в группу...
Я знаю, есть функция:
Код:
function RectFromCenterSizeBJ takes location center, real width, real height returns rect
    local real x = GetLocationX(center)
    local real y = GetLocationY(center)
    return Rect(x - width*0.5, y - height*0.5, x + width*0.5, y + height*0.5)
endfunction

С ее помощью можно построить rect, с центром в указанной точке(в данном случае, центр между 2-мя локациями), с указанием ширины и высоты, но это подойдет только в том случае, если эти 2 точки находятся на прямой линии, относительно одной из осей(X,Y), а если же они будут находиться по диагонали, построиться всеравно квадратный rect, но не таких размеров, как мне нужно. Также не получается использовать таймер с функцией периодического движения от точки 1 до точки 2...Вар вылетает после нескольких таких выполнений функции, т.к. периодичность функции 0.05 сек. + одновременно могут двигаться не один снаряд, а много + инфа храниться в кэше, приаттачена к таймеру...
В общем такой способ не подходит.

Кто-нибудь знает другой?
Старый 25.08.2007, 13:03
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
:D
двигаешь точку к другой точке и создаешь еще rect и добавляешь их в регион
Старый 25.08.2007, 13:06
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Цитата:
Сообщение от df Hunter
:D
двигаешь точку к другой точке и создаешь еще rect и добавляешь их в регион

В смысле двигаешь точку? Действием MoveLocation? Создаешь рект? Я же сказал, что если эти 2 точки будут по-диагонали, рект создастся большой, а мне нужно включить воинов в отряд, которые между 2-мя точками...чтобы было по-понятней представь линию, проведенную от одной точки к другой, воины должны быть включены в отряд только в том случае, если они на ОПРЕДЕЛЕННОМ расстоянии от линии(150)...а если создать rect и из этого ректа впихнуть всех в отряд, туда добавятся не только те, которые на 150 от этой линии, т.к. рект квадратный
Старый 25.08.2007, 13:41
dk

offline
Опыт: 60,293
Активность:
Ректы моно обьединять в регионы, прощитай расстояние между точками подели на 75 и создай столько ректов по диагонали, после чего обьедени...
Код:
native RegionAddRect            takes region whichRegion, rect r returns nothing
native RegionClearRect          takes region whichRegion, rect r returns nothing
Старый 25.08.2007, 14:07
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Цитата:
Сообщение от Dead_knight
Ректы моно обьединять в регионы, прощитай расстояние между точками подели на 75 и создай столько ректов по диагонали, после чего обьедени...
Код:
native RegionAddRect            takes region whichRegion, rect r returns nothing
native RegionClearRect          takes region whichRegion, rect r returns nothing

я это и написал )
Старый 25.08.2007, 14:27
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Расстояние между точками = 1000...значит нужно создать 1000/75 = 13.3333 ректов, а потом объединить их в один регион? Да, много че-то их будет...ну попробую...
Стоп, а как мне создать эти ректы по диагонали?

Отредактировано Alex_Hell, 25.08.2007 в 15:42.
Старый 25.08.2007, 15:37
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
сделай 100 ректов, число можно подобрать :):
Старый 25.08.2007, 15:39
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Цитата:
Сообщение от df Hunter
сделай 100 ректов, число можно подобрать

Если делать много ректов будут лаги, легче создать снаряд, движущийся от точки p до точки p2 каждые 0.05 сек. + добавляющий в группу новых юнитов, которые в радиусе 150 от него, НО так не получается...я об этом уже писал...а таким способом очень муторно
Старый 25.08.2007, 15:44
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Цитата:
Сообщение от Alex_Hell
Если делать много ректов будут лаги, легче создать снаряд, движущийся от точки p до точки p2 каждые 0.05 сек. + добавляющий в группу новых юнитов, которые в радиусе 150 от него, НО так не получается...я об этом уже писал...а таким способом очень муторно

кстати тоже вариант,а что у тебя не получается? этот даже лучше так как он точное расстояние добавляет,а там квадратами оно неточное, кстати 0.05 это много, лучше 0.04 или меньше, 0.05 возможно конечно, но это уже для совсем слабых машин
Старый 25.08.2007, 15:45
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Цитата:
Если делать много ректов будут лаги, легче создать снаряд, движущийся от точки p до точки p2 каждые 0.05 сек. + добавляющий в группу новых юнитов, которые в радиусе 150 от него, НО так не получается...я об этом уже писал...

Я всегда так делал. У мну всё всегда работало...
Старый 25.08.2007, 15:54
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Цитата:
Сообщение от df Hunter
кстати тоже вариант,а что у тебя не получается? этот даже лучше так как он точное расстояние добавляет,а там квадратами оно неточное, кстати 0.05 это много, лучше 0.04 или меньше, 0.05 возможно конечно, но это уже для совсем слабых машин

Я вообще-то знаю, что это лучше, если бы все работало норм, я бы не стал глупые способы искать, но ниче не получается...а не получается вот по чему:
У меня создается периодический таймер на 0.05 сек. К таймеру аттачатся локации p1, p2, снаряд и еще кое-что. При завершении таймера запускается функция. В ней создается локалка t = GetExpiredTimer(), а потом находятся все приаттаченные к таймеру данные. Потом снаряд двигается в сторону к локации p2. Этот таймер срабатывает каждые 0.05 сек., пока снаряд не достигнет локации p2...в общем около 1 сек. ,т.е. 20 раз в секунду срабатывает этот таймер...но проблема в том, что таких снарядов НЕ ОДИН, а несколько, значит и таймеров несколько, значит и записей в кэше много(для каждого таймера свои)...от этого создаются лаги, но в конечном счете Вар вообще вылетает с ошибкой!
Поэтому такой способ не получается реализовать, хотя снарядов не много(всего 4), а если будет больше...
Старый 25.08.2007, 15:55
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
хм... сделать тебе это что ли :)
и кстати кэш никогда не выбрасывал вар с фатал еррором на моей памяти,а вот в рб мог че-то не то ты сделать
Старый 25.08.2007, 16:06
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Цитата:
Сообщение от df Hunter
хм... сделать тебе это что ли :)

Делать я умею, уже делал!
Цитата:
и кстати кэш никогда не выбрасывал вар с фатал еррором на моей памяти,а вот в рб мог че-то не то ты сделать

Какраз это и был RB+Cache, называемый SCV...а как по-твоему я мог записать без RB в кэш юнита или локацию?
Старый 25.08.2007, 16:17
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
я и так знаю, что ты юзал, я говорю, что ты мог че-то там не так вернуть, бывает иногда :): и из-за этого фатал
Старый 25.08.2007, 16:43
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Цитата:
Сообщение от df Hunter
я и так знаю, что ты юзал, я говорю, что ты мог че-то там не так вернуть, бывает иногда и из-за этого фатал

С эти я обращаться умею(научился на собственном примере )...Возвращается все то, что нужно, иначе оно бы сразу вылетело с ошибкой, а так вылетает только после нескольких законченных таймеров(несколько снарядов уже долтели от p1 до p2), такчто это не из-за моей ошибки! Я даже после полного окончания таймера, после его уничтожения, стираю все записи в кеше под хендлом этого таймера, такчто это не из-за перегрузки кэша всякими ссылками...просто когда много этих снарядов летит(тут их 4, а после когда они долетят, запускаются следующие 4...после этого и вылазит ошибка), походу кэш забивается, но яж очищаю его, такчто не знаю из-за чего
Старый 25.08.2007, 17:40
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Кеш не может забиваться, ибо его запас ограничен памятью твоего винта.
Старый 25.08.2007, 18:22
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Цитата:
Сообщение от Alex_Hell
С эти я обращаться умею(научился на собственном примере )...Возвращается все то, что нужно, иначе оно бы сразу вылетело с ошибкой, а так вылетает только после нескольких законченных таймеров(несколько снарядов уже долтели от p1 до p2), такчто это не из-за моей ошибки! Я даже после полного окончания таймера, после его уничтожения, стираю все записи в кеше под хендлом этого таймера, такчто это не из-за перегрузки кэша всякими ссылками...просто когда много этих снарядов летит(тут их 4, а после когда они долетят, запускаются следующие 4...после этого и вылазит ошибка), походу кэш забивается, но яж очищаю его, такчто не знаю из-за чего

хехе, наверно дело не в таймерах,а в триггерах :), ты наверно убираешь триггер когда он выполняется,а потом еще пытаешься с ним что-то сделать (не помню точно как этот краш получается, но сейчас найду как )
Старый 25.08.2007, 18:30
J
expert
offline
Опыт: 48,447
Активность:
Я не проверял код ни на ошибки ни на правельность...
Код:
function DistanceBetweenCord takes real AX, real AY, real BX, real BY returns real
    local real dx = BX - AX
    local real dy = BY - AY
    return SquareRoot(dx * dx + dy * dy)
endfunction

function AngleBetweenCord takes real AX, real AY, real BX, real BY returns real
    return bj_RADTODEG * Atan2(BY - AY, BX - AX)
endfunction

function UnitAddGroupOnLine takes group gr2, real X1, real Y1, real X2, real Y2, real Size returns group
    local integer Count = R2I(DistanceBetweenCord(X1, Y1, X2, Y2)/10+0.9)
    local real Angle = AngleBetweenCord   (X1, Y1, X2, Y2)*bj_DEGTORAD
    local group gr = CreateGroup()
    local unit u
    loop
        exitwhen Count < 0
        set X1 = X1 + 10*Cos(Angle)
        set Y1 = Y1 + 10*Sin(Angle)
        call GroupEnumUnitsInRange (gr, X1, Y1, Size, null)
        loop
            set u = FirstOfGroup(gr)
            exitwhen u == null
            call GroupAddUnit   (gr2, u)
            call GroupRemoveUnit(gr , u)
        endloop
        call GroupClear(gr)
        set Count = Count - 1
    endloop
    call DestroyGroup(gr)
    set gr = null
    return gr2
endfunction

Отредактировано Jon, 27.08.2007 в 18:20.
Старый 25.08.2007, 18:32
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Цитата:
Сообщение от df Hunter
хехе, наверно дело не в таймерах,а в триггерах :), ты наверно убираешь триггер когда он выполняется,а потом еще пытаешься с ним что-то сделать (не помню точно как этот краш получается, но сейчас найду как )

Нет... я делаю все на таймерах, а не на периодических тригах...никаких действий в коде типа: CreteTrigger() нету...а DestroyTrigger() темболее!

Alex_Hell добавил:
Цитата:
Сообщение от DFlyer
Кеш не может забиваться, ибо его запас ограничен памятью твоего винта.

Ну памяти у меня нормально

Alex_Hell добавил:
Jon, щас проверю код...

Alex_Hell добавил:
Jon, что указывать в качестве SIZE? (расстояние между точками = 1000, добавиться должны все на линии от p1 до p2, которые на расстоянии = 150 от этой линии)
Старый 26.08.2007, 12:38
J
expert
offline
Опыт: 48,447
Активность:
Alex_Hell size это на каком растоянии от линии будут включатся юниты в группу
Старый 26.08.2007, 14:30
Закрытая тема

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

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

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

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



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