Сейчас 16:11:45 Четверг, 26 декабря, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
[СТАТЬЯ] Делаем FSGUI выбор героя
DreiiДата: Суббота, 31 Марта 2012, 01:39:56 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Содержание:
1.Вступление.
2.Подготовка Редактора Объектов и работа с Менеджером Импорта.
3.Расстановка требуемых объектов на карте.
4.Написание API для облегченной работы.
5.Инициализация системы.
6.Работа с событиями.


1.Вступление

Увлеченной разработкой FSGUI системы выбора героев, я решил написать статью, что бы каждый новичок мог сделать такую необычную вещь в своей карте. Перед тем как начать писать сие «чудо», я два раза сделал систему выбора, третий раз я пишу ее вместе с вами и прикреплю Demo Map к данной статье, что бы вам было легче разобраться.
Я решил писать систему на родном Jass2, без всяких надстроек (даже с udg_).Что бы хоть как-то разобраться в том, что я буду рассказывать, вам потребуется знание Jass,желательно на среднем уровне.

2. Подготовка Редактора Объектов и работа с Менеджером Импорта.

FSGUI – представляет из себя графический интерфейс, непосредственно в любом месте игровой области. Обычно такие системы используют Разрушаемые Объекты и Юнитов либо Trackable.
В данной статье я расскажу про способ, основанный на Trackable.
Trackable - специальный объект ассоцированый с моделью, отображаемой в игре. При наведении(или при щелчке) мыши на модель Trackable, можно производить определенные действия. Основная проблема работы с Trackables состоит в том что мы не можем их перемещать, удалять или скрывать. (все верно но мы можем вынести их в отдельную область и при необходимости переносить туда камеру. примечание - Avatar). Trackables работают в мультиплеере. (с) KaTTana
И так,начнем.
Для начала нам понадобятся модели рамок, кнопок и модель Trackable. Благо я их прекрепил в конце статьи,так что вам не придется их искать.
Мы взяли модель для Trackable 4x4,т.к такой размер будет иметь наша иконка героя.
Импортируем это все в нашу карту. Убираем как обычно war3mapImported\ со всех импортированных файлов.
Далее заходим в Редактор Объектов – Разрушаемые Объекты
Создаем нестандартный Разрушаемый Объект ,я взял за основу Блокираторы пути.
Назовем созданный объект - Border. Это и будет наша рамка.
Скопируем его 8 раз(Левая, Правая, Нижняя, Верхняя, Левая Верхняя, Правая Верхняя, Левая Нижняя, Правая Нижняя)
Выстроим настройки так, как показано ниже на картинке:
[spoiler="Картинка 1"][/spoiler]
Примечание: В файле модели указываем для каждого вида рамки свою. Пример: верхняя рамка - borderU.mdl
В поле Графика – Заменяемый файл текстур - мы ставим текстуру, которая будет наложена на наши рамки. Я выбрал стандартную границу Альянса.

3. Расстановка требуемых объектов на карте.

Проведя такие манипуляции с оставшимися объектами, мы должны выделить место на карте, где будет происходить наш выбор. Это место лучше «закрасить» тайлсетом – Бездна. Когда место выбрано и объекты настроены, мы можем приступать к созданию самого интерфейса, в котором будет происходить выбор. У меня получилось так:
[spoiler="Картинка 2"][/spoiler]

Далее, мы должны создать объекты с иконками наших будущих героев.
[spoiler="Картинка 3"][/spoiler]
В поле Графика – Заменяемый файл текстур - мы ставим иконку нашего героя.
Примечание: В поле файл модели мы ставим Button.mdl! Смотрите, не ошибитесь!
После создание можно поставить его на карту и посмотреть что получилось.
[spoiler="Картинка 4"][/spoiler]
Все работает? Отлично! Можно удалить портреты, ведь они будут создаваться триггерно.
4.Написание API для облегченной работы

Ну а сейчас мы перейдем к самой интересной части этой статьи, а именно к кодингу!
Для начала создадим переменную типа хэш-таблица и назовем ее Hash.
Затем напишем вот такую ф-ию – NewTrackable .

Данная ф-ия создаст Trackable в точке х и у с нужной нам моделью, для нужного нам игрока, а также привяжет rawcode героя к этому Trackable .
Следующим шагом нам нужно написать ф-ии, которая позволит нам узнать х и у Trackable, его владельца и rawcode героя.

Теперь мы можем создать Trackable и получить всю информацию о нем.
Дальше, нам нужна ф-ия которая создаст Trackables для нужных нам игроков (ведь у нас их будет 12) , а также добавит два события:

[code=jass]native TriggerRegisterTrackableTrackEvent takes trigger whichTrigger, trackable t returns event[/code]
И
[code=jass]native TriggerRegisterTrackableHitEvent takes trigger whichTrigger, trackable t returns event[/code]

Первое событие срабатывает, когда наводят мышкой на Trackable ,а второе когда поэтому Trackable совершают клик.
Теперь приступим к написанию ф-ии Create Track .

Теперь мы можем создавать Trackable для всех играющих игроков.
На этом написание API завершено!

5.Инициализация системы

Создадим триггер с название InitPick.
Добавим ему событие Время – Прошло 0 секунд
Это позволит инициализировать нашу систему сразу при старте карты.
Следующим шагом мы должны создать переменную, которая будет хранить наших героев. Зададим ей имя HeroH, тип целочисленная массив.
Так как у нас пока что один герой то только его и занесем,а также иницализруем хэштаблицу:

Далее, создадим область, где будет происходить наш выбор. Назовем ее PickHero.
Что бы игрок видел, что там происходит, нужно разблокировать для него модификатор видимости. Так же, нам потребуется переменная типа логическая массив с название CamT. Она поможет нам определить нужно, закреплять камеру для игрока или нет.

Я установил i=0 потому что дальше нам понадобится еще один цикл.
Ну а пока создадим камеру, которая будет направлена на наш выбор героев.
Назовем нашу камеру CAMERA и настроим так, как показано на рисунке (мне кажется, что такие параметры более удобны):
[spoiler="Картинка 5"][/spoiler]
Дальше, нам понадобится триггер,который будет крепить эту камеру для игрока чья переменная udg_CamT == true

Назовем наш триггер Camera.
Он будет каждые 0.01 секунды крепить кмеру CAMERA для игроков.

Примечание: Конечно можно использовать таймер,но я думаю новичкам так будет понятней.
Далее вернемся к нашему триггеру InitPick.
Нам ведь нужно создать:
1)Иконки героев
2)Trackable для этих иконок
Начнем с иконок. Создадим в триггере целочисленный массив IconHero и запишем в него rawcode наших Разрушаемых Объектов:

Примечание: Индексы у массивов HeroH и IconHero должны быть одинаковы!
Далее, нам нужно создать эти иконки в самой игре, для этого нужно узнать координаты точки, откуда начнется создание.

На картинке курсор не виден,поэтому я примерно обозначил его красной точкой.
[spoiler="Картинка 6"][/spoiler]
Мы получили координаты (x,y,z)
X=-1160
Y=2455
Z= нам не нужен
В зависимости от того как у нас расположена область выбора, нужно определить какая величина изменяется при движении мышки вправо. У меня это Х.
Теперь нужно будет создать Иконку героя и Trackable для нее в этой позиции.

Вы спросите, почему x+65*i? Отвечаю, за каждый виток цикла, мы создаем иконку и Trackable в позиции -1160+65*i. 65 – примерная ширина иконки, а умножаем, на i что бы следующие иконки ни лепились, а шли ровно.
Как вы видите, мы сохраняем декорацию, для того что бы при выборе героя удалить.
[code=jass]call SaveBoolean(udg_Hash,udg_HeroH[i],5,true)[/code] - Сохраняем на rawcode героя логическую, что бы определит, взяли этого героя или нет.
С инициализацией выбора мы закончили! Можете запустить карту и посмотреть, что получилось, если все правильно, то должно быть что-то вроде этого:
[spoiler="Картинка 7"][/spoiler]
6.Работа с событиями

Как вы успели заметить, то в ф-ии
[code=jass]call CreateTrack("4x4Trackable.MDX",x+65*i,y,udg_HeroH[i],11,gg_trg_Track,gg_trg_Click)[/code]
Я указал два триггера gg_trg_Track и gg_trg_Click.
Вот как выглядят эти триггеры:



Начнем с триггера gg_trg_Track.
Мы можем получить реагирующий Trackable с помощью
GetTriggeringTrackable()
Что мы и сделаем сейчас. Также мы можем поулчить: GetTrackableOwner(tr) – владелец Trackable, GetTrackableHero(tr) – равкод привязанного героя.

Далее с помощью модели "BTNselection.mdx" мы создадим эффект выбора

Зачем разрушать загруженный эффект? Это что бы при повторном наведении,либо при наведении на другую иконку этот эффект удалялся.
Если все верно получаем:
[spoiler="Картинка 8"][/spoiler]
Теперь нам нужно сделать сам выбор героя по щелчку.
Триггер gg_trg_Click мало отличается от gg_trg_Track.
Мы также получаем все данные об Trackable, но при клике(событии) мы удаляем загруженный эффект.
Удаляем иконку героя. Сохраняем логическую на false. И создаем игроку героя, записав его в переменную - боевая единица массив Hero.

Если все верно, то при клике на иконку выберется ваш персонаж и его иконка удалится.
[spoiler="Картинка 9"][/spoiler]

Приложения:
Файлы импорта
Demo Map

P.S Все что я не учел по вашему мнению, пишите. Будет дополняться. Могут быть смешные ошибки - хочу спать.
P.P.S Следющая статья - "Полноэкранный Магазин на FSGUI"
P.P.P.S Моя первая статья




Сообщение отредактировал Dreii - Воскресенье, 01 Апреля 2012, 00:48:33
 

tRu^SДата: Суббота, 31 Марта 2012, 05:09:33 | Сообщение # 2
8 уровень
Группа: Проверенные
Сообщений: 614
Награды: 0
Репутация: 138
Блокировки:
Теперь все залепят себе такой пик trollface

 

Ty3uKДата: Суббота, 31 Марта 2012, 08:24:09 | Сообщение # 3
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
А я писал свой апи :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Суббота, 31 Марта 2012, 11:57:48 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Ty3uK, это тоже рукописный. У [DUОS]'а немного по-другому.
Quote (Dreii)
DestroyEffect(LoadEffectHandle(udg_Hash,herot,7)) // уничтожаем эффект
udg_Hero[id]=CreateUnit(p,herot,GetStartLocationX(GetPlayerStartLocation(p)),GetStartLocationY(GetPlayerStartLocation(p)),0) //создаем героя игроку
SaveBoolean(udg_Hash,herot,5,false) // сохраняем на равкод героя false
RemoveDestructable(LoadDestructableHandle(udg_Hash,herot,6)) //удаляем декорацию героя
udg_CamT[id]=false // устанавливаем игроку CamT на false,что бы отпустить камеру и не реагировать на Trackable
DisplayTextToPlayer(GetLocalPlayer(),0.,0.,GetPlayerName(p)+"|r has choose "+GetUnitName(udg_Hero[id])+".") //Выводим надпись о выборе
А кто-то говорил, что будет писать на чистом JASS2. :)


 

DreiiДата: Суббота, 31 Марта 2012, 12:35:26 | Сообщение # 5
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
SirNikolas, ой привычка уже.. сейчас поправлю

Добавлено (31 Март 2012, 12:24:49)
---------------------------------------------
SirNikolas, как тру кодер скажи,код приемлим?

Добавлено (31 Март 2012, 12:35:26)
---------------------------------------------
Обнвоил первый пос.
перезалил демо карту
Теперь все на чистеньком джассике двоечке


 

VenommmДата: Суббота, 31 Марта 2012, 12:37:22 | Сообщение # 6
Группа: Заблокированные
Сообщений: 670
Награды: 0
Репутация: 386
Блокировки:
По моему статья удалась.
 

SirNikolasДата: Суббота, 31 Марта 2012, 12:42:52 | Сообщение # 7
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Приемлем. Только триггер инициализации надо запускать вот так:
Code
function Trig_Init_Actions takes nothing returns nothing

     call DestroyTimer(GetExpiredTimer())
endfunction

function Init_TrigInit takes nothing returns nothing
     call TimerStart(CreateTimer(), .0, false, function Trig_Init_Actions)
endfunction
Ну и еще после выбора всех героев дестроить триггер с периодом .01.

Добавлено (31 Март 2012, 12:42:52)
---------------------------------------------
А, еще использовать SaveAgentHandle.


 

DreiiДата: Суббота, 31 Марта 2012, 12:45:54 | Сообщение # 8
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Quote (SirNikolas)
SaveAgentHandle.

У меня ругаеться JNGP


 

SirNikolasДата: Суббота, 31 Марта 2012, 12:49:42 | Сообщение # 9
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Скрин ошибки.

Добавлено (31 Март 2012, 12:49:42)
---------------------------------------------

Quote (Dreii)
P.S Все что я не учел по вашему мнению, пишите. Будет дополняться. Могут быть смешные ошибки - хочу спать.
P.S.S Следющая статья - "Полноэкранный Магазин на FSGUI"
P.S.S.S Моя первая статья
P. S.
P. P. S.
P. P. P. S.


 

DreiiДата: Суббота, 31 Марта 2012, 12:52:28 | Сообщение # 10
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
SirNikolas, ух ты,а сейчас с компилилось. Раньше писало
Не может преобразовать Agent в Unit


 

SirNikolasДата: Суббота, 31 Марта 2012, 12:53:59 | Сообщение # 11
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Dreii)
Не может преобразовать Agent в Unit
Не могло оно такого писать. Нет функций, возвращающих agent.


 

DreiiДата: Суббота, 31 Марта 2012, 12:57:58 | Сообщение # 12
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
SirNikolas, Сейчас попробую воспроизвести ошибку.

Добавлено (31 Март 2012, 12:57:58)
---------------------------------------------
Странно все компилится) Ну ок заменю попозже на Фпуте


 

s7ealthДата: Суббота, 31 Марта 2012, 13:27:18 | Сообщение # 13
3 уровень
Группа: Пользователи
Сообщений: 78
Награды: 0
Репутация: 37
Блокировки:
Спасибо, буду пробовать
 

Like_a_NoobДата: Суббота, 31 Марта 2012, 13:48:17 | Сообщение # 14
7 уровень
Группа: Проверенные
Сообщений: 253
Награды: 0
Репутация: 414
Блокировки:
спасибо, узнал много нового
 

Ty3uKДата: Суббота, 31 Марта 2012, 13:52:16 | Сообщение # 15
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Что же? Или это тупо +1 пост?

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Like_a_NoobДата: Суббота, 31 Марта 2012, 14:19:59 | Сообщение # 16
7 уровень
Группа: Проверенные
Сообщений: 253
Награды: 0
Репутация: 414
Блокировки:
ну, например, про тракаблы



Сообщение отредактировал Like_a_Noob - Суббота, 31 Марта 2012, 14:20:21
 

llkaДата: Суббота, 31 Марта 2012, 15:59:19 | Сообщение # 17
4 уровень
Группа: Пользователи
Сообщений: 88
Награды: 0
Репутация: 34
Блокировки:
Dreii, Ухх ты напишу подобное на структуре. ХАхахахахахахаха
Ни когда еще не игрался с fsgui
 

DreiiДата: Суббота, 31 Марта 2012, 16:00:10 | Сообщение # 18
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
llka, Структура здесь проигарет ХТ имхо

 

llkaДата: Суббота, 31 Марта 2012, 16:03:42 | Сообщение # 19
4 уровень
Группа: Пользователи
Сообщений: 88
Награды: 0
Репутация: 34
Блокировки:
Quote (Dreii)
Структура здесь проигарет ХТ имхо

Я извращенец - делал же боард на структуре. trollwiggle
 

Ty3uKДата: Суббота, 31 Марта 2012, 16:10:29 | Сообщение # 20
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Господи. А я мультик делал на трех глобалках

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

llkaДата: Суббота, 31 Марта 2012, 16:20:44 | Сообщение # 21
4 уровень
Группа: Пользователи
Сообщений: 88
Награды: 0
Репутация: 34
Блокировки:
Quote (Ty3uK)
А я мультик делал на трех глобалках

А как так 3х? баорд - 1, итем - 2, а еще куда 3ю?
 

s7ealthДата: Суббота, 31 Марта 2012, 17:11:33 | Сообщение # 22
3 уровень
Группа: Пользователи
Сообщений: 78
Награды: 0
Репутация: 37
Блокировки:
Кстати, в архиве не хватает файла cornerDL.mdx
 

DreiiДата: Суббота, 31 Марта 2012, 17:19:39 | Сообщение # 23
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Перезалил.

 

[DUОS]Дата: Суббота, 31 Марта 2012, 18:09:40 | Сообщение # 24
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Dreii,
Не повторил то, что у меня есть, но статья толковая. Плюсик тебе за неё =)


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

DreiiДата: Суббота, 31 Марта 2012, 18:31:41 | Сообщение # 25
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
[DUОS], Локальное создание декора трекейблов ггдето в середине карты + привязование камеры?)
Не хочу палить ОаД2




Сообщение отредактировал Dreii - Суббота, 31 Марта 2012, 18:43:57
 

  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz