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

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

Ответ
 
Sergey
Старейший
offline
Опыт: 43,563
Активность:
continue
Влад, ты уже очень многое узнал о jass. Конечно, в jass полно и других важных наработок. Есть команды, позволяющие выводить текст в любом месте экрана. Есть спец. команды, позволюющие производить общие действия для всех игроков на одном только компьютере (например, играть такой-то звук). Есть наработки Vexorian-а, который по сути сделал такую же систему, как SCV Димона, но раньше. Есть методы, позволяющие упростить работу с группами юнитов. Есть методы создания специальных объектов, которые определяют, что юзер щелкнул мышкой в такую-то точку (на основании этого построен инвентарь Димона на 80 слотов). Вообщем всяких приемов хватает. Но всему этому обучать я уже не буду, т.к. во-первых, сам многого не знаю, во-вторых, ты уже сможешь разобраться самостоятельно. Можешь проверить - статьи по jass, которые раньше казались сложными и непонятными, теперь станут доступными, а материал изложенный в них - будет уже знаком.

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

Вот, к примеру, Drakvius как-то раз попросил меня разобраться с тем, как устроено заклинание passive mana shield известного буржуйского автора. Идея в том, что пвреждения должны наноситься мане, а когда мана кончится - жизни. Думаю, ты уже догадаешься, как это сделать. Единственный способ, пригодный для этого методами war3 - отлавливать повреждения, полученные юнитом при помощи триггера с событием unit takes damage. Т.е. для каждого юнита с пассивкой, нужно создать такой триггер - это задача решаемая. При нанесении повреждения юниту, возможны разные случаи:
- маны у юнита больше размера повреждения: в этом случаи мы восстанавливаем юниту жизнь и отнимаем ману.
- маны у юнита меньше размера повреждения: в этом случае из получеченного юнитом повреждения мы должны восстановить число жизни, равное количеству маны, а потом обнуляем ману.

Вроде все хорошо. Все, да не все. Оказывается, что событие unit takes damage срабатывает на какую-то долю секунды раньше, чем юниту наносится повреждение. Из-за этого, если жизнь юнита полная, мы пытаемся добавить жизнь и отнять ману. Но жизнь полная и поэтому добавлять к ней что-то бесполезно. Получается, что жизнь юнита все равно страдает. Мелочь, а не красиво.
Можно конечно сделать паузу 0.1 секунды и уже после этой паузы восстанавливать жизнь юнита. Тогда все работает нормально, но все таки видно, как жизнь юнита колеблется. Опять же, некрасиво.

Drakvius предложил глянуть этого спрел этого буржуйского автора - там было столько jass кода, в котором было так лень разбираться, что я на это забил. Стал думать. Есть ли возможность отловить момент, когда у юнита отнимутся жизни? В принципе есть. Существует такое событие, которое срабатывает, когда жизнь юнита станет меньше указанного значения. Этим можно воспользоваться! Просто если жизни у юнита почти полные и нельзя использовать метод добавить жизнь сразу, мы СОЗДАДИМ ТРИГГЕР с событием, которое сработает, когда жизнь текущего юнита станет меньше текущего значения. И именно в этот момент мы добавим жизни юниту обратно. Проверил - сработало.

Код получился наверное в 3-4 раза короче, чем у буржуйского автора, а результат тот же самый :).

Вообщем Влад, для интереса, если хочешь посмотреть интерсные jass наработки и выяснить, как они устроены, рекоммендую:
- наработка Димона: герой Seal master
http://www.blizzard.ru/forum/showthread.php?t=13831
- моя наработка: герой Еретик
- моя наработка: герой Лорд Хаоса
http://forum.wc3.ru/showthread.php?t=10999
12 пост
- наработка для созданий Аеонов
http://www.blizzard.ru/forum/showthread.php?t=12005
ТОЛЬКО ИЗ ПОСТА 7
- спел passive magic shield
http://host1218.hostland.ru/forum/showthread.php?t=1362
- спел Divine bless и Аура сопротивления
http://wc3.xgm.guru/files.php?category=4&perpage=20&page=3

Когда почувчтвуешь, что готов, сможем приступить к разбору инвентарной наработки.
-------------------------------------------------------------
Sergey добавил:
В сценарии обязательно должна быть глобальная перменная p типа точка

function do_polar_offset takes location source, real dist, real angle returns location
local real x = GetLocationX(source) + dist * Cos(angle * bj_DEGTORAD)
local real y = GetLocationY(source) + dist * Sin(angle * bj_DEGTORAD)
call MoveLocation(source, x, y)
return source
endfunction

и функция

function move_p_to_unit takes location source, unit u returns location
local real x = GetUnitX(u)
local real y = GetLocationY(u)
call MoveLocation(source, x, y)
return source
endfunction

Вставляем эти функции в код сценария.

Вторая функция берет объект точка и объект юнит и приравнивает точку к положению юнита. Тюею мы можем написать
move_p_to_unit(udg_p, u) - и результатом будет то, что точка, на каоторую ссылается переменная udg_p станет указывать на положение юнита u. При этом не засоряется память.

Первая функция берет точку, угол и расстояние. Она производит смещение переданной точки относительно текущего положения в полярных координатах.
Т.е. мы можем написать
do_polar_offset(udg_p, 100, 60) - точка p сместится на 100 единиц под улом 60 градусов относительно текущего положения. Утечек памяти не будет.

Теперь скомбинируем первую и вторую функцию. Допустим, нам нужно сместить точку p в другую точку относительно текущего положения юнита. Используем вложенные функции:
do_polar_offset(move_p_to_unit(udg_p, u), dist, angle)

- это общая формула для такого вида конструкции. Здесь
udg_p - глобальная переменная, которую мы используем для всех перемещений
u - юнит, относительно которого производится вычисление
dist и angle - параметры смещения

Отредактировано Sergey, 10.06.2005 в 10:34.
Старый 10.06.2005, 12:45
vlad_C0M
Босс DarkSkyTeam
offline
Опыт: 10,459
Активность:
Сергей! Все почти понял и изучил.....
\ Выходи в АСЮ! У меня кое какие идеи возникли... Правда не совсем вовремя.... За 7 часов до экзамена по геометрии...
=)

Я теперь начинаю понимать :
  1. Как сделать управление камеры при помощи движений мышы
  2. Как сделать высоту камеры
  3. Как при помощи (высоты препядсвия) менять высоту камеры.
  4. Как можно менять высоту препядсвия во время игры.

Вообщем я весь в шоке... Пишу максимально спокойно, но у меня истерика... :)!
Старый 15.06.2005, 18:56
Sergey
Старейший
offline
Опыт: 43,563
Активность:
Я в асе могу бывать редко... По поводу того, что ты написал - это я в шоке... Где -ты видел управление камерой мышкою? Максимум чего я доюивался - это управление стрелками как в сценарии Air War с камерой, перемещающийся вместе с юнитом. Это можно сделать, но есть одно но... Это не очень удачный способ и не самый удобный способ управления камерой.
Старый 15.06.2005, 20:14
vlad_C0M
Босс DarkSkyTeam
offline
Опыт: 10,459
Активность:
Sergey : Нет Сергей тут как все наоборот. И кстати (к слову) , я даже знаю как при перемещении move = не допускать сброса анимации.... :) Все досканально просто. Правда при перемещении нужна будет постоянная анимация ... 1 единсвенная :)... Т.е. walk 2 не будет пахать :) .... Именно поэтому чувствую плавать герой будет менее интересно чем ходить.....

По поводу камеры + мыши..... Есть такие обьекты называют их Trackable .... И есть такая команда как create\ destroy local trackable ... Все будет грузить память .... Однако если можно создать trackable для local player_a - тогда я знаю как все осуществить .. без особого загружения памяти..... Собственно все будет динамически обновлятся.... :) Да и в Варе графика не столь мощна чтобы не хватило место для 30 х 30 = 900 обьектов для 1 игрока. Причем обьекты невидимы... И лишь отслеживаются памятью как галочка...... Вот скажи сколько стоит памяти один прозрачный обьект? :) Я думаю немного. Правда у меня это смутно укладывается в голове. Сделать динамически обновляемые обьекты в пределах 0.05 секунды! .. Если это не бред ... И 900 обьектов в секунду сможет создатся и удалится ...... Тогда все будет как в Counter Strike ..

Про "ходьбу" по кнопкам.... У меня возникли сразу 2 бредовые идеи.... 1 - я знаю что сама функция на jass ... (if then) имеет свойство "перенаправлятся" .. И можно переопределить практически любое значения.... Собственно если удастся вернуть из "нажатой вверх -" нажатую "W" - Тогда лавры можно нести.... А если не удастся .. То слушай саму идею :
  1. Герой используя удаленную команду order - двигается неимоверно криво .... Именно поэтому я предлагаю перемещать героя через move .... С любой скоростью .... Используя этот сброс анимации в нужное русло....
После калькулирования движений в секунду я установил что при скорости 10.000 animation speed - 20 секунд анимации пролетят как 1 ....... И герой практически не будет двигатся..... =) Т.е. замрет .... В те самые 0.05 невидимые для нас секунды. Итого : С момента нажатия move - до времени передвижения мы прогоняем упустившиеся кадры используя N+1 фрагмент предыдушей анимации. .. собственно какой ..... Такой вот ... WALK! :)

Ладно Серега.... Я щас еще больше углубляюсь в джасс .... Конечно ты меня поспешишь скорее растроить... Но возможно не все мои идеи не имеют пола ....... А скорее имеют опору но не имеют потолка!

Старый 16.06.2005, 06:57
Sergey
Старейший
offline
Опыт: 43,563
Активность:
Расстраивать не буду, но я понятия не имею, как все это делается или даже можно ли такое сделать вообще. Насчет tracable - лучше поговори с Димоном. Он в этом эксперт. По моеему эти объекты можно создавать, но нельзя удалять... А может и нет. 900 объектов конечно память сожрут порядочно, но все нужно проверить.
Старый 16.06.2005, 10:31
vlad_C0M
Босс DarkSkyTeam
offline
Опыт: 10,459
Активность:
Серега. Можно создать дейсвие :
"Когда игрок нажимает клавишу" - любую ? ... И "Игрок отпускает клавишу" - любую ?

Я думаю можно. Но для этого нужно знать код клавиш!!! Т.к. например клавиша вверх пишется ввиде переменной "bj_KEYEVENTKEY_LEFT" , я думаю что там указан тип "event key" - т.е. клавиши вверх влево вправо вниз. Записаны в особый файл откуда и читается "возможность нажатия этих клавиш". Если это так тогда можно эти самые "вверх вниз . и т.п." переделать на W . S . A . D :) !

Где можно найти список всех возможных переменных ... И как указать клавишу типа EVENTTYPE - например "W" = только не говорите что это невозмно.... Т.к. в jass возможно все.
Старый 17.06.2005, 09:21
Sergey
Старейший
offline
Опыт: 43,563
Активность:
Влад, как успехи. Нужна помощь?
Старый 02.07.2005, 12:45
vlad_C0M
Босс DarkSkyTeam
offline
Опыт: 10,459
Активность:
Сделал систему развития героя. И систему интерфейса... :) Осталось чуть чуть переделать заклинания , избавится от утечек , возможных и невозможных ... И внедрить твою наработку с инвентарем!
Старый 08.07.2005, 11:16
vlad_C0M
Босс DarkSkyTeam
offline
Опыт: 10,459
Активность:
Сегодня почти, до-разобрался со скриптом супер инвентаря aka - "InvSystem". Очень много полезного, для себя, вычерпал :)!!! Сейчас буду делать мини-задумку на джазе, опять в голове куча безумных идей =)!
Старый 01.09.2005, 17:26
Ответ

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

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

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

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



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