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

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

Ответ
 
ExArt

offline
Опыт: 13,634
Активность:
agentex SetUnitPosition проверяет не только границу карты, а pathing map. Это все юниты по пути, декорации, разница в клифах, вода. И проверяет она незвисимо от того есть у юнита Aloc или нет + ещё отменяет приказ у юнита. SetUnitX SetUnitY не проверяют все эти вещи, а тупо двигают юнита что снаряду и надо. И если он улетит за границу карты ничего не произойдёт.
Под созданием я имел в виду не выполнение триггера, а написание триггера.
Старый 09.01.2009, 12:44
agentex

offline
Опыт: 34,834
Активность:
ну да, кроме фатала ничего конешно
Старый 09.01.2009, 12:46
ExArt

offline
Опыт: 13,634
Активность:
Цитата:
Сообщение от agentex
ну да, кроме фатала ничего конешно


А вот с этим сделай пример плиз.
Старый 09.01.2009, 12:48
agentex

offline
Опыт: 34,834
Активность:
короче скоро выложу тут свой проект, там все на SetUnitPosition, и убедитесь что лагать ниче не будет даже при одновременной работе 20 таймеров
Старый 09.01.2009, 12:48
J
expert
offline
Опыт: 48,447
Активность:
ExArt если юнита выдвинуть через граниу карты SetUnitX/Y вар фаталит
Старый 09.01.2009, 12:51
ExArt

offline
Опыт: 13,634
Активность:
agentex Рад за тебя) Я просто хотел тебе сказать что SetUnitX/Y совсем не глючные функции, а очень даже хорошие + некоторые вещи без них сделать просто нельзя.

ExArt добавил:
J Я специально попробывал прежде чем писать что это не так. Сделайте пример с фаталом мне, мож я чёт не так делаю...

ExArt добавил:
Хех, я добился зависания. Но юнит далеко улетел, думаю где то на 5 - 10 тысяч рейнджа. Да и тригер с событием Юнит - покинул Playаble map arena решает проблему.
Старый 09.01.2009, 13:01
Dragon Knight
Меткий стрелок!!!
offline
Опыт: 4,138
Активность:
Код:
function MoveUnit takes unit u returns nothing
    local integer i = 1
    loop
        call SetUnitX(u, GetUnitX(u) + 100 * CosBJ(0))
        call SetUnitY(u, GetUnitY(u) + 100 * SinBJ(0))
        exitwhen i > 1000
        set i = i + 1
    endloop
endfunction


засунь это в КС и вызови из какого нибудь трига, передав ссыль на юнита и увидишь эффект
Старый 09.01.2009, 14:41
ExArt

offline
Опыт: 13,634
Активность:
Dragon Knight Не буду такой бред проверять) Движение надо делать переодическим триггером, а не циклом)
Старый 09.01.2009, 14:58
Dragon Knight
Меткий стрелок!!!
offline
Опыт: 4,138
Активность:
ExArt какая разница? эффект один и тот же при ливе с помощью этих функций юнита с карты
Старый 09.01.2009, 15:52
ExArt

offline
Опыт: 13,634
Активность:
Dragon Knight Надо написать 1 мегасложный тригер и небудет никаких проблем с ливом юнитов с карты.

Event - A unit leaves (Playable map area)
Action - Remove (triggering unit) from the game.
Старый 09.01.2009, 15:56
Dragon Knight
Меткий стрелок!!!
offline
Опыт: 4,138
Активность:
Мона просто контроллировать переход юнита через функции SetUnitX, SetUnitY, чтоб тот не уехал за карту

Dragon Knight добавил:
Код:
function MoveUnit takes unit u, real x, real y returns boolean
    local rect mr = bj_mapInitialPlayableArea

    if x > GetRectMinX(mr) + 100 and x < GetRectMaxX(mr) - 100 and y > GetRectMinY(mr) + 100 and y < GetRectMaxY(mr) - 100 then
        call SetUnitX(u, x)
        call SetUnitY(u, y)

        set mr = null
        return true
    endif

    set mr = null
    return false
endfunction


Функция требует ссылки на юнита, будущие его координаты X, Y, возвращает правду, если
будущие координаты не заходят за границы игровой территории
Старый 09.01.2009, 16:54
Pray_AD
stay in c++
offline
Опыт: 7,145
Активность:
Цитата:
глючные тупые функции, ты попробуй их юзнуть при периоде 0.01 в скольжении.. юнит попросто будет крутиться на одном месте, потому что 2 функции - медленнее чем любая 1, автор юзай только SetUnitPosition


Это кто тебе это сказал? Почему это 2 функции медленее чем любая одна?

Например:
SetUnitPosition(u,x,y); делает как минимум ...Unit.x:=x; ...Unit.y:=y; и + еще проверяет можно ли туда переместить юнита, иначе ищед свободное место рядом и помещает юнита туда. считаем: исполняется 2 команты, что очень быстро + 1 проверка, что достаточно медленно.

SetUtitX(u,x) SetUnit(u,y) работают даже вместе быстрее, т.к. каждая толко присваивает ...Unit.x или ...Unit.y соответственно значение, аргумента х(у).

Да и если это не убедило, то вот еще пример, когда 1 команда медленнее 2х, хоть по сути из них и состоит.

Pascal: x:=256; присвоить х'у значение 256

Asm: mov ah,ffh mov x,ah; то, же самое.

Все зависит от состава функции, количества локальных перепенных, количества параметров. Так что не надо так не обоснованно обвинять функции в глючности и тормознутости.
Старый 09.01.2009, 17:31
agentex

offline
Опыт: 34,834
Активность:
Pray_AD м я просто говорю о своем горьком опыте при работе с ними, причем тут ваще асемблер?
Старый 09.01.2009, 18:02
Pray_AD
stay in c++
offline
Опыт: 7,145
Активность:
Это пример, в котором 2 функции быстрее 1-ой =)

Pray_AD добавил:
Ну т.е. 2 команды..
Старый 09.01.2009, 18:27
ExArt

offline
Опыт: 13,634
Активность:
Dragon Knight тебе не кажется что контролить при каждой итерации переодического триггера снаряд это медленное решение? и гораздо проще одним триггером решить проблему.
Старый 09.01.2009, 18:59
Dragon Knight
Меткий стрелок!!!
offline
Опыт: 4,138
Активность:
ExArt чё ты какой упёртый? там не так уш и медленно, в функции SetUnitPosition - используется SetUnitX, SetUnitY, проверка на наличие юнитов, декораций, пафинга, не уехалли юнит за грани карты - этого достаточно, чтоб не использовать её для перемещения снарядов

Используя эту функцию для снарядов, надо: занести ссылку на дамми в переменную, контроллировать пафинг этого юнита - и ты говоришь, что моя функция тормознее SetUnitPosition? Её нужно вызвать столько раз скока надо, не надо контроллировать пафинг дамми, не надо беспокоится, что тот улетит за пределы карты

Dragon Knight добавил:
ExArt если ты конечно собираешься использовать таймер с периодом 0.001, то беги к близзардцам и спрашивай, что можно использовать для такого периода!
Старый 09.01.2009, 19:27
ExArt

offline
Опыт: 13,634
Активность:
Dragon Knight я говорю что проверять при каждой итерации это " if x > GetRectMinX(mr) + 100 and x < GetRectMaxX(mr) - 100 and y > GetRectMinY(mr) + 100 and y < GetRectMaxY(mr) - 100 then" совсем не нужно. Достаточно написать триггер
Event - A unit leaves (Playable map area)
Action - Remove (triggering unit) from the game.
Старый 09.01.2009, 19:33
Dragon Knight
Меткий стрелок!!!
offline
Опыт: 4,138
Активность:
ExArt вот тебе пример

там первым делом посмотри SetUnitX, SetUnitY, потом отключи их и включи SetUnitPosition...
Результат оправдает мою точку зрения

Dragon Knight добавил:
ExArt и зачем удалять, если можно предотвратить покидание региона?

Dragon Knight добавил:
И если не лень проверь мою функцию, она докажет, что ничуть не затормаживает поток вара

Dragon Knight добавил:
Да и хватит жассера переубеждать что он не прав
Прикрепленные файлы
Тип файла: w3x Example.w3x (16.1 Кбайт, 20 просмотров )
Старый 09.01.2009, 19:47
ExArt

offline
Опыт: 13,634
Активность:
Цитата:
Сообщение от Dragon Knight
ExArt вот тебе пример

там первым делом посмотри SetUnitX, SetUnitY, потом отключи их и включи SetUnitPosition...
Результат оправдает мою точку зрения


Даже качать не собираюсь, т.к. я и сам знаю что SetUnitx/y быстрее, другого я нигде и не утверждал.

Цитата:
Сообщение от Dragon Knight
Dragon Knight добавил:
ExArt и зачем удалять, если можно предотвратить покидание региона?

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

Цитата:
Сообщение от Dragon Knight
Dragon Knight добавил:
Да и хватит жассера переубеждать что он не прав

больше спорить не буду, слишком сильный аргумент)
Старый 09.01.2009, 20:00
J
expert
offline
Опыт: 48,447
Активность:
ExArt триггером на выход из реиона безуслоно оптимальнее определять вышел ли снаряд за границы карты или нет, чем каждый раз проверять это при движении, но тригер не связан с этим юнитом, например ты двигаеш таймером юнита, он перешел граниуц, триггер сработал, юнит удалился или подобное, а таймеру откуда об этом знать? он продолжить двигать юнита, а если бы проверка была прямо в таймере то под ифом можно было бы четко указать, мол, останови таймер и приведи в порядок все переменые с ним связаные и пр.
однако если у тебя снаряд отдельной структурой то это проще, можно делать через триггер как ты говорил, атачя на юнита структуру к которой он принадлежит, и если он выходит за пределы карты, триггер срабатывает и можно выполнять спецальный метод структуры останавливающий таймер и все прочее...
Старый 09.01.2009, 20:24
Ответ

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

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

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

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



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