![]()
FoK_KruGer
<3 Vocal Trance
![]() ![]() offline
Опыт:
19,940Активность: |
Цитата:
Чёт я не понял в чём разница??? а на счет покупки спеллов то что будут покупать самые мощные. НУЖНО Чтоб все такими были. Если вы считаете что это не реально,то подумайте "как и сколько по времени делали Доту??" Насчёт наземного транспорта: неплохо было б если им являлся военный американский джип.Такой темно-зелёный с открытым верхом. Новая идея:морские Корабли!можно купить и с моря обстреливать чё-нибудь. З.ы. Ща буду сидеть и перебирать игры в которые играл и думать что оттуда можно с комуниздить(идеи) Спасибо что приняли в команду!!! :loveyou: |
|
![]() |
#21
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Warden
:::...
![]() ![]() offline
Опыт:
26,106Активность: |
Пожалуйста :loveyou: |
![]() |
#22
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
FoK_KruGer
<3 Vocal Trance
![]() ![]() offline
Опыт:
19,940Активность: |
Цитата:
Типа ты обиделся?Это просто смешной смаил FoK_KruGer добавил: Придумал. При одевании вещи ВИДНО НА ГЕРОЕ что она одета.И Как вещь и как иконка. ИМХО глупость(ЛОЛ) Jon>>>>>>Кто я? 1.Ну знаю триггеры-----40. Кстати, ваш онлаин тестер первый тест прошел с первого раза. 2.Рельефщик---0 так как пункт 3 3.Фантазия-----0 4.кто там ещё есть? 5.моделщик тоже нулевой так как макса даже в глаза не видел(но хочу в нем поработать) 6.Идейщик---10 ну уже понятно 7.Оригиналщик---10 тоже 8.В принципе я хороший Оператор-----30. 9.Хорошо знаю Редактор ОбъеДков и Сам ворд эдитор(по тестам) 10.Чуство юмора-------100 Теперь то что я не умею: (Ну к 14 годам все выучить тяжело) 1.Понятие не имею о джасе 2.массив?---че это такое? 3.переменными я не пользуюсь(ток очень редко(т.к. о них почти ничего не знаю)) 4.Не умею делать таблички которые сверху справа расположены 5.Диалоговое окно я сделаю но с трудом.. 6.АИ не сделаю точно. 7.Самое страшное----не разбираюсь в циклах. Но если мне объяснят то пойму. Я быстро учусь) Кстати,карту скинте в личку хочу просмотреть.(без защиты)(лол)(хочу спеллы научится делать(они же у вас есть(надеюсь на джасе))))(Лол сколько скобок!) Насчёт секретов:у базы Наг будет стоять статуя с Варденкой)))) А у базы Эльфов(с большой буквы так как Эльфы---имба) Котёнок на пьедестале на котором начертано:Ну разве не прелесть??? Или посередине вместе и В обнимку! Л о о о о л л л о о л л л л о о о о л л И всё же я настаиваю на покупке спелла.Или выборе.Но за деньги.(ЛОЛ) :loveyou: :end: |
|
![]() |
#23
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Van Damm
wait... what?
![]() ![]() offline
Опыт:
22,268Активность: |
Jon по поводу расширенного инвентаря - ты знаешь, как сделать его одновременно и удобным, и не занимающим много способностей->времени загрузки карты, и не занимающим много времени на доступ, и не перекрывающим обзор за событиями на поле боя?
|
![]() |
#24
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Warden
:::...
![]() ![]() offline
Опыт:
26,106Активность: |
FoK_KruGer - Я не обиделся :loveyou:
Warden добавил: FoK_KruGer - На счет покупки - тебе не жаль тех людей, которые старались, придумывали спеллы и.т.д Warden добавил: А че на счет скрещивания (Смотри карту) |
![]() |
#25
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
FoK_KruGer
<3 Vocal Trance
![]() ![]() offline
Опыт:
19,940Активность: |
WardenТо что придумывали то молодцы.
Остолось их купить. :loveyou: Ты хоть мое сообщение предыдыщее читал?? :end: |
![]() |
#26
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
dk
![]() offline
Опыт:
60,293Активность: |
Понимаешь FoK_KruGer если мы сделаем покупку, то все спелы либо будут одного уровня(как у обычных юнитов) либо как у героев, но в этом случае придется делать столько героев(задумывалось 36 а будет во много раз больше). Jon по поводу выбора в самом начале, то это еще можно, кстати было это в одной карте на XGM'е щас название скажу, если найду!
|
![]() |
#27
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
FoK_KruGer
<3 Vocal Trance
![]() ![]() offline
Опыт:
19,940Активность: |
Dead_knight ТОЧНО! А я чет не додумался!Во нуууууб З.Ы,А пичиму ты ни в школе? |
![]() |
#28
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
dk
![]() offline
Опыт:
60,293Активность: |
У меня время +5 к Московскому! |
![]() |
#29
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
J
expert
![]() offline
Опыт:
48,447Активность: |
Допустим, вы хотите сделать спел. в котором хотите, чтобы также как Молот грома вызывал снаряд, летящий в юнита, и после столкновения с ним вызывал какие либо действия…
Вы берете Молот грома или другую подобную абилку, кастует ее по цели, и ждете ваитом (Wait) время (Расстояние до цели)/скорость снаряда Скорость снаряда указана в РО и с этим проблем нет Однако Расстояние до цели не постоянно, т.к. юнит движется, а рассчитываем расстояние мы только в момент каста… а что если скорость снаряда мала? И пока снаряд летит юнит сможет отбежать на приличное расстояние от рассчитанного? Тогда снаряд не успев долететь выполнит свои действия что будет выгладить не естественно, и не профессионально… Однако большинство триггерщиков пренебрегают этим точностям… “Подумаешь как работает! Главное чтобы ведь работало!” Однако, если мы захотим усложнить спел? Например, сделать так чтобы снаряд мог врезаться в любого встречного во время полета к цели. Через Молот Грома это никак не осуществить, и даже через любую стандартную абилку, тут поможет только джаз… Так что объясню как сделать подобное, однако это будет сложно понять, не зная что такое таймеры или SCV, если вы знаете что это такое то вам можно это пропустить. ТаймерыТаймер, это своего рода периодический триггер, выполняющий одну и туже функции раз в указанный промежуток времени. Сначала надо создать таймер функцией CreateTimer(), название типа таймера называется timer, и он является один из подтипов handle. Код:
Но сам по себе таймер ничего не делает, его нужно запустить функцией TimerStart() Код:
Обьесняю принимаемые значения: timer – Это уже созданный объект – таймер, который и будет выполнятся. real – Заданный промежуток времени bool – Логическая переменная, поставьте true, и таймер будет выполнятся периодически, каждый раз просчитывая заданный промежуток времени, поставьте false и таймер будет выполнен единично после того как пройдет заданное время Приведем парочку простых примеров: Код:
в результате на экран будет выводиться каждую секунду число, постоянно увеличиваясь на единицу. Код:
после вызова функции FuncTimerStart() спустя 5 секунд на экране появится надпись “Таймер сработал”, больше таймер выполнятся не будет, пока его снова не запустят. Однако, если таймер и не запускать, он все равно будет существовать, и чтобы он ни весел мертвым грузом в памяти – его нужно удалить. Удаляется он функцией DestroyTimer(), однако в ней нужно указать переменную удаляемого таймера. Тут пригодится функция GetExpiredTimer() используя ее в функции что выполняет таймер, она возвращает его. И получается чтобы удалить таймер, нужно в верхнем коде в функцию FuncTimerStart_Timer добавить еще одно действие: Код:
Также следует заметить, что после удаления таймера, функция, в которой он удалился, и которую он выполняет, все равно доработает до конца. Если в Выполняемую функцию таймера вставить функцию, которая принимает любые параметры, то вас просто выкинет из игры с ошибкой в момент запуска таймера. Таймер можно делать периодическим, но изменять его период нельзя, но иногда это требуется. Для этого будем использовать рекурсию одиночный таймеров. Код:
И таймер будет постоянно выполнятся через время указанное в переменной udg_Real. Надо будет просто изменять переменную и все… В этом случае хоть таймер и одиночный, но после завершения удалять его не надо, т.к. он продолжает запускается вновь: Вот все остальные функции по работе с таймером: Код:
1) Принимает таймер, и возвращает значение уже пройденного времени с момента запуска, или с момента последнего выполнения 2) Принимает таймер, и возвращает оставшегося времени до следующего выполнения 3) 4) Останавливает принятый таймер 5) Продолжает Остановленный таймер Также следует отметить преимущество таймера:
Преимущество ее от обычного ваита в том, что она просчитывает игровое время, а не реальное… Однако посмотрите на строение этой функции: Код:
Видите, она использует обычный ваит (функция TriggerSleepAction()), который выполняется через цикл, фишка этой функции в том, что она создает и запускает таймер (без выполняемой функции, т.е. просто как счетчик). И через цикл периодически с помощью обычного ваита просчитывает оставшееся время до срабатывания таймера, и если оно равно 0 (таймер сработал) то выйти из цикла и продолжить выполнение всех действий после Wait(game-time). Тем самым, создавая эффект присчитывания игрового времени. Однако неточность, присутствие ограничения, как и в обычном ваите, и его не универсальность все же намекают о том, что лучше использовать таймер напрямую. В основном таймеры используют для движения прожектилов. Но об этом чуть позже… Super Custom Value (SCV)Ни будем ни что усложнять… возьмем самый простой бессмысленный пример для рассмотрения – Будем просто двигать юнита вправо. Код:
Запуская Функцию FuncTimerStart(<НашЮнит>) мы заносим его в глобальную переменную (мы делаем так потому что просто передать пораметра в функцию выполнения таймера нельзя), и запускаем таймер который будет двигать этого юнита вправо… все очень просто, НО, попробуйте запустить эту функцию со вторым юнитом, и что же мы уведем? А то что первый юнит перестал двигаться, а второй стал двигаться в 2 раза быстрее чем нужно… Это объясняется тем что глобальная переменная всего одна, и первый и второй таймер используют именно ее, и записывая в нее второго юнита, первый и новосозданный второй таймер начинают действовать только на второго юнита, и первый уже не двигается… Как же добиться очень главного качества – универсальности? Чтобы работало со всеми, и не мешало другим... Все делается через SCV, оно сопоставляет любому объекту (в данном случае это нужно сопоставить таймеру) любое число, строку или объект (в данном случае юнита). game cacheЕсли вы занимались триггерством, то вам должно быть известно, что существует Кеш - Динамичный Ассоциативный массив. Динамичный потому что он как резиновый, имеет размер сопоставляемый с количеством записей в нем. И ассоциативный, потому что в качестве 2-ух ключей/индексов в нем служат не целые числа (как в обычных массивах), а произвольные строки. handleУ каждого объекта на карте имеется уникальный номер, который не повторяется (хотя это не так, но в рамках данной статьи это не рассматривается), его называют хендл. При создании объекта хендл увеличивается, при удалении объектов, его хендл высвобождается, и его место занимает следующий созданный объект. Этот хендл можно получить с помощью функции. Код:
объяснять принцы не буду, главное что она работает. Чтобы вернуть юнита по его уникальному номеру воспользуемся функцией Код:
Теперь вернемся к нашей теме, как передать в функцию таймера параметр действительный только для этого таймера? Если учесть все факты что были сказано выше, то: можно занести в Кеш в качестве первого индекса Уникальный ключ нашего таймера, а во второй индекс просто индексионую строку “Unit”, когда же выполнится функция, мы используя уникальный ключ таймера который в данный момент выполнил эту функции и вернем сопоставленного ему юнита. Код:
И сколько бы вы не запускали функцию FuncTimerStart() их выполнение не будет никак мешать друг на друга… projectileТеперь вернемся к тому что обсуждалось во вступлении: Нам понадобятся Функции расчета расстояния, и угла между 2-мя точками, но тру челы точки не юзают, потому мы будем пользоваться координатами, но к сожалению аналогов функция DistanceBetweenPoints и DistanceAnglePoints работающих на координатах нету в blizzard.j. Потому мы напишем их сами… Код:
Также в данной области нужно очень хорошо знать тригонометрию, я советую всем незнающим почитать эту тему обязательно http://xgm.guru/forum/showthread.php?t=9431 Теперь приступаем к нашему таймеру: Нам нужно всево напросто создать таймер, передать в него Снаряд, Цель и все… С помощью полярных координат передвинуть прожектил ближе к цели, и если расстояние от него до цели меньше определенного значения, то закнчить таймер и выполнить нужные действия: Код:
При запуске функции FuncTimerStart(Кастер, Цель)? Создается снаряд летящий от кастера к цели, встречается с ним, и выполняет указанное в коде место… Но это лишь маленький пример того как можно его двигать. Теперь много усложним задачу… перейдем от 2D к 3D Т.е. Снаряд у нас будет проходить не в одной плоскости, а в пространстве. Думаю что все знают что такое парабола, если использовать ее для того чтобы начертить график движения юнита, получится такая формула: Y=4*S*hig*(1-X/len)/len В результате движения в плоскости карты + движение по Z с помощью этой формулы получится, что юнит будет лететь по дуговой траектории, максимальная высота которой ровна hig, а длина len, а S – уже пройденное расстояние из len. Подобные движения уже сложно осуществлять между юнитами, и они требуют точных расчетов и точного значения начала и конца пути. Потому напишем функции только принимающая начал и конец в координатах. Код:
Однако.. как стоить заметить, эта функция двигает Снаряд только в плости карты, и создает только визуальную видимость что он перемещается в воздухе… т.е. мы указываем в функции скорость юнита в плоскости, а не в пространстве. С введением пространственной скорости, функция должно усложнится, в этом случае тоже приведу свой пример: В нем я уже применил другую формулу, а именно весьма известную формулу равно ускоренного движения тел. S = S0 + U*t + (a*t^2)/2 Код:
FuncTimerStart takes unit projectile, real SpeedXYZ, real GAngle, real VAngle, real g, real Ftorm, real SpeedTime Projectile – Уже созданный снаряд (или даже просто юнит) который и будет двигатся SpeedXYZ – Пространственная скорость снаряда GAngle – угол движения юнита в игровой плоскасти GAngle – угол движения юнита от горизонта в вертикальной плоскасти g – Ускорение свободного падения т.е. замедление скорости снаряда по оси Z… т.е. он будет лететь уже не по симметричной траектории как в предыдущем случае. Ftorm – Своего рода, сила трения воздуха… т.е. постепенно замедляя скорость снаряда по оси X и Y. Но иногда нам неизвестен угол от горизонта, но известна конечная точка… как определить угол между стартовой и конечной точкой в вертикальной плоскости? Т.к. в варе нет для этого функции, можно воспользоваться моей: Код:
Она использует формулу Косинуса угла между векторами, и возвращает найденный угол в радианах. Чтобы узнать синус можно его вывести из оновного тригонометрического тождества Код:
думаю на этом пожалуй все… перейдем к следующему… GetLocationZИмя дело с этим и в триггерстве, вы знаете что высота юнита задается от точки на рельефе на которой он находится, и тем самым используя все выше упомянутые функции на очень неровном рельефе, то снаряд будет двигатся не очень корректно, т.к. весь рельев плоский или нет, представляет для него одну плоскость. Но можно обойти эту проблему используя GetLocationZ(location) Эта функция принимает точку, и возвращает высоту рельефа на которой находится точка А функция GetUnitFlyHeight(unit)] возвращает высоту юнита от рельефа Потому Абсолютная высота юнита будет ровна GetLocationZ(GetUnitLoc(unit))+ GetUnitFlyHeight(unit) И к сожалению, функция GetLocationZ принимает параметр только точку… альтернативы с ее координатами нет, потому сейчас мы резко переходим от координат к точкам: Надо добавить, что у точек немного другой оптимальный механизм движения. Создавать точку нужно всего раз, а в функции выполнения таймера нужно всеволиж перемещать точку функцией MoveLocation(Loc, X, Y) И при завершении движения - удалить точку. Воспользуемся функцией прожектила использующего формулу с пространственной скоростью и предыдущей главы: Но в данном примере мы лучше воспользуемся традиционным способом создания и удаления точек для буле лучшего понимания: Код:
Появилась новая функция, это для удобства применения, она устанавливает юниту новую высоту, учитывая погрешность рельефа на навой точке. Ну что ж… думаю на этом все… Отредактировано Jon, 24.07.2007 в 08:44. |
![]() |
#30
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
FoK_KruGer
<3 Vocal Trance
![]() ![]() offline
Опыт:
19,940Активность: |
Jon ---Я Уже понял. Dead_knight -----прикольно |
![]() |
#31
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Warden
:::...
![]() ![]() offline
Опыт:
26,106Активность: |
FoK_KruGer - :loveyou: :)
|
![]() |
#32
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
dk
![]() offline
Опыт:
60,293Активность: |
Warden в чем смысл твоего высказывания?
Щас как модеры прийдут! |
![]() |
#33
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Warden
:::...
![]() ![]() offline
Опыт:
26,106Активность: |
Dead_knight - мы так шутим :susel:
![]() |
![]() |
#34
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
J
expert
![]() offline
Опыт:
48,447Активность: |
Цитата:
нет, но надеюсь к нам поже присоеденятся еще джазеры - к томуже инвентать NETRATA кокраз подходит - он, вроде, для многих игроков. Место он занимает - но не очень большое, да в любом случае прийдется делать через бонус области камеры. И там должно быть все подробно расписано об импортации. - он ведь не для себя его делает - для всех. |
|
![]() |
#35
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Warden
:::...
![]() ![]() offline
Опыт:
26,106Активность: |
Jon - расширение инвентаря? - поможет система Sergey - там неограниченое число предметов + они дейтвуют даже если их не видно...
|
![]() |
#36
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
FoK_KruGer
<3 Vocal Trance
![]() ![]() offline
Опыт:
19,940Активность: |
А я думаю что лучще игроки будут ДУМАТЬ что взять.А то понаберут все самые крутые итемы и все.
Ненужен этот инвентарь.ИМХО Кстати,Warden :loveyou: :alc: |
![]() |
#37
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Van Damm
wait... what?
![]() ![]() offline
Опыт:
22,268Активность: |
Jon основной частью высказывания было
Цитата:
FoK_KruGer абсолютно согласен. лучше если надо будет подумать, прежде чем купить |
|
![]() |
#38
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
dk
![]() offline
Опыт:
60,293Активность: |
В крайнем случае можно сделать старым дедовским способом, бессмертный юнит у которого тоже есть место для переноски предметов. |
![]() |
#39
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
FoK_KruGer
<3 Vocal Trance
![]() ![]() offline
Опыт:
19,940Активность: |
Цитата:
Надо же !меня кто-то понимает в этом злом мире..... :end: |
|
![]() |
#40
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|