Форум Игромании
 
Регистрация
Справка
Пользователи Календарь Сообщения за день

Warcraft Обсуждение игр серии Warcraft, решение технических проблем

Ответ
 
Опции темы
Старый 18.07.2005, 21:31   #1
Мастер
 
Аватар для INCWADRA
 
Регистрация: 03.04.2007
Адрес: Сайтама
Сообщений: 391
Репутация: 92 [+/-]
Создание карт, модов для WarCraft 3

Прежде чем задать вопрос прочитайте следующее:
Полезные ссылки, программы и прочее..., Оглавление "Библиотеки Творцов"

Данная тема предназначена для решения каких либо проблем или помощи в создании карт и модов для игры Warcraft 3. Немного о наборе инструментов, которые понадобятся нам в создании и редактировании:

WorldEditor

Скрытый текст:

Автор: Blizzard Entertainment
Тип: Редактор мира Warcraft 3
Способ распространения: На диске с игрой
Язык: Русский
Версия: 1.21b
О программе:
Официальный редактор карт для вара очень удобен и вполне не сложен. Редактор похож на своего предшественника StarEdit (редактор мира StarCraft), но он все равно отличается большой функциональностью и интерфейсом. Больше информации можно узнать на Wikpedia
Альтернативные редакторы:Прочие программы:
  • War3FileConverter - программа предназначена для конвертирования моделий и текстур.
  • WC3 Image Extractor II - мощная программа для просмотра и конвертирования текстур .BLP в изображения .TGA и обратно.
  • PowerMPQ - Хороший редактор архивов вара, таких как .MPQ .W3M .W3X и т.д.
  • WinMPQ - Более старший и запатентованный редактор .MPQ
  • Jass Craft - Отличный редактор Jass кода.
  • Wc3MapOptimizer - Оптимизатор карт.
  • Warcraft III Viewer (рус.) - Просмоторщик моделей вара
  • War3 Model Editor (рус.) - Редактор моделей вара. Но на нем нельзя создавать модели с нуля.
  • Button Manager - Программа для добавление рамок к иконкам.
  • MdlVis 1.39b - Лучший в своем роде редактор моделей.
  • Справочник по триггерам
  • Еще программы вы можете найти на сайтах Wc3Campaigns, HiveWorkshop и XGM.

Полезные ссылки:

Последний раз редактировалось Emix; 04.01.2011 в 10:42.
INCWADRA вне форума  
Отправить сообщение для INCWADRA с помощью ICQ Отправить сообщение для INCWADRA с помощью Skype™ Ответить с цитированием
Старый 23.02.2007, 04:20   #801
Новичок
 
Аватар для yanichar-007
 
Регистрация: 14.08.2006
Сообщений: 43
Репутация: 6 [+/-]
Цитата:
Во, и меня тоже интересует! Ответьте кто-нибудь!
Необходимо прописать путь к стандартным частям экрана,чтобы они заменили старые.А в диалоговом окне настроек карты выбрать стандартный экран,который вы заменили.
И кстати необязательно делить на 4 части,если создаётся карта а не компания,достаточно через доп.инструменты WarCraft 3 Model Editor создать Loading Screen(загрузочный экран) выбрать текстуру в blp(по принципу можно любую,но лучше сразу с blp,а то какая то путаница иногда происходит),сохраняешь модель.
Запихиваеш текстуру и эту прямоугольную модель в карту и в окне параметров выбираешь эту модель в качестве загрузочного экрана.
__________________
Ты говоришь:"Я демон!"
Так и есть!
Со мною не видать тебе удачи!
На век моё лишь дело-зло и месть!
Для демона не может быть иначе!

Я надену пальто,
В подворотне снова темно.
На лавке мерят серёжки
Девочки кошки...
yanichar-007 вне форума  
Ответить с цитированием
Старый 24.02.2007, 15:42   #802
Nipaah
 
Аватар для SOTAR
 
Регистрация: 18.04.2006
Адрес: nyoro~n?
Сообщений: 1,396
Репутация: 230 [+/-]
Люди у меня вопрос.
Недавно начал с небольшой компанией создание РПГ мапы со своими моделями.Модели мы нашли на XGM.Вопрос:как импортировать модели в игру?Я смотрел у них на форуме но так как у них написанно у мну не получаеться.Обьясните плиз поподробней как их ипортировать.
__________________
http://musou.ru/
SOTAR вне форума  
Отправить сообщение для SOTAR с помощью ICQ Ответить с цитированием
Старый 25.02.2007, 00:15   #803
Новичок
 
Аватар для yanichar-007
 
Регистрация: 14.08.2006
Сообщений: 43
Репутация: 6 [+/-]
SA[T]AR,
Ну я делаю так:импортирую модель в игру,по ссылкам на текстуры (смотрю в War3ModelEditor) прописываю пути импортированным текстурам.
Далее присваиваю модели обьектам и всё...
Если модель рабочая,то после повторной загрузки модель будет отображена.
__________________
Ты говоришь:"Я демон!"
Так и есть!
Со мною не видать тебе удачи!
На век моё лишь дело-зло и месть!
Для демона не может быть иначе!

Я надену пальто,
В подворотне снова темно.
На лавке мерят серёжки
Девочки кошки...
yanichar-007 вне форума  
Ответить с цитированием
Старый 25.02.2007, 16:51   #804
Guest
 
Сообщений: n/a
А как можно в ВорлдЕдиторе изменять предельный уровень героев? Например на карте WarChasers я хочу поставить макс. левл 60. Подскажите плиз,заранее сорри ,если этот вопрос был

Цитата:
Сообщение от Бальназар Посмотреть сообщение
Antonidos
Я видел парочку на XGM, там раб орды с экрана кампании, ведьмак, но их ОЧЕНЬ мало.
Дай приз ссылку. Я сам сделал несколько более менее качественных текстур, хотел бы их выложить где-нить...

Последний раз редактировалось NANA; 25.02.2007 в 17:45.
 
Ответить с цитированием
Старый 28.02.2007, 14:12   #805
Guest
 
Сообщений: n/a
Exclamation

Я вот лично тоже хочу какие нибуть новые компании вот только ктонть ссылку дал-бы а то я найти не могу
 
Ответить с цитированием
Старый 02.03.2007, 20:41   #806
Игрок
 
Аватар для Бальназар
 
Регистрация: 23.09.2006
Адрес: На Краю Времени
Сообщений: 631
Репутация: 239 [+/-]
Antonidos
Цитата:
А как можно в ВорлдЕдиторе изменять предельный уровень героев? Например на карте WarChasers я хочу поставить макс. левл 60. Подскажите плиз,заранее сорри ,если этот вопрос был
Ты прав, отот вопрос задавали кучу раз. Многие от него уже бесятся
=============
Дополнительно => Игровые константы => Ставишь галочку напротив Использовать нестандартные игровые константы => Ищешь в этом огромном списке Максимальный уровень героя => Меняешь 10 на 60
=============
XGM здесь именно модели
__________________
"Carry on, you will always remember
Carry on, nothing equals the splendor
Now your life's no longer empty
Surely heaven waits for you"
Бальназар вне форума  
Отправить сообщение для Бальназар с помощью ICQ Ответить с цитированием
Старый 03.03.2007, 16:46   #807
Юзер
 
Аватар для ^i_Swep
 
Регистрация: 28.01.2007
Сообщений: 116
Репутация: 20 [+/-]
Подскажите, как можно (можно ли) из английской warez версии игры засунуть озвучку в лицензионную русскую
p.s. уже достали эти "Напьёмся крови" русского DH
^i_Swep вне форума  
Ответить с цитированием
Старый 04.03.2007, 06:42   #808
Юзер
 
Аватар для Fly-Cry
 
Регистрация: 18.02.2007
Адрес: kamchatka
Сообщений: 175
Репутация: 50 [+/-]
Цитата:
Сообщение от VASEX Посмотреть сообщение
Во, и меня тоже интересует! Ответьте кто-нибудь!
Недавно качнул с какого то сайта инфу о импорте. Могу скинуть на Email.
P.S. Так же у меня имеется много справки о варике. И есть ссылки на хорошие сайты.
Fly-Cry вне форума  
Ответить с цитированием
Старый 05.03.2007, 00:03   #809
Игрок
 
Аватар для Sl@mpD
 
Регистрация: 03.07.2006
Адрес: Казань, Петербург
Сообщений: 979
Репутация: 391 [+/-]
Народ, мы тут с друганом уже сто лет как карту решили забацать, да вот только полкарты готова, а он пишет, что предел декораций превышен... =(
Это как-нить лечится?? Или делить придёться??
__________________
"Уткани Артемца!"©.
________________________________________
www.quakelive.com/#profile/summary/SlampD
Sl@mpD вне форума  
Отправить сообщение для Sl@mpD с помощью Skype™ Ответить с цитированием
Старый 05.03.2007, 21:08   #810
Игрок
 
Аватар для Бальназар
 
Регистрация: 23.09.2006
Адрес: На Краю Времени
Сообщений: 631
Репутация: 239 [+/-]
Sl@mpD
Удаляйте декорации, или делайте карту заново...
Могу ошибаться, но другого выхода нет.
__________________
"Carry on, you will always remember
Carry on, nothing equals the splendor
Now your life's no longer empty
Surely heaven waits for you"
Бальназар вне форума  
Отправить сообщение для Бальназар с помощью ICQ Ответить с цитированием
Старый 06.03.2007, 10:02   #811
Aryan warrior
 
Аватар для Мицакулт
 
Регистрация: 18.09.2005
Адрес: Потусторонний мир
Сообщений: 1,456
Репутация: 399 [+/-]
Sl@mpD
Помоему выход есть. Я слышал о некоем редакторе (сам его не проверял) который позволяет создавать гигантские карты, без лимита на декорации. Гдето в дебрях этой темы (или другой, точно не помню) была даже ссылка на скачивание этого редактора...
__________________
Кровью героев залит наш стяг,
Вновь рветься в сечу, гордый Варяг.
Соколом белым в битву летим,
Воин Перуна непобедим! © Волколак
Мицакулт вне форума  
Ответить с цитированием
Старый 07.03.2007, 21:51   #812
Юзер
 
Аватар для ^i_Swep
 
Регистрация: 28.01.2007
Сообщений: 116
Репутация: 20 [+/-]
Цитата:
Сообщение от Sl@mpD Посмотреть сообщение
Народ, мы тут с друганом уже сто лет как карту решили забацать, да вот только полкарты готова, а он пишет, что предел декораций превышен... =(
Это как-нить лечится?? Или делить придёться??

Цитата:
Сообщение от Мицакулт Посмотреть сообщение
Sl@mpD
Помоему выход есть. Я слышал о некоем редакторе (сам его не проверял) который позволяет создавать гигантские карты, без лимита на декорации. Гдето в дебрях этой темы (или другой, точно не помню) была даже ссылка на скачивание этого редактора...
http://xgm.ru/files.php?do=search&ti...esc&perpage=50
прога WE Unlimited 1.20 - наверно она, сам не пробовал
p.s. 100% лениво в дебрях темы искать

Последний раз редактировалось ^i_Swep; 07.03.2007 в 22:05.
^i_Swep вне форума  
Ответить с цитированием
Старый 09.03.2007, 16:37   #813
Безликий клятвопреступник
 
Регистрация: 08.03.2007
Сообщений: 189
Репутация: 66 [+/-]
---

Последний раз редактировалось IKS; 04.07.2018 в 19:05.
IKS вне форума  
Ответить с цитированием
Старый 09.03.2007, 20:29   #814
Игрок
 
Аватар для Бальназар
 
Регистрация: 23.09.2006
Адрес: На Краю Времени
Сообщений: 631
Репутация: 239 [+/-]
IKS
А модели-то хорошие делаешь?
^i_Swep
Цитата:
прога WE Unlimited 1.20 - наверно она, сам не пробовал
Она. Другой вроде ещё нет. =) Но говорят она сильно залажена.
__________________
"Carry on, you will always remember
Carry on, nothing equals the splendor
Now your life's no longer empty
Surely heaven waits for you"
Бальназар вне форума  
Отправить сообщение для Бальназар с помощью ICQ Ответить с цитированием
Старый 10.03.2007, 09:12   #815
Безликий клятвопреступник
 
Регистрация: 08.03.2007
Сообщений: 189
Репутация: 66 [+/-]
---

Последний раз редактировалось IKS; 04.07.2018 в 19:05.
IKS вне форума  
Ответить с цитированием
Старый 13.03.2007, 16:50   #816
Юзер
 
Регистрация: 11.03.2007
Сообщений: 107
Репутация: 53 [+/-]
Exclamation F.A.Q. по World Editor'у (для новичков)

С чего начать?
Скрытый текст:
С ландшафта, и это неизбежно. Конечно, если речь идёт просто о тренировке каких-то отдельных аспектов, например, изучении триггерных команд, то разумнее оставить пустое пространство, натыкать на нём нужные юниты и разбираться с ними, не морочась красивым оформлением. Однако, если речь идёт о карте типа Melee (одиночные или командные бои с развитием) или о попытке сделать кампанию/РПГ, то с ландшафта как раз и следует начинать.
По умолчанию генерится пустая карта с оформлением Lordaeron Summer ("Лето в Лордейроне"). Если вам нужна другая схема оформления (tileset), закройте эту карту, создайте новую и выберите нужную схему.
В левом нижнем углу увидите три папки: terrain (местность), units (юниты) и doodads (всякая оформительская всячина вроде анимированных объектов, деревьев, бочек и т. п.).
От этой печки, как говорится, и будем плясать. В целом, законы создания красивого игрового ландшафта очень просты:
Никаких прямых углов и правильных геометрических фигур, если они не обоснованы сюжетом. "Кисти" для ваяния ландшафта могут иметь круглую или прямоугольную форму и самые разные размеры: там, где прошлась крупная кисть, следом в дело вступает мелкая, иначе получится очень ненатурально.
Для пущего реализма существует редактор/рандомайзер высот (terrain > height), c его помощью получаются очень красивые ямы и высокие холмы (без уступов). Полезный инструмент.
Без деревьев и прочих doodads карта смотреться не будет. Использовать их, впрочем, следует не без оглядки, поскольку аппетиты некоторых анимированных doodads к системным ресурсам не отличаются скромностью.
Следует по возможности избегать склонов (terrain > любой cliff > ramp), расположенных под углом 0° или 90° к зрителю, поскольку, в силу специфики геометрии и размещения текстур, очень отчётливо могут "светиться" швы и "квадраты" по краям у основания склона. Если склон располагается под другим углом, это не так заметно.

Это общие рекомендации. Что касается типов карт, то в отношении Melee Maps следует помнить, что все игроки должны находиться в равных условиях, а следовательно, если на карте имеются какие-то стратегически важные объекты, до которых игрокам следует добираться как можно быстрее, то расстояния от стартовой точки до этого объекта у каждого игрока должны быть одинаковыми. Точно так же и пункты развития (группы Creeps, за счёт которых качается ваш герой, дополнительные шахты и прочие ресурсы) должны располагаться на карте мало-мальски симметрично.
Спецэффекты вроде дождя, тумана и прочего добавлять, как говорится, по вкусу. Впрочем, эти самые спецэффекты назначаются не только на всю карту в целом, но и на отдельные регионы (Regions), а о них речь пойдёт ниже.

Карта со сценарием
Скрытый текст:
Карта, в которой происходит что-то, помимо кромешной рубки, оснащённая каким-либо сюжетом - это как раз то самое "наше всё". Самый простой тип - это Campaign Map, карта, представляющая собой часть самодельной кампании. Но, если заглянуть, например, сюда, то можно увидеть, что, помимо карт типа Melee и Campaigns, представлены и ещё целый ряд классов. Например, Altered Melee, где, в частности, проработаны другие расы, кроме шести базовых (Humans, Orcs, Night Elves, Undead, Naga и Draenei). К ним добавлены ещё всякие Trolls и прочие Creeps, так что там и свои крестьяне, и свои колдуны есть, и всё это доступно с помощью World Editor. Главное - знать, как.
Впрочем, поскольку статья адресована, прежде всего, начинающим, ограничимся несложной Campaign Map с несколькими "кинороликами".
"Слон", на котором всё держится - это Triggers (триггеры). Триггер (дословно переводится как "курок") - основа всего, что происходит в игре. Это даже не функция, это принцип. Триггер состоит из событий (Events), обязательных и необязательных условий (Conditions) и действий, следующих за событием при соблюдении условий, если те выставлены (Actions). Внутри Actions, кстати, тоже имеется возможность выставлять условия Conditions, что весьма увеличивает свободу манёвра (при умении всем этим пользоваться).

http://www.computerra.ru
http://www.hiveworkshop.com
http://xgm.ru/files.php?section=wc3&...page=50&page=2 - Всем известный ХГМ, присутствует множество моделек, кампаний, карт.

Последний раз редактировалось Sainor; 22.09.2007 в 13:42.
sfawn вне форума  
Отправить сообщение для sfawn с помощью ICQ Ответить с цитированием
Старый 13.03.2007, 18:05   #817
Guest
 
Сообщений: n/a
Вот про триггеры и расскажи. Меня очень интересует, как можно заставить юнита двигаться к точке, всё перепробовал, найти не могу.
 
Ответить с цитированием
Старый 13.03.2007, 18:40   #818
Юзер
 
Регистрация: 11.03.2007
Сообщений: 107
Репутация: 53 [+/-]
Основные вопросы

Скрытый текст:
Q - Как сделать, чтобы герой мог качаться выше 10-го уровня ?
A - Нужно зайти в меню "Игровые Константы"(Главное Меню -> Дополнительно -> Игровые Константы), поставить галочку "Использовать нестандартные игровые константы" и изменить значение поля "Максимальный уровень героя" на нужное. Так можно редактировать и другие игровые константы
.
Q - Как сделать, чтобы герой мог получать опыт, убивая монстров, выше 5-го уровня ?
A - Нужно зайти в меню "Игровые Константы"(Главное Меню -> Дополнительно -> Игровые Константы), находим переменную "Набираемый опыт героем: таблица сокращения монстров". Там значения "80, 70, 60, 50, 0" - это означает что на 1-м уровне мы получаем 80%, 2-м - 70%, 3-м - 60%, 4-м - 50%, 5-м - 0, 6-м и далее так же как на 5-м.
Что можно сделать: если хотите сохранить штрафы за уровень, то продолжайте ряд до нужно уровня (можно изменить сами проценты). Если же хотите на всех уровнях одинаковый процент, то надо поставить одно число, например 100.
Q - Не могу открыть некоторые карты типа DotA Allstars! Выдаёт ошибку и не открывает!
А - Есть два основных варианта. Либо карта делалась в Worleditor Unlimited (ссылка в оглавлении раздела "Творцы миров") либо карта защищена. Про защиту карт и как её снять - см. соответствующие статьи в "Библиотеке Творцов".
.
Q - Как мне сделать, чтобы никто не смог играть вместо компьютера ?
А - Нужно зайти в Свойства игрока (Главное меню->сценарий->свойства игрока), выбрать у нужного игрока в колонке "управляет" компьютер, затем зайти на закладку "кланы" и поставить две галочки :"Нестандартные кланы" и "Фикс. параметры клана"
.
Q - Видел во многих картах при загрузке текст и изображение как в кампании, как мне тоже так сделать ?
А - нужно зайти в "Экран загрузки карты" (Главное меню->Сценарий->экран загрузки карты), поставить переключатель "изображение на экране загрузки" на "экран кампании", затем выбрать нужный экран в выпадающем списке. Текст можно вставить в текстовой области ниже.
.
Q - Как мне сделать ,Чтобы в определенном месте была своя погода / музыка ?
А - Нужно в этом месте создать область и в ее свойствах поставить галочку "погодный эффект" , затем из выпадающего списка выбрать нужный.Аналогично и с музыкой , только вы не сможете поставить музыку региону ,пока не объявите ни одной мелодии в редакторе звука.
.
Q - Я хочу создать карту с разными типами ландшафтов — зимним, подземным и другими. Можно ли это сделать, и как?
A - Да ,можно, зайдите в меню типов ландшафта(Главное меню->дополнительно->изменить тип ландшафта) там поставьте галочку нестандартный тип ландшафта. Теперь вы можете добавлять и убирать различные текстуры поверхности, но все же редактор накладывает некоторые ограничения, их можно обойти с помощью Zepir's map editor.
.
Q - Я сделал на триггерах сценку с довольно сложным маршрутом камеры. Когда я проверю ее из редактора она не верно движется , в чем дело ?
A - в редакторе задействованы далеко не все возможности движка вара,поэтому он не можетв некоторых случаях верно переместить камеру, посмотрите эту сценку из игры.
.
Q - Я сделал карту, но компьютерный противник не предпринимает каких-либо действий, как исправить ?
A - Нужно запустить AI-скрипт действием ИИ - Start Campaign AI script. Скрипты, поставленные вместе с игрой : human.ai - за альянс, udead.ai - за нежить , orc.ai - за орков и elf.ai - за ночных эльфов.Можно разработать свой ИИ с помощью редактора ИИ.
.
Q - Как мне сделать,чтобы игроки начинали только на своих стартовых позициях и с заднной расой ?
A - Зайдите в "Свойства игрока" (Главное меню->сценарий->свойства игрока) и у нужных игроков поставьте галочку "Фикс исх.позиция".Затем перейдите на закладку "Кланы" и поставьте две галочки :"Нестандартные кланы" и "Фикс. параметры клана"
.
Q - Как мне сделать, чтобы не было юнитов и здания ,которые создаются в самом начале,так же неплохо чтобы не давались вначале ресурсы игрокам... ?
А - Удалите триггер Иниц.Сражения в редакторе триггеров.
.
Q - Что значит Камень включен/отключен ?
A - Когда камень включен, юниты иногда будут с вами разговаривать - как в игре - и проигровать анимацию смерти, если вы их удаляете с карты.
.
Q - Когда я играю на своей карте, я вижу весь рельеф, как это предотвратить?
A - Откройте параметры карты (Главное меню->Сценарий->Параметры карты) и уберите галочку "Скрытые области частично видимы"
.
Q - Почему мои мосты летают над землей?
A - Их высоту можно отрегулировать с помощью следующих комбинаций клавиш :
Ctrl+Page Up - поднять выше
Ctrl+Page Down - опустить ниже
.
Q - Как запихать герою в инвентарь больше 6и предметов?
A - Никак. Но можно имитировать расширенный инвентарь при помощи триггеров.
.
Q - Могу ли я увеличить макс. лимит еды ?
A - Нужно зайти в меню "Игровые Константы"(Главное Меню -> Дополнительно -> Игровые Константы), поставить галочку "Использовать нестандартные игровые константы" и изменить значение поля "Ограничение пищи" на нужное значение. Так можно редактировать и другие игровые константы
.
Q - Как избавиться от стартовых локаций?
A - Никак.
.
Q - Как я могу сделать так, чтобы тени от холмов отображались в игре?
A - Главное меню->Рассчитать тени и сохранить.
Q - Как переделать интерфейс (меню, окошки и т.п.) на нарисованные своей рукой?
A - Экспортировать из архива игры нужные текстурки интерфейса, например UI\Console\Human\HumanUITile01.blp, затем конвертировать их в tga, перерисовать (не забываем про альфа-канал), опять в blp конвертировать, потом импортировать на карту и прописать нужный путь, тот, который был у изображения.
Аналогично импортируются курсоры, текстуры почвы и многое другое, надо лишь установить имя файла и путь к файлу как у исходной текстуры.
.
Q - Как сделать так, чтобы вода стекала со склона вниз?
A - В меню "Дополнительно", и снимаем галочку напротив пункта "Ограничение уровня воды". Теперь можно воду вниз по утесам пускать... да и вверх тоже .
Object Editor
Q - Видел в некоторых картах способности ,которых нету в игре, как так ?
A - эти способности картостроители сделали сами, но на основе уже существующих. Можно сделать такую самому, нужно открыть редактор объектов и перейти на закладку "Способности". Далее нажать на кнопку "создать нестандартную способность" и выбрать и списка уже существующих способностей. Создастся способность ничем не отличающаяся от выбранной в списке. Теперь вы можете изменять некторые хар-ки этой способности и в результате получите новую.
.
Q - Почему не получается в редакторе объектов вписать отрицательные значения?
A - Очень просто. Ищете в меню "Файл" - "Параметры" - в разделе "общие" ставите галочку в пункте "разрешить использовать отрицательные значения". Готово.
Если же всё никак не получается вписать нужное значение в строке, то сделате так: вместо двойного клика по строке делаете Shift+двойной клик. Теперь можно вписать.
.
Q - Как сделать, чтобы Крест перерождения снова восстанавилвал всю ману и жизни ?
A - Найдите способность "Предмет : Перерождение" и измените значения полей "Данные - восстановленная мана" и "Данные - восстановленное здоровье" на максимальные.
.
Q - Как мне преодолеть барьер в 4 способности у предмета ?
A - Это действительно очень сложно к тому же еще и чревато.Но иногда можно обойти эту гору стороной.Все вещи используют способности, в способностях заключен эффект этих вещей.А их можно редактировать на закладке "Способности".Заклинания вещей лежат в папке Особые->Предметы. Так, например, если вам нужно , чтобы предмет добавлял 100 к повреждению можно отредактировать способность "Предмет : Повышение силы атаки (+3)" , поменяв ей значение поля Данные- дополнительная атака с 3 до 100.
.
Q - Как из НеГероя сделать Героя ?
A - Никак , можно только создать героя на основе уже существующего и перекопировать основные хар-ки НеГероя.
.
Q - Как сделать ,чтобы мои здания могли строится на всех типах текстур ?
A - Найдите ваше здание в object editor'e на закладке "Войска" и в поле "Пути-Требования к расположению" уберите все галочки.
.
Q - Я видел в некоторых картах юнитов из StarCraft ,как мне таких тоже получить ?
A - Эти юниты лежат в Войска->Нейтрально-пассивные->Кампания->войска.
.
Q - Как сделать так,чтобы юнит "апгрейдился" в другой?
A - Если ваш юнит - здание, то найдите его в object editor'e на закладке "Войска" и в поле "Технология - улучшается до" Выберите здание для апгрейда.
Если же юнит - боевая единица, то нужно использовать заклинание "Сфинкс". Создайте новую способность на основе "Сфинкс"a, в поле "Альтернативная форма боевой единицы" выберите нужную боевую единицу для апгрейда и дайте эту способность вашему юниту.
Чтобы сделать так, чтобы после апгрейда юниты превращались в других (как охотники за головами в берсерков у орков), то используйте способность "Chaos" ("Тёмный" в русской версии).
.
Q - Как сделать так, чтобы ящики нельзя было сломать?
A - Самый простой способ - в редакторе объектов. В разделе "Разрушаемые декорации" находим нужную декорацию, и в строке "Бой - Тип цели", ставим галочку напротив пункта "Неуязвимые".
.
Q - Как сделать так, чтобы иконка юнита/способности и т.п. находилась в том поле на панели приказов, на каком я хочу? (а то они кое-как расположены)
A - Очень просто. В редакторе объектов есть поля "Положение кнопки - X" и "Положение кнопки - Y". Они определяют положение кнопки на панели приказов. Чтобы узнать какие координаты определяют какое положение, воспользуйтесь этой таблицей (7 Кб).
Triggers
Q - Как закрепить камеру за юнитом ?
A - Это может сделать действие "Камера-Lock camera target to unit"
Пример:
Код:
Lock camer target for Игрок 1 (красный) to Пехотинец 0000<gen> offset by (0.00,0.00) using поворот по умолчанию.
Q - Как сделать таймер ?
A - Для этого есть тип действий "Обратный отсчет". Здесь одним действием не обойтись,для начала нам нужна переменная таймера, ее можно завести в редакторе переменных (нужно создать новую переменную и в выпадающем списке "Тип переменной" выбрать "Таймер" .Теперь начинаем таймер действием Start Timer.Вообще таймер- штука не визуальная => нужно руками добавить окно действием Create Timer Window. И наконец показываем окно show\hide window. Eсли нужно настроить цвета таймера, то для этого есть действия Change timer window **** color . Еще не плохо было бы обеспечить уничтожение таймера ,когда он оттикает свое. Вот пример:
Код:
Обратный отсчет - Start VASA as a Однократный timer that will expire in 30.00 seconds
Обратный отсчет - Create a timer window for VASA with title TIMER
Обратный отсчет - Показать (Last created timer window)
Wait 30.00 seconds
Обратный отсчет - Скрыть (Last created timer window)
Обратный отсчет - Destroy (Last created timer window)Лучше конечно, было бы уничтожать таймер в оттдельном триггере, но это только пример.
.
Q - Как в процессе игры добавлять или отнимать силу/ловкость/интеллект героя ?
A - Действием Герой-Modify hero attribute. Пример
Код:
Герой - Modify Сила of Верховный маг 0011 <gen> Добавить 10.
Q - Как в процессе игры добавлять или отнимать умения юнитов ?
A - Действиями Боевая единица-Add Ability и Боевая единица-Remove Ability.Пример
Код:
Боевая единица - Add Безумие to Пехотинец 0000 <gen>.
Q - Как сделать окошко на котором можно кнопочки нажимать ?
A - Для этих целей существует тип действий "Диалог". Для создания такого окошка нужно сначала завести переменную типа диалог в редакторе переменных и массив переменных типа "Кнопка". Затем поменять надпись которая будет высвечиваться при показе диалога, создать для него кнопки и показать.Пример
Код:
Диалог - Change the title of Dialog to Вы любите WarCraft 3? //меняем заголовок окна
Диалог - Create a dialog button for Dialog labelled Да //создаем кнопку с надписью "Да"
Set Buttons[1] = (Last created dialog Button)//присваеваем ячейке номер 1 массива Buttons значение только что созданной кнопки
Диалог - Create a dialog button for Dialog labelled Нет //создаем кнопку с надписью "Нет"
Set Buttons[2] = (Last created dialog Button)//присваеваем ячейке номер 2 массива Buttons значение только что созданной кнопки
Диалог - Показать Dialog for Игрок 1 (красный)//показывем окошкоНо теперь вам необходимо знать ,какую кнопку нажал игрок. Для этого создайте новый триггер, в нем поставьте собите - Диалог - Dialog button click
Этот триггер будет выполнятся, когда пользователь нажмет любую кнопку в выбранном диалоге. Но как узнать какую конкретно ? теперь в этом триггере создаем действие If / then / else multiple functions и в нем делаем проверку условием Dialog buttons compasition
Q - Видел в некоторых картах небо, а у меня оно черное, как сделать нормальным ?
А - Это легко делается триггером Окружение - Set Sky. Пример :
Код:
Окружение - Set sky to Фелвудское небоМожно и в редакторе установить. Меню: Сценарий => Дополнительно => Показ неба.
.
Q - Как сделать такую таблицу ,где отображаются все игроки и их очки ?
А - Это тип действий "Таблица рекордов" (или LeaderBoard).Создаем эту таблицу действием Таблица рекордов - Create. Затем ее нужно показать действием Таблица рекордов - Show/hide.Теперь неплохо было бы в нее добавить игроков , делается действием Таблица рекордов - Add player. Убираем игрока с помощью Remove player. Различные Change ******* это изменение цветов, надписей и значений для таблицы рекордов. Самое важное из них - это Change player value - меняет значение очков какого-либо игрока.Так же есть возможность сортировки действием "Таблица рекордов - Sort".
примерчик
Код:
Таблица рекордов - Create a leaderboard for (All players) titled leaderboard ! Cool !
Таблица рекордов Add Игрок 1 (красный) to (Last created leaderboard) with label Очков у красного : and value 0.
Q - Я создал таблицу рекордов,но она у меня не показывается, почему?
A - Если ваша Таблица рекордов создается при инициализации карты, то поставьте действие Wait на 1 секунду перед показом перед показом. По устройству движка WarCraft 3, таблица рекордов не отображается при инициализации.
.
Q - Как мне открыть ворота ?
А - Действием Декорация - Open / Close / Destroy gate. Пример
Код:
Декорация - Открыть врата демонов (З-В) 0000 <gen>.
Q - Я создаю триггером погодный эффект (например дождь), вроде все правильно, но в игре его нет! Почему?
A - Не забудьте поставить еще одно действие:
Код:
Enable (Last Created Weather Effect).
Q - Как проиграть какую-то конкретную анимацию юнита?
A - Используйте действие:
Код:
Custom script: call SetUnitAnimationByIndex(unit, n)Где unit - ваш юнит
n - число соответствующее порядковому номеру нужной анимации.
.
Q - Как мне сделать, чтобы не было игровой панели ?
А - нужно включить режим ролика действием
спецэффекты - cinematic mode.
Q - Как налепить на юнита спецэффект ?
А - Действием спецэффект- Create Special Effect on unit.
Код:
Спецэффект - Create a special effect attached to the overhead of Работник 0000 <gen> using Abilities\spells.......
Q - К какому месту на юните можно прилепить спецэффект ?
А - Вот основные :
overhead - над головой
head - на голове
chest - грудь
origin - на земле, возле ног. Обычна сюда цепляют ауру
hand - рука
foot - нога
weapon - оружие
Уточнения (например, left hand, right hand и т.д.)
left - левый(ая)
right - правый(ая)
.
Q - Как мне изменить начальное количество золота/дерева для игрока?
A - В триггере "Иниц. Сражения" добавьте действие Игрок-Set property, в котором выберите в нужные параметры.
Q - Как сделать так, чтобы после игры нельзя было сохранить реплей ?
A - Нужно добавить в триггер инициализации следующее действие:
Код:
Custom script: call DoNotSaveReplay().
Q - Как сделать так, чтобы камера тряслась, как при землетрясении?
A - Действием Камера-Sway Camera Source, но учтите, вы должны поставить в цель камеры текущую,чтобы это сработало и задать высокие параметры Velocity и Magnitude для "похожести" на землетрясение.
Код:
Камера - Sway the camera source for Игрок 1 (красный) with magnitude 1000.00 and velocity 1000.00Q - Можно ли воскресить мёртвого героя без алтаря/таверны?
A - Можно. Действием:
Код:
Hero - Instantly revive [unit] at [location], [Показать/скрыть] revival graphics

http://www.blizzard.ru
sfawn вне форума  
Отправить сообщение для sfawn с помощью ICQ Ответить с цитированием
Старый 13.03.2007, 19:00   #819
Юзер
 
Регистрация: 11.03.2007
Сообщений: 107
Репутация: 53 [+/-]
Триггеры часть №1

Цитата:
Сообщение от AandJ Посмотреть сообщение
Вот про триггеры и расскажи. Меня очень интересует, как можно заставить юнита двигаться к точке, всё перепробовал, найти не могу.
Вот все, что нашел про триггеры:
Структура триггера: события, условия и действия
Скрытый текст:
Перед тем как непосредственно перейти к триггерам (к программированию), посмотрим на рабочую область и самые основы.
Каждый триггер должен находиться внутри какой-нибудь папки. Триггер состоит из трех частей: событий (events), условий (conditions) и действий (actions). Также у триггера есть собственное имя, которое, как и имя файла, не может содержать спецсимволов (в т. ч. знак подчеркивания, зато можно использовать пробелы) и может быть только на английском языке (папки могут быть на русском).
В верхней части окна редактора триггеров имеется пять кнопок, управляющих процессом создания триггеров. Первая из них - создание новой папки для триггера, вторая - создание нового триггер, последние три кнопки отвечают за добавление в триггер новых событий, условий и действий.
Принцип действия следующий: игра - это последовательность событий (например, начало игры - событие, юнит атаковал юнита - событие, герой повысился в уровне - событие, игрок передал сообщение в чате - событие). Когда в игре происходит какое-либо событие, то событие, указанное в триггере, сопоставляется со случившимся. Если совпадение есть, то происходит второй этап, на котором проверяется выполнение условий триггера. Условия должны уточнить, когда нужно производить действие, а когда - нет. Если условия выполнятся (об этом подробно расскажу ниже), то произойдет третий, финальный этап - будет выполнено действие этого триггера. Например, перед нами задача: сделать так, чтобы когда герой (определенный, а не любой!) подойдет к порталу, он переносился бы в другое место. Событием здесь будет приход юнита в регион вокруг портала, а условие должно уточнить, что этим юнитом должен быть определенный герой. Действие - перенос юнита в другое место. Итог: если событие произошло и условия выполнены, то выполняются действия триггера.
Еще у триггера есть два флажка (в окне редактора расположены сверху): включен (enabled) и изначально включен (initially on). По сути они имеют одинаковый смысл, за одним исключением: если триггер "отключен", то его никак нельзя включить, ибо он вообще отсутствует в игре (это важный момент), если он "изначально выключен", то его можно включить в игре. В первом случае все ясно - триггера просто нет в игре, а вот второй следовало бы разобрать. У триггера есть "флажок", который отвечает за то, включен ли он. "Отключенное" состояние равносильно тому, что у триггера нет никаких событий (но его можно вызвать из другого триггера). Этот флажок можно включать и выключать по ходу игры (для этого есть специальные действия), т. е. "включать / выключать" триггер. Флажок "изначально включен", соответственно, отвечает за его состояние "по умолчанию". Кстати, есть возможность подключать и отключать отдельные команды внутри любого триггера. Щелкните на команду правой кнопкой и выбирете пункт включить функцию (enable function). "Включать / выключать" функции по ходу игры невозможно.
Говоря про отключение триггеров, нельзя забыть про один аспект. Итак, как только произошло нужное событие и выполнены нужные условия, то триггер приводится в действие. Но дело в том, что почти все триггеры - многоразовые. Если снова произойдет нужное событие и снова выполнены условия - триггер запускается еще раз. Одноразовыми можно считать триггеры, заданные событиями map Map Initialization и Time Elapsed, поскольку эти события происходят один раз. Следовательно возникает проблема: как отключить триггеры. Например, нам нужно сделать так, чтобы когда герой приходил в определенный регион, он перемещался в другое место, но только один раз. Значит, нужно позаботиться, чтобы после первого выполнения триггер отключался. Предлагаю Вам один из способов это осуществить: в каждый триггер, который нужно отключить вставляете строчку действие Trigger - Turn off (This trigger). Это действие отключает триггер.
Примечание: на самом деле можно просто не добавлять триггеры событий изначально, это тоже самое что и "изначально выключен". Но тогда зачем вообще нужно включение / выключение? Предположим, что у какого-то триггера есть события, но работать они должны не сразу. Т. к. у нас нет возможности добавлять события триггеру по ходу игры, тут нам может помочь только выключение триггера. Верно и обратное - иногда триггер приходится отключать (а потом опять включать). Если у Вас есть возможность использовать такой метод, вместо условий - пользуйтесь им. Это гораздо более "красивое" решение.
Еще у каждого триггера есть поле, где автор может оставить свои комментарии. Это поле находится прямо над "окном" со списком функций триггера.
События, условия и действия все вместе называются функциями триггера, (назвали это так Blizzard в хелпе редактора).
Некоторые из тех, кто еще не освоил WE, говорят, что не могут понять, как работают триггеры, потому что в них слишком много различных команд. На это я могу возразить - Вам, скорее всего, не понадобится и четверти тех команд (особенно поначалу). Да, если Вы владеете английским языком, то изучать триггеры будет намного проще.
А теперь, очень рекомендую вам открыть редактор и познакомиться с основными событиями, условиями и действиями, которые есть в редакторе.

Переменные, выражения, функции
Скрытый текст:
Переменные (variables) ассоциируются с определенными игровыми объектами. Т. к. я не исключаю, что эту статью читают люди, никогда не занимавшиеся программированием, я опишу понятие переменной.
Иногда (даже очень часто) нам требуется запомнить какую-то информацию. Например, допустим мы хотим реализовать тот же прием, что и в кампании за нежить ТФТ - помните в первой миссии люди бегут к областям, а нежить должна их перехватить. Если человек добегает до области, он исчезает из игры и считается спасшимся. Если спасется более 10 человек, нежить проигрывает. Чтобы реализовать такое, нам нужно запоминать количество спасшихся юнитов. Создаем переменную i, и в нее будем записывать число спасшихся людей. При входе человека в регион r, мы его убираем, а значение i увеличиваем на 1. Если i>10, нежить проигрывает.
Во многих случаях можно обойтись без переменных, но при должном умении переменные дают возможность намного упростить решение триггерных задач. Более того, некоторые задачи - такие как работа со спецэффектами, диалогами, таблицами записей, мультибоардами и др. - по нормальному просто невозможна без переменных.
Не бойтесь использовать много переменных! В большинстве случаев гораздо удобнее составлять карту из "кусков" - наработок / разработок. И это отличный пример использования переменных ради удобства. Гораздо удобнее настраивать наработку с помощью переменных (хотя не факт, что настройка делаются именно с помощью переменных), чем лезть в её код, хотя в обоих случаях будет один и тот же результат (зато разные временные затраты и количество потраченных нервов). Еще это может сэкономить количество функций в триггере, если в паре с переменными (массивами) использовать циклы. Но об этом позже. Сейчас же запомните, что не следует бояться переменных, пусть их даже будет много, хотя, конечно, не стоит создавать их тоннами (очень на многом можно сэкономить). Но у всего есть своя цена - будет глупо, если вместо того, чтобы воспользоваться одной переменной, мы напишем 100 строк кода, только для того, чтобы не вводить новую переменную.
У переменных есть типы, соответствующие разным "видам" данных. Ведь число отличается от юнита, верно? Мы ведь не можем сделать с числом то, что можем сделать с юнитам (например, отдать приказ числу). Поэтому и появилась необходимость в типах, чтобы не возникало таких "ошибок". Вот список основных типов. Использовать другие типы приходится достаточно редко, но принцип тот же, поэтому разобрать самостоятельно не должно вызвать трудности.
Логический (boolean)
Целое число (integer)
Рациональное число (real)
Строка (string)
Юнит (unit)
Типы юнита (unit type)
Квест (quest)
Спецэффект (special effect)
Регион (region)
Игрок (player)
Для переменной каждого типа есть специальные функции. Например, в переменную целого типа с помощью этих функций можно помещать такие параметры, как количество юнитов у определенного игрока (в том числе и количество юнитов определенного типа как на всей карте, так и на определенном регионе / у определенного игрока), количество золота или леса у игрока, количество еды, которую производят фермы и т. д. В рациональные переменные можно помещать число Пи, количество жизней или маны у определенного юнита, угол поворота юнита, координаты юнита на карте и т. д.
Примечание: разница между целочисленной и рациональной состоит в том, что целочисленная может содержать только целые числа, в то время как рациональная - любое дробнорациональное. Но лично я рекомендую использовать их по назначению! Например, если Вы уверены, что какой-либо переменной будут присваиваться только целые значения, делайте её целой. Нагрузка на процессор при работе с этими типами разная - у рациональных она выше.
Но далеко не обязательно, чтобы значение переменной было конкретным значением, вроде i = 4. Переменной можно присвоить выражение. То есть, i = 2 * 2 запишет в переменную то же самое (конечно, я пишу это не в виде триггеров, но в общем, надеюсь, понятно). Можно дать значение какой-нибудь переменной в зависимости от другой переменной: что-нибудь вроде i = j * 5. В результате в i будет записано значение, "полученное" от j * 5. Такое выражение возвращает какое-то значение. Это нужно понимать. Возвращаться могут не только цифры, а любые объекты (но только те, у которых есть свой тип переменных): юниты, строки, игроки...
Примечание не сразу может быть понятно слово возвращает. Никто ни у кого ничего не брал в долг. Более подробно это можно описать следующим образом: вместо самого выражения будет подставлен результат его выполнения.
Также бывают массивы переменных. Массивы - это множество переменных с одинаковым именем и типом, но разными номерами (индексами). Обращаться к элементу массива нужно по образцу: <имя переменной> [<номер элемента массива>]. Пример:
Set i[0] = 2
Set i[1] = 5
Set i[3] = 8
Set i[5] = 7
Соответственно, i - массив типа integer. Не обязательно, чтобы индексы (эти самые номера) шли по порядку. Можно использовать отрицательные индексы. Однако массив ограничен - [-8192...8192]. То есть, элемента с номером 8193 существовать не может, а при попытке присвоить / читать такой элемент он просто вернет 0 (а значение не будет присвоено, никаких предупреждений об ошибках). Подробнее о массивах мы поговорим позже. Особенно их удобно применять в паре с циклами.
Теперь рассмотрим понятие функций и возвращаемых ими значений. Функция - некий "кусок" кода, который можно "вызывать". Это как выражение, только гораздо более расширенное - с его помощью можно получить количество юнитов в группе, количество жизней или маны у юнита и т. п. Она точно так же "возвращает" значения, хотя далеко не обязательно вообще что-либо возвращает (на этом мы останавливаться в пределах данной статьи не будем). Первый пришедший в голову пример: функция (действие), возвращающая уровень героя. В результате работы следующего "куска" триггера, в Level будет записан уровень героя Hero. Из редактора невозможно копировать русские буквы, поэтому все примеры триггеров будут в английском варианте (дабы не запутаться, переменные я буду подчеркивать).
Actions
Set Level = (Hero level of Hero)
Возвращаемое значение не обязательно должно быть числом. Возвращаться может и юнит... Вот, например, следующий код:
Actions
Unit - Create 1 Town Hall for Player 1 (Red) at (Center of (Playable map area)) facing Default building facing (270.0) degrees
Set TownHall1 = (Last created unit)
В результате переменная TownHall1 ссылается на нового юнита. Blizzard довольно странно сделали некоторые вещи, и примером таких "странностей" может служить как раз этот код. (Last created unit), по сути, тоже является функцией. Неужели не было легче сделать так, чтобы сама функция создания юнита возвращала только что созданного юнита?..
Примечание: переменная ссылается на юнита! Не юнит переходит в переменную, а переменная ссылается на юнита. Грубо говоря, при её считывании она "вернет" этого юнита. Конечно, на одного и того же юнита могут ссылаться сразу несколько переменных.
Выражения могут быть использованы в паре с функциями, что чаще всего и делается.
Чтобы создать переменную, Вы должны быть в редакторе триггеров. Нажмите переменные (edit => variables...) или просто нажмите кнопку с крестиком. Здесь Вы сможете создавать переменные или изменять уже созданные. Редактор переменных можно запустить прямо во время создания некоторых триггеров, нажав на кнопку изменить (edit variables) (очередной пример неудачного перевода).
Переменная включает следующие параметры: имя (должно быть уникальным), тип, начальное значение (не обязательно). Возможно также создание массивов переменных (во время создания переменной устанавливаете флажок). После того, как переменная создана, появляется возможным использовать ее при создании триггеров.
Я бы хотел отдельно и подробно описать тип boolean, также называемый "бул" или логический тип. Не стоит забывать, что статья предназначена и для людей, не занимавшихся программированием.
Бул может принимать два значения: истина (true) и ложь (false). Где это можно применить? Давайте рассмотрим простой пример.
Где-то в середине игры нам нужно узнать, проходил ли герой в каком-то регионе за все время игры. Вроде бы, легко - просто делаем триггер, ставим как условие заход юнита в регион... а что потом? Нужно где-то сохранить "факт" захода юнита в регион. Первое, что приходит в голову (в том случае, если мы не знаем ничего о булинах) - сделать целочисленную (integer) переменную и дать ей значение 1 (а по умолчанию оставить 0). Вот тут-то и вспоминаем про булины. Гораздо лучше воспользоваться средствами, "заточенными" под эти цели - булинами. Ставим значение истина (по умолчанию - ложь) и все.
Примечание: конечно, можно использовать единицу и ноль, или даже строки "да" и "нет", но гораздо лучше воспользоваться булинами. Хотя бы по той причине, что именно булины используются во всех проверках (if'ы, условия). Да и потом - зачем извращаться, когда есть предназначенные для чего-то конкретного средства?
Кстати, булин в памяти занимает, меньше, чем число (integer), рациональное число (real) и, тем более, строка.
Вернемся к условиям. Чтобы условие "выполнилось", оно должно "вернуть" истину ("условия" бывают не только как условия в триггере). Чтобы "вернуть" истину, его "высказывание" (само условие) должно быть истинным. Рассмотрим пример "на словах": эта статья - статья о триггерах. Это правда? Правда. Если это рассматривать как условие, то при его проверке оно "вернет" истину. Рассмотрим пример на триггерах:
Conditions
(Triggering unit) Equal to Footman 0000
Это - условие. Если (Triggering unit) (что это такое, рассмотрим позже) это тот же юнит (Equal to), что и Footman 0000 , то это высказывание истинно и вернет истину. Рассмотрим еще один пример:
Conitions
False Equal to False
Так как ложь действительно является ложью, это высказывание истинно, а значит вернет истину. Еще пример:
True Not equal to False
Думайте, оно вернет ложь? Нет, оно вернет истину. Обратите внимание: Not equal to! То есть, не равен. Это высказывание верно (действительно, истина не есть ложь), а значит вернет истину. Также есть Greater than or equal to, Less than or equal to, Less than, Greater than для работы с числами.

Основные операторы
Скрытый текст:
Кроме функций бывают еще операторы. Для не программистов лучше всего пояснять это понятие на примерах.
Все математические действия и сравнения (сложение, вычитание, умножение, равенство, больше / меньше и т. д.) - операторы. Здесь особо нечего рассказывать.
Оператор присваивания - с его помощью переменной присваивается значение. Тут все довольно просто: выбираем переменную, выбираем значение.
Однако возможные функции и переменные (из которых Вы выбираете) будут разными в зависимости от типа выбранной переменной. То есть, целочисленным переменным можно присвоить одни значения, переменным юнитам - другие. Случайно присвоить числу юнита в таком случае почти невозможно.
Условный оператор - с его помощью можно "разветвлять" алгоритм, чтобы в одном случае он сработал одним образом, а в другом - другим. Для этого есть условный оператор, у которого есть "условие" (как условие в триггере) - если оно истинно, то алгоритм "пойдет" по одному ветвлению, если оно ложно - по другому. Ветвления называются then (в случае истинны) и else (в ложном).
Окошки выбора условий и действий стандартные.
Приведем пример. (Иногда я буду делить пример на несколько строк, хотя реально в триггерах так не делается. Это чисто ради того, чтобы Вам было удобнее читать.)
If ((Race of Player 1 (Red)) Equal to (==) Human) then
do (Player - Add 200 to Player 1 (Red) Current gold) else
do (Player - Add 500 to Player 1 (Red) Current gold)
Если раса первого игрока - альянс, то ему добавится 200 золото, в ином случае добавится 500.
Примечание: в Варкрафте есть два вида таких операторов: с одним действием на каждое разветвление и с несколькими (любым кол-вом). Я рекомендую пользоваться вторым. Вообще не понятно, зачем было делать такой оператор с одним действием на ветвление?.. Хотя иногда это выглядит красивее в коде.
Сами операторы действуют абсолютно одинаково, даже с точки зрения оптимизированности кода.
Цикл мы будем рассматривать подробнее далее в этой статье. Но их есть несколько видов, хотя суть не меняется.
Примечание: в триггерах есть один-единственный вид цикла - for. Правда, есть возможность сделать и while, и repeat, но с помощью внедрение маленького кусочка кода JASS, который совсем не трудно сделать (минимальных знаний по JASS хватит). Не забывайте, что есть "оператор" custom text, который можно вставлять прямо в код, в том числе и в тело цикла... туда-то мы и можем написать условие выхода цикла.
Skip Remaining Actions - как видно из названия - пропускает оставшиеся действия в триггере. Не запутайтесь - завершает работу именно триггер, а не какой-нибудь отдельный цикл / разветвление.
Описанное выше уже дает Вам некоторую базу, чтобы начать изучать триггеры самостоятельно (никто не собирался полностью описывать все триггеры). Но триггеры - своеобразное программирование, в котором Вы программируете саму игру - её правила, параметры и т. д.
А программирование требует не только знаний, но и определенного мышления. Даже если Вы знаете назначение большей части триггеров, Вам надо найти им правильное применение. Одну и ту же задачу можно осуществить разными путями, и нужно искать самый лучший (рациональный). Задача второй части статьи - помочь Вам в этом.
sfawn вне форума  
Отправить сообщение для sfawn с помощью ICQ Ответить с цитированием
Старый 13.03.2007, 19:06   #820
Юзер
 
Регистрация: 11.03.2007
Сообщений: 107
Репутация: 53 [+/-]
Триггеры часть №2

Объекты

Скрытый текст:
Термин объект используется программистами. По сути объект – это какой-то предмет, обладающий определенным набором свойств и может выполнять определенную группу действий (и над ним может выполняться определенная группа действий). Вам необходимо научиться находить объекты в игре.
Примеры:
Конкретный юнит в игре – объект. Свойств у него достаточно много: количество жизней, количество маны, игрок, которому он принадлежит, цвет, размер, положение на карте, направление взгляда, приказание, данное юниту, анимация, исполняемая юнитом, спецэффекты и заклятия наложенные на юнит, тип атаки, тип брони, доступные заклятия, потребляемая еда и т. д. С объектом юнит могут быть произведены определенные действия: изменить количество жизни и маны у юнита, изменить его положение на карте, изменить цвет, размер, направление взгляда и т. д.
Является ли курсор мыши объектом? Да, является. Его свойства – положение на экране, форма курсора. Возможные действия – изменить положение курсора, сменить его форму. К Варкрафту это, правда, не относится.
Сама игра несомненно является объектом. Некоторые ее свойства: продолжительность игры, количество игроков, игровая карта, вместе со всеми юнитами и доодадами и т. д. Действия с игрой, как объектом: игру можно начать и закончить, приостановить, продолжить.
Как видно из последнего примера – существуют сложные объекты, включающие в себя другие более простые. Так, внутри объекта игра имеются объекты юниты.
Ясно, что почти каждый "предмет" можно рассматривать как объект. Однако при программировании нам понадобится работать с конкретными объектами. Например, триггерная система не позволяет нам определять и тем более менять положение курсора мыши на экране. Поэтому этот объект мы сразу исключаем из своего рассмотрения. Но кроме лишних объектов, есть так же и лишние свойства и действия. Так например, свойство объекта юнит – внешний вид (используемая модель) невозможно поменять с помощью триггеров. Мы можем поменять его с помощью редактора объектов, но не триггерами. Значит это свойство юнита – модель и действие – смена модели можно исключить из рассмотрения при создании триггеров.
Проведя анализ игры и средств WE можно прийти к выводу, что в игре используется не так уж много объектов, каждый из которых имеет ограниченное число свойств и действий, которые можно с ним производить с помощью триггеров. Объектов достаточно много, можете посмотреть в типах переменных (по-пробуйте создать переменную). Даже числа и триггеры — объекты...
В WE для простоты триггерные действия разделили на категории, каждая из которых соответствует действиям над определенным типом объектов. Так легче искать нужное действие.
Что касается свойств объектов, то тут ситуация немного сложнее. Их готового списка не существует, но кое-что можно узнать при создании условий триггера либо когда Вы пытаетесь присвоить переменной определенное значение (либо просто рассуждением).
Вы помните, что условия триггеров тоже разделены на категории: boolean, integer, real, unit, unit type и т. д. Но в отличие от триггерных действий здесь деление по другому принципу. Эти категории не имеют прямого отношения к объектам. Просмотрев список условий из разных категорий Вы сможете выделить свойства объектов.
Например, в категории boolean есть условие "юнит жив". Это свойство объекта юнит – жив он или мертв. Еще пример из той же категории "юнит в регионе". Данное свойство принадлежит не одному, а двум объектам: с одной стороны это свойство юнита – находиться в определенном регионе, с другой – это свойство региона содержать определенный юнит.

Постановка задач

Скрытый текст:
Первый шаг – увидеть в игре не набор команд, но набор взаимодействующих объектов. Следующий – научиться ставить перед собой задачи и выполнять их.
Программирование на любом языке требует четкой постановки задач. Прежде всего надо уточнить, что нам дано (объекты, переменные и т. п.) и что нужно сделать.
Приведу пример. Один мой знакомый картостроитель попросил помочь ему разработать триггеры для огненной ловушки. Суть ее в том, что когда юнит входит в регион, в определенном месте загорается огонь, а когда юнит наступает на этот огонь, то повреждается. На первый взгляд все понятно, но фактически многих данных не хватает. Например, не указано, какой юнит должен войти в регион, чтобы сработала ловушка: любой или контролируемый человеческим игроком или вообще имеется ввиду конкретный юнит. А может быть летающие юниты не должны получать повреждения? В каждом случае эта задача решается по-разному. Затем, когда юнит входит в регион – загорается огонь. А когда выходит – огонь гаснет? Наверное да, но в условии об этом не говорится.
Итак, формулируем условие задачи. Дано: два региона — внешний и внутренний (один внутри другого) и спецэффект огонь, который находится во внутреннем регионе.
Требуется:
При входе во внешний регион юнита определенного игрока, активируется спецэффект огонь.
При входе юнита во внутренний регион – юнит начинает получать повреждения через определенные промежутки времени
При выходе юнита из внешнего региона – спецэффект огонь дезактивируется.
Согласитесь, что когда задача сформулирована так, становится понятнее, что же нам нужно делать. Однако нужно предусмотреть все возможные исходы:
Что делать, если в регион войдет не один юнит, а несколько? Активировать огонь нужно лишь после входа первого вошедшего юнита. Повреждения во внутреннем регионе должен получать не один юнит, а все находящиеся в нем юниты.
Что делать, если юнит умирает внутри региона? (Вопрос важный, т.к. мертвый юнит тоже считается юнитом. Если не учитывать это, то даже когда все юниты покинут внешний регион, огонь будет продолжать гореть, пока не разложится труп.) Значит при подсчете количества юнитов в регионе нужно не учитывать трупы.
Что делать, если юнит умер, а других юнитов в регионе нет? Очевидно, дезактивировать огонь.
Необходимо сделать дополнения к требованиям.
Дополнения:
При входе во внешний регион юнита определенного игрока, во внутреннем регионе активируется спецэффект огонь, при условии что в регионе уже не находятся другие юниты игрока.
Если спецэффект огонь активирован, каждый юнит во внутреннем регионе получает повреждения через определенные промежутки времени.
Если все живые юниты покинули внешний регион – дезактивировать огонь.
Если юнит из внешнего региона умирает и других живых юнитов определенного игрока во внешнем регионе не присутствует – дезактивировать огонь.
Вот теперь задача поставлена корректно. Более того, теперь ясно, сколько и каких триггеров надо создавать. Можно переходить к следующему шагу – разбиение сложных задач на более простые до тех пор, пока каждую из них можно будет реализовать с помощью триггеров. Нужно анализировать не только сами задания, но и разные пути их решения.
К сожалению, на данном примере этот этап не продемонстрируешь. Каждую из поставленных задач можно реализовать в одном триггере (причем относительно не сложном). Правда придется добавить еще один триггер: спецэффект огонь при загрузке сценария будет активирован. Значит понадобится триггер, чтобы дезактивировать его в начале игры. И еще один момент: как определить, активирован ли спецэффект огонь (это нужно для второй задачи)? Могут быть разные способы. Например, создать переменную логического типа (булин) и записывать в нее значение true, если юнит вошел в регион и false, если живые юниты покинули регион либо все юниты в регионе мертвы. Но тут есть способ сделать проще, о котором я говорил. При входе юнитов — включать триггер, при выходе всех живых — выключать.
Предлагаю решать задачи по схеме:
Что дано (объекты, переменные и др.), что нужно сделать.
Рассмотреть различные варианты развития событий, сделать дополнение к условию.
Разбить каждую из поставленных задач на более мелкие так, чтобы каждую из них можно было реализовать с помощью триггеров.
Создать нужные триггеры.
Проверить правильность работы триггеров.
На третьем этапе Вы можете столкнуться с нерешаемыми задачами. Может быть, Вы не знаете, как решать эту задачу, а может быть её вообще нельзя решить. Многие из задач, которые на первый взгляд не имеют решений, на самом деле могут быть решены. Например, раньше я считал, что от читов в игре нет защиты, т. к. триггерами они не фиксируются. Но немного подумав нашел способ обезвредить большинство из них. Если Вы столкнулись с нерешаемой задачей, попробуйте ее сначала проанализировать с конца. Нужно получить такой-то результат, для этого необходимо произвести такие-то действия, а для них в свою очередь нужно сделать еще что-то... Если не получается – посмотрите внимательно, нет ли другого способа решить эту задачу. Обычно такие способы есть.
Не стоит зацикливаться на нерешаемых задачах. Не решается задача – оставьте ее в покое и постарайтесь обойтись без нее.

Переменные (практика)
Скрытый текст:
Я не буду описывать здесь, какие есть переменные и как их создавать - это уже было описано в первой части. Рассмотрим переменную как объект.
Что есть переменная? Каждая переменная - что-то вроде листика, на который Вы записываете информацию, чтобы не забыть ее. Можно рассматривать переменную как объект, свойства которого - название и тип данных, которые можно в нее записать и значение, записанное в переменную. Действия, которые можно производить с переменными - создать, присвоить новое значение, прочитать значение переменной.
Начнем с переменных числового (и дробного) типа.
Для работы с числами в WE есть два типа переменных: integer и real.
В переменные типа integer можно записать целые числа (для не математиков напоминаю: это числа без дробной части, но не только положительные, но и отрицательные).
Если Вы попытаетесь записать в переменную целого типа число с дробной частью (это вообще говоря некорректная операция) в WE никаких ошибок не будет. Просто в переменную будет записано значение без дробной части.
Например, если в переменную i целого типа Вы попытаетесь записать дробь 1 / 3, то в результате туда будет записан 0 (1 / 3 округляется, получается 0). Если 5 / 4 - то в i будет записана 1.
Другой тип - real - рациональные числа (дроби). В WE такие числа записываются как десятичные дроби. Хотя при желании Вы можете записать в переменную типа real и целое число (без дробной части). Рациональные числа в WE ущербны, поскольку можно записать лишь два знака после запятой. Остальные знаки будут просто отброшены (никакого округления! они просто игнорируются). С другой стороны, для сценариев не требуется большая точность вычислений.
Посмотрим, какие значения можно помещать в числовые переменные.
Войдите в WE, начните новый сценарий, сотрите все триггеры. Создайте переменную i типа integer и переменную r типа real.
Далее создайте триггер с событием Map Initialization. Создайте действие set variable. В качестве первого параметра нужно указать переменную, значение которой мы изменяем. Укажите переменную i. Второй параметр - какое значение мы хотим установить переменной. Когда Вы нажмете на него, Вам будет выдано окно, где будет предложено выбрать один из трех вариантов:
Variable (переменная)
Function (функция)
Value (значение)
Итак, Вы можете присвоить одной переменной значение другой переменной (ну скажем set a = b - в переменной a будет записано такое же значение, как в b).
Другой вариант - написать конкретное значение, которое Вы хотели бы присвоить переменной - введите его в пункте Value.
И, наконец, третий пункт - функции. В списке функций будут все функции Варкрафта, которые возвращают integer. Как работают функции и выражение уже было описано в это статье.
Однако один момент надо все-таки рассказать... Поясню на примере. Например, мы решили переменной i присвоить значение равное 12 - 5. Для этого надо воспользоваться функцией (а не написать в поле Value!) Arithmetic!
Примечание: хотя Arithmetic по синтаксису триггеров - функция, на самом деле это не так. В JASS скрипте будет написано по-нормальному, т. е. само выражение. Поэтому "функция" Arithmetic "нормальна" с точки зрения оптимизации.
Реально у Blizzard не было другого выхода - не заставлять же писать выражения на JASS'е, учитывая что знать его будет не больше 2% всех мапперов?
Если все было сделано правильно, то действие будет выглядеть так:
Set i = (12 - 5)
Вопрос: как нам установить значение переменной i, чтобы она была равна 12 - 5 + 3, т. е. не два, а три слагаемых? Для этого снова пользуемся функцией Arithmetic: в качестве первого параметра выбираете снова функцию Arithmetic, и как её параметры ставим 12 - 5. В качестве второго параметра вводим 3. Не забудьте про знаки, конечно. Если все сделано верно, действие будет выглядеть так:
Set i = ((12 - 5) + 3)
Такой способ ввода значений весьма неудобен. Но что поделать, приходится пользоваться тем, что есть.
Достаточно часто используется такой прием:
Set i = (i + 1)
Что произойдет после выполнения этого действия? Значение переменной i увеличится на единицу, каким бы оно не было раньше. Это нам говорит о том, что можно использовать значение самой переменной (которой присваивается значение) в выражении.
Когда Вы создадите действие set variable, но в качестве первого параметра выберете переменную r (типа real), Вам будет предоставлен другой набор функций, уже не будет тех, что возвращают integer (хотя я и говорил, что значение автоматически конвертируется - функций в списке нет). Но есть функция конверции из integer'а в real.
Как видите всяких действий с числами в WE можно производить предостаточно. Можно было бы даже использовать его как калькулятор
В обычных сценариях не так уж часто приходится пользоваться всеми этими функциями, но на самом деле они открывают картостроителю многие возможности. Поэтому нужно уметь с ними работать.
Давайте решим такую задачу: поместим в переменную r значение 100 + ((случайное число от 1 до 10) / 5).
Set i = (100 + ((Random integer number between 1 and 10) / 5))
Допустим, перед нами стоит задача: задать переменной i значение 1 + 2 + 3 + 4 + 5 + ... + 10, т. е. слагаемых много. Если каждый раз делать арифметическую функцию - потратите много времени и сил, чтобы все сделать правильно и нигде случайно не ошибиться. Можно схитрить: записать действие не в одну, а в несколько строк.
Set i = (i + 1)
Set i = (i + 2)
Set i = (i + 3)
Set i = (i + 4)
Set i = (i + 5)
Set i = (i + 6)
Set i = (i + 7)
Set i = (i + 8)
Set i = (i + 9)
Set i = (i + 10)
В итоге в переменной i будет записано нужное нам значение, но каждую строку не обязательно переписывать - можно просто скопировать и немного изменить ее (или воспользоваться циклом, о чем чуть позже).
А можем ли мы просмотреть, какое значение у какой-нибудь числовой переменной? Можем. Вы уже знакомы (я надеюсь) с действием game - text message. Она позволяет выводить текстовые строки. Но мы не можем просто взять и вывести число, потому что у него нету такого действия (как у объекта, помните), такое действие есть только у строк. Есть функции перевода числа в строку, которая берет как аргумент число, а возвращает строку с этим числом.
Примечание: важно понимать, что вроде бы очевидные вещи иногда нельзя сделать. Пример с числом идеально это показывает. С точки зрения компьютера строка - набор символов. Но мы обозначаем числа символами (поэтому иногда не сразу ясно - компьютер, в своем внутреннем представлении ничего ничем не обозначает - там другая логика), и называем это цифрами. Для строки не имеет никакого значения, есть ли в ней цифры или нет - для неё это такие же символы, как и остальные. Поэтому и надо сначала сконвертировать число в цифры - набор символов.
Выберите фукнцию convertion - convert real to string (перевести рациональное число в строку) - и в качестве числа укажите переменную r. Если же хотите посмотреть переменную i, выберете функцию convertion - convert integer to string и в качестве числа аргумента укажите переменную i.
Объяснять все эти вещи непросто, хоть они и являются достаточно простыми. Нужно просто понять, самому поработать с переменными. Поэтому даю задание (делать только тем, кто не умеет работать с переменными):
Создать минисценарий с переменными a, b, d типа real, c типа integer
В переменную a поместить ((случайное число от 1 до 10) + 5 / 2).
В переменную b поместить 2^4 (два в четвертой степени).
В переменную c поместить 1 - 2 - 3.
В переменную d поместить наибольшее из чисел a и b.
Вывести значение всех переменных на экран.

Циклы (практика)
Скрытый текст:
Цикл - повторение одного и того же действия.
Циклы
Итак, цикл - повторение действий. Давайте посмотрим пример:
For each (Integer A) from 1 to 10, do (Actions)
Loop - Actions
Set i = (i + 1)
Смотрим на первую строчку: For each (Integer A) from 1 to 10, do....
Это - "заголовок" цикла, в котором назначается сколько раз будет выполнено действие. Integer A значит, что как "счетчик" цикла будет использована переменная A (в данном случае она автоматически создается и убирается после выполнения цикла). При выполнения действия в счетчике будет находится номер итерации (т. е. выполнения) цикла. Так, при первом выполнении там будет один, при втором - два, третьем - три и так далее. Вторую строчку можно пропустить, она будет в любом цикле. Смотрим третью: Set i = (i + 1). Это - действие, которое и будет выполнено множество раз. Оно не ограничивается одной строчкой - можно поставить сколько угодно действий.
Теперь можно сказать что же этот цикл делает: присваивает переменной i значение i + 1 десять раз. После выполнения цикла в переменной i будет значение 10 (в том случае, если начальное значение было 0). Грубо говоря, цикл выполняет операцию i + 10.[field=Примечание]Важно понимать, что A - тоже переменная, и читать / записывать значение из неё / в неё можно откуда угодно. Так, можно получить её значение даже вне цикла, хотя это не имеет смысла. Но такая "возможность" может вызвать один серьезый глюк: если запустить два цикла, и оба работающие с переменной A, они обе будут пытаться изменять значение A. Скорее всего, это закончится тем, что циклы (оба) будут выполнены неправильно: действие будет выполнено несколько лишних раз либо наоборот - будет выполнено меньше раз, чем требуется. Поэтому, в триггерах есть возможность использовать другие переменные, не только A (также существует переменная B, но если нам надо сразу 3 цикла запустить?). Когда Вы создаете действие цикла (имеется в виду действия создания цикла, а не действия в цикле) у Вас есть выбор: "For Each A...", "For Each B...", "For Each Variable...". Второе - тоже самое, что первое (какая разница: A или B? хотя если у вас больше чем два цикла одновременно не будет - рекомендую, потому что тогда не нужно создавать еще одну переменную). А вот используя третье Вы можете назначить, какую именно переменную надо использовать как счетчик (тип переменной - обязательно integer).
В том же меню Вы найдете еще два типа действий цикла: "... Do Multiple Actions" и, соответственно, без такой надписи ("просто" цикл). Как видно из названий, один цикл дает возможность сделать несколько действий в триггере, а другой - нет. Никакой разницы нет, что использовать первый, что второй.
Давайте рассмотрим еще один пример. Помните, нам надо было в переменную i занести значение 1 + 2 + 3 + 4 + 5 ... + 10?
For each (Integer A) from 1 to 10, do (Actions)
Loop - Actions
Set i = (i + (Integer A))
В итоге в переменную i будет внесено как раз нужное значение. Судите сами - переменной i каждый раз прибавляется значение, которое само по себе меняется (номер итерации цикла). Таким образом, сначала будет Set i = (i + 1), затем Set i = (i + 2) и так далее.
http://www.tes.xgm.ru
sfawn вне форума  
Отправить сообщение для sfawn с помощью ICQ Ответить с цитированием
Ответ


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 03:06.


Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Rambler's Top100 Яндекс цитирования