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

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

Результаты опроса: Как Вам моя статья?
Отлично! Помог мне разобраться! 6 40.00%
Неплохо, новичкам сойдёт! Но для меня нового ничего нет! 6 40.00%
Ничегошеньки тут я не понял 0 0%
И ты думашь это понятно новичкам? 1 6.67%
Если оптимизировать в джаз будет нехило. 2 13.33%
Голосовавшие: 15. Вы еще не голосовали в этом опросе

 
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
Как создать свою систему управления.
И так, вам захотелось создать свою систему управления на триггерах? Но как это сделать?

Введение


Внимание: при огромном колличестве таких триггеров карта может глючит, так что советую прочитать конец статьи, раздел об "Избавлении от Вредного Мусора"!

Можно сделать систему управления на стрелках или на буквах. Способ на стрелках - более удобный в реализации, но и не очень удобный
для игрока - так как большая часть геймеров играет на W, A, S, D. К сожалению эти кнопки (A и S) заняты способностями
Стоп и Атака. Но к счастью не далеко (на клавиатуре) живут кнопки R D F и G (обратите внимание, что у некоторых способностей, например, у добычи ресурсов, горячая клавиша - G, так что следите, чтоб клавиши не совпадали). Вам придется выбрать и способ атаки (например, как в карте Painkiller) - мышью, или так же клавиатурой. Более сложные системы могут содержать прыжки (!!!) или похожие сложные, невыполнимые просто так, команды.

Прочитайте вот эту статью, прежде чем приступить к попыткам создания этой системы.

Попробуем создать систему, как у Melfis'a (Painkiller карта). Прежде чем начать, вы должны неплохо знать триггеры, чтобы понять, о чём речь.

Да и ещё - я пишу часть триггера по-русски. Это (для меня) быстрее и удобнее, да и для вашего мозга быстрее добегает. Так-с.

Создание системы


Создаём триггер, который двигает юнита в регион перед ним:
Код:
Первый триггер движения вперёд:
    Событие
        Время - Every 0.20 seconds of game time
    Действие
        Юнит - Order Ваш юнит to Двигаться ((Position of Ваш юнит) offset by 200.00 towards (Facing of Ваш юнит) degrees)

И ставим параметр этого триггера Изначально выключен, т.е. его мы будем включать и выключать во время игры.
Теперь два триггера (они просты) включающие и выключающие наш первый:

Код:
Второй триггер движения вперёд:
    Событие
        Игрок - По умолчанию 1 нажимает key стрелка вверх
    Действие
        Триггер - Turn on Ваш первый триггер <gen>


Код:
Третий триггер движения вперёд:
    Событие
        Игрок - По умолчанию 1 отпускает key стрелка вверх
    Действие
        Триггер - Turn off Ваш первый триггер <gen>


Вы так же можете добавить действия, выделяющие и снимающие выделение с вашего юнита.

Теперь пример триггера, поворачивающего камеру вправо (влево сделаете сами, т.к. они аналогичные).

Код:
Триггер поворота камеры вправо:
    События
        Время - Every 0.04 seconds of game time
    Действия
        Триггер - Turn off Первый триггер (движение вперёд) <gen>
        Юнит - Make Ваш Юнит face ((Facing of Ваш юнит) - 5.00) over 0.02 seconds


Триггеры отмены - аналогичны триггерам отмены движения вперёд, только стрелка\триггер (для отключения) изменяются.
Теперь, если вам нужно сделать разворот назад (а это не обязательно), создайте такой триггер:
Код:
Триггер разворота назад:
    События
        Игрок - По умолчанию 1 нажимает key стрелка вниз
    Действия
        Юнит - Order Ваш юнит to двигатся ((Position of Ваш юнит) offset by 30.00 towards ((Facing of Ваш юнит) + 179.00) degrees)


Триггеры основного движения готовы. Теперь триггер атаки...

Код:
Триггер атаки:
    События
        Юнит - Generic Unit Event выбран
    Условие
        Trigger Unit не равно юнит игрока Ваш враг (таких условий можно сделать для всех вражин ;) ) нет.
    Действия
        Kill Trigger Unit

Вот собственно и всё. Вы своими руками сделали первую систему управления и теперь можете редактировать её сами.

Полезные советы :mail:

После убийства юнита действием Kill :susel: , удалите его - Remove.
Используйте "пустые" способности, а потом триггерно привязывайте к ним действи перемещения.
Используйте больше регионов в ваших системах.
Следите за камерами, старайтесь не перекрывать обзор дудами.
Старайтесь оптимизировать вашу систему - упростите её максимально.
Не используйте много одинаковых триггеров, старайтесь юзать переменные.

Избавление от Вредного Мусора


Баг замеченный уже давно, мне, к сожалению, ранее не был известен, но теперь уважаемый Mefist открыл мне глаза, за что ему спасибо.
В общем, этот баг был обнаружен на карте Sergey про вертолёт, а обнаружил его Какодемон. Он заключается в том, что после многих триггеров
остаются "мусорные" объекты. Такие как юнит, убитый действием kill, он НЕ исчезает из игры, его нужно удалить (Remove). Удаление вот таких глюков и есть
оптимизация, о которой ты наверняка слышал. Теперь попробуем найти "мусор" в нашей системе. И так мусор - это...
Код:
((Position of Ваш юнит) offset by 200.00 towards (Facing of "Ваш юнит")

точнее это точка, которая создаётся каждые 0.4 секунды. При этом старая точка не удаляется! И представьте, как страдает от этого память!
(как сказал Sergey "многострадальная память"). Что делать? Да уж... дела плохи. Но минимального ПОНИМАНИЯ джаза хватит. Попытаюсь рассказать
коротко, но если не понятно, то зайдите и прочитайте это.
Цитата:
Код:
Set p = Point with polar [offset ((Center of (Playable map area)) offset by 256.00 towards 50.00 degrees)]

p – переменная типа точка. После выполнения действия, в точке p будет точка, полученная из точки ЦЕНТР КАРТЫ (Center of (Playable map area)), путем перемещения последней на расстояние 256 под углом 50 градусов. Представили?

Вот что написано в статье Сергея. Но как быть нам? Нужно создать локальную переменную (любое имя). Как? Найдите действие Custon Code, т.е. вставка кода.
Туда впишите
Код:
local point p

Т.е. создаём локальную переменную (!!!ни где-нибудь, а в триггере движения, больше её ни где использовать нельзя!!!) с именем "p".
Теперь надо изменить код и узнавать (полярно) точку. Удаляем действие движения и пишем следующие:
Код:
Set p = Point with polar [offset (((Position of Ваш юнит) offset by 256.00 towards Facing of Ваш юнит)]
call IssuePointOrderLocBJ( null, "move", p )
call RemoveLocation(p)

Вот теперь всё. Каждые 0.4 секунды создаётся точка, приказывается юниту туда бежать, точка тут же удаляется и создаётся новая и т.д.
Теперь глюков не возникнет.

Отредактировано Nimensy, 14.02.2006 в 17:55.
Старый 08.02.2006, 19:50
Кет

offline
Опыт: 111,109
Активность:
хлопает
как однако все просто...
а я то не могу догадаться...
Старый 08.02.2006, 19:54
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
ну на самом деле не все так просто, потому, что после небольшого времени игры в карту с такими триггерами, и она начинает страшно тормозить. Почитай статью Сергея про оптимизацию на джасс. И пример этому хороший есть - его карта про дракона (наверно есть в базе)
Старый 08.02.2006, 20:04
NETRAT

offline
Опыт: 83,712
Активность:
Да, Mefist частично прав - мусорные обьекты (Position of "Ваш юнит") и Kill Trigger Unit (ну да это мелочь)
Старый 09.02.2006, 02:36
J
expert
offline
Опыт: 48,447
Активность:
(Все, теперь пойдут статии о 2-ух действиях потом по 1-у, нельзяли написать ченибудь посерезнее)
Цитата:
Триггер поворота камеры вправо:
События
Время - Every 0.01 seconds of game time

А зачем 0.01, только игру будет подтармаживать, немного, но все ж, уж лечше поставь 0.04, 25 кадров в секунду самое оптимальное, а 0.05 уже не подходит.
КСТАТЕ, это система передвижения хороша, но мне нравится другая, предпологает что камера ненаходится за спиной юнита, а постоянно вращается вокруг него соответственно для большей атмосферы, и вращается не просто так а в каждом регионе свой поворот, :Dдоходят слухи что ты делаеш Принц Персии:D, ну корое совеетую сделать там этот метод тем более он организован в самой игре, он нечем не сложнее этого, просто во время движения юнита, отправляй его на угл:
Вправо:
Текущий поворот камеры-90
Влево:
Текущий поворот камеры+90
Вниз:
Текущий поворот камеры-180
Врех:
Текущий поворот камеры

Отредактировано Jon, 09.02.2006 в 03:24.
Старый 09.02.2006, 03:16
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
Mefist могу тебя заверить что не тормозит. проверенно. или это просто дело случая? хм... но всё же.
NETRAT мусорные? бгы!
Ну впринципе это можно и оптимизировать, но обращу ваше внимание, что джазеров от силы 30-50 (или гораздо меньше), а вот триггерщиков мона сотнями считать ;)

Nimensy добавил:
Ket в этой фразе есть сарказм, или мне так кажется?

Nimensy добавил:
Jon исправил поворот на 0.04 секунды. Просто забыл о самых простых свойствах человеческого глаза и не щадя его написал 0.01 ;)
NETRAT
Цитата:
200.00 towards
а если потавить меньше, или это не влияет на тормоза?
Старый 09.02.2006, 10:40
NETRAT

offline
Опыт: 83,712
Активность:
Nimensy Нет, расстояние не имеет значения. Фича в том, что при наличии большого числа триггеров, которые оставляют мусор, через 1-2 часа игры на выходе из карты вар зависнет, если их уж совсем много, то он просто сглючит посреди игры с сообщением о недостатке виртуальной памяти. Под мусором имеются ввиду незакрытые дескрипторы (неудаленные локации, мертвые юниты и т.п.)
Старый 09.02.2006, 15:24
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Под мусором имеются ввиду незакрытые дескрипторы (неудаленные локации, мертвые юниты и т.п.)

А как их удалить?(Не пользуясь Джазом)
Старый 09.02.2006, 15:33
ddryid

offline
Опыт: 2,358
Активность:
Можно все сделать гораздо проще, создать четыре области по краям карты... И при нажатии кнопки влево бежать влевую область, при отжатии кнопки остановить юнита... И так ко всем кнопкам
Старый 09.02.2006, 17:27
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
NETRAT ну тогда просто напишу примечание что это может вызвать глюки (хотя у меня после часа проверки этой системы глюков небыло...)
Jon ага, как?

Nimensy добавил:
ddryid а, нет... эта система работает относительно камеры, а камера всегда за спиной у юнита. а в твоей системе юнит будет бежать именно в центральную точку, даже если б просто влево-вправо, то всё равно - праша.
Старый 09.02.2006, 17:33
WildCat
General Mapmaker
offline
Опыт: 10,232
Активность:
Как говорит наш препод, "учебная схема" - приводят как пример во всех учебниках, но собранная в реальности либо не работает вовсе, либо сгорает :)
Старый 09.02.2006, 17:47
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
Эй! Народ! почему тэги color неработают? как сделать выделение красным?

Nimensy добавил:
З.Ы. Ваш препод говорит умные вещи ;)
Старый 09.02.2006, 17:49
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Jon ага, как?

Но это тупо :mad: , неужели близы не смогли этого понять и сделать какую-нибудь фишку, исправляющую эту фигню :notgood: ?
Старый 09.02.2006, 18:15
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
возможно и сделали, но я не знаю как.
просьба модерам выделить фразу
Цитата:
Внимание: при огромном колличестве таких триггеров карта может глючит, но в общем если ваша карта расчитана на 1-го игрока, то это минимально возможно!

красным. заранее сэнк.
Старый 09.02.2006, 18:36
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Доходит понемногу????

эээ... неа:).

Jon добавил:
Цитата:
Более продвинутая система управления
Этот раздел расскажет о управлении на буквах.
И так идея в том, что вы создаёте (а я сказал, создаёте!) 4 способности, которые при их применении ничего не делают.

Эээ... это не продвинутая система, я бы даже сказал наоборот.
Потому что такое управление будет работать один раз при нажатии клавиши, а у стрелок есть событя "отпускает кнопку", в случае со спелами этот прием не сработает, и потому постоянноего движения не сделать таким образом.
Старый 09.02.2006, 19:15
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
Да уж!
статью на сайт не зальёте?

Nimensy добавил:
Jon способность имеет постоянный эффект, а триггер "Юнит прекращает применение способности (повторное нажатие)"... не так уж удобно но... всё же.
Старый 09.02.2006, 19:26
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
не так уж удобно но

В том то и дело что это вообще неудобно:)
Старый 09.02.2006, 19:41
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Цитата:
Да уж!
статью на сайт не зальёте?

Как я понимаю статья писана ради экспы? Оо?
Цитата:
А зачем 0.01, только игру будет подтармаживать, немного, но все ж, уж лечше поставь 0.04, 25 кадров в секунду самое оптимальное, а 0.05 уже не подходит.

Есть такая штука как fps и причем тут 25 кадров в секунду не пойму?
Старый 09.02.2006, 20:40
WildCat
General Mapmaker
offline
Опыт: 10,232
Активность:
25 кадров в секунду - максимум для человеческого глаза, причём 25 кадр воспринимается уже только подсознанием.
Старый 09.02.2006, 20:46
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
WildCat
Нет это то понятно. Я про то, что 100fps и 25fps далеко не одно и тоже. И это отлично видно.
Старый 09.02.2006, 21:14

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

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

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

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



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