Хочу помочь новичкам, ну и средним уровням. Кто не понимает, как работать с трэкайблами. Надеюсь, что статья будет нужна. Есть статьи про трэкайблы, но читая их не все смогут понять.
Примечание: Все названия объектов, функций и переменных не играют роли. Я не буду показывать как лучше делать, как улучшать код. Просто покажу принцип работы с трэкайблами.
2.Подготовка объектов и импорта.
» УКРАЛ ИЗ ИНЕТА:
Для начала скачайте ЭТО, необходимые модели рамок и кнопок. Вообще без них нельзя будет сделать. Импортируем всё в нашу карту, по желанию убираем war3mapImported.
Далее заходим в Редактор Объектов>Разрушаемые Объекты. Создаем Разрушаемый Объект, за основу мне нравиться брать Блокировку пути. Этот объект я назвал Border. Теперь будем его редактировать, а именно:
Бой - Тип брони – Эфир
Бой - Тип цели –
Графика – Заменяемый идентификатор текстур – 32
Графика – Заменяемый файл текстур – Читайте на след. строке.
» ТУТ
Графика - Размер выбора: игра – 0
Графика – Размер выборки: редактор – 0
Графика – Тень – Нет
Графика – Фиксированное вращение – 0
Пути – Текстура пути – Нет
Редактор – Объект уничтожен – Нет
Редактор – Подсказка для выбранных объектов – Нет
Всё.
Теперь копируем этот объект 7 раз, что бы получилось 8 объектов. Изменяем их, а именно:
Текст – Суффикс – Пишем 2-3 символа, что бы мы знали, что это за часть интерфейса. Я дописал так:
R – правая сторона.
L – левая сторона.
U – верхняя сторона.
D – нижняя сторона.
UR – верхняя правая сторона.
UL – верхняя левая сторона.
DR – нижняя правая сторона.
DL – нижняя левая сторона.
И соответственно эти буквам выставляем им подходящие модели. Например к Border R модель borderR.mdx и т.д.
3. Нужные переменные.
Нам нужно будит вот такие переменные:
Hash – хэш-таблица – для хранения данных. Сразу создайте триггер с названием Hash и сделайте так, что бы осталось только 3 строчки:
function InitTrig_Hash takes nothing returns nothing
set udg_Hash = InitHashtableBJ( )
endfunction
INTERFACE – декорации с массивом – для показа/скрытия магазина.
USER – боевая единица с массивом – покупающий юнит.
Cam – логическая с массивом – для опознания, смотрит игрок в магазин или нет.
Items – целочисленная с массивом – хранит rawcod итемов.
ItemsText – плавающий текст с массивом
4.Интерфейс магазина.
Я выбрал себе интерфейс составляющий: вверху и внизу по 26 объектов; слева и справа по 12 объектов.Расставляем на ровной поверхности наш интерфейс и заносим их в переменную INTERFACE. Я занёс их в отдельном триггере INTERFACE с событие прошло 0.01 сек.. Выделяем наш магазин и нажимая Ctrl+PageDown опускаем наши объекты – пока они не проваляться под землю. Затем нажимаем 2 раза Ctrl+PageUp, что бы наш интерфейс появился. Теперь возьмём скопируем любой Border в Редакторе Объектов, изменим:
Графика – Заменяемый файл текстур – Нет
Графика – Файл модели – Button.mdl
Графика – Фоновый цвет 1 – 0
Графика – Фоновый цвет 2 – 0
Графика – Фоновый цвет 3 – 0
Редактор - Минимальный масштаб - 10
Редактор – Можно поместить случайный масштаб – Нет
Текст – Суффикс редактора – Black
Этими объектами закрываем нашу таблицу, что бы чёрный фон выходил за приделы интерфейса, запихиваем их в переменные тоже. И опять используя Ctrl+PageDown проваливаем чёрный фон под землю и нажимаем один раз Ctrl+PageUp. Выглядеть должно как-то так:
После заноса всех объектов в переменную дописываем строчки:
В начале
local integer I = 0
и в конце
loop
exitwhen i>77 // число 77 зависит от кол-ва начальных декораций.
call ShowDestructable(udg_INTERFACE[i],false)
set i=i+1
endloop
call DestroyTrigger(gg_trg_INTERFACE) // Уничтожит триггер, он ведь больше нам не нужен.
5.Функции для работы с trackable.
Сейчас запишем несколько функций для работы с трэкайблами. Их можно записать в нестандартном коде карты(Нажмите в самом верху, где название вашей карты).
function NewTrackable takes string model,real x,real y,player owner,integer items returns trackable
local trackable tr
local integer id = GetPlayerId(owner)
if GetLocalPlayer() != owner then
set model=" "
endif
set tr=CreateTrackable(model,x,y,0.)
call SaveReal(udg_Hash,GetHandleId(tr),0,x)
call SaveReal(udg_Hash,GetHandleId(tr),1,y)
call SaveInteger(udg_Hash,GetHandleId(tr),2,id)
call SaveInteger(udg_Hash,GetHandleId(tr),3,items)
return tr
endfunction
Эта функция будет создавать Трэкайбл в точке Х и Y с нужной моделью, для нужного игрока, а также привяжет rawcode предмета к этому Трэкайблу.
function GetTrackableX takes trackable tr returns real
return LoadReal(udg_Hash,GetHandleId(tr),0)
endfunction
Укажет координату трэкайбла по оси Х.
function GetTrackableY takes trackable tr returns real
return LoadReal(udg_Hash,GetHandleId(tr),1)
endfunction
Укажет координату трэкайбла по оси Y.
function GetTrackableOwner takes trackable tr returns player
return Player(LoadInteger(udg_Hash,GetHandleId(tr),2))
endfunction
Укажет владельца трэкайбла.
function GetTrackableItems takes trackable tr returns integer
return LoadInteger(udg_Hash,GetHandleId(tr),3)
endfunction
Укажет предмет, который прикреплен к трэкайблу.
И последняя функция, создающая трэкайблы для всех игроков.
function CreateTrack takes string model,real x,real y,integer items,trigger TrackableTrack,trigger TrackableHit returns nothing
local trackable tr
local integer i = 0
loop
exitwhen i == 11 ( 11-кол-во игроков)
if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(Player(i)) == MAP_CONTROL_USER then // Проверка на играющего игрока под контролем человека.
set tr = NewTrackable(model,x,y,Player(i),items)
call TriggerRegisterTrackableTrackEvent(TrackableTrack,tr)// Добавляем к трэкайблу событие наведения.
call TriggerRegisterTrackableHitEvent(TrackableHit,tr)// Добавляем к трэкайблу событие клика.
endif
set i=i+1
endloop
endfunction
6.Инициализация системы.
Создаём триггер с название InitShop и добавляем событие Время-прошло 0.01 сек (Хотя можно и в триггере INTERFACE дописывать). Это требуется, что бы инициализировать нашу систему сразу в начале игры. Событие Инициализация нам не подходит. Создадим переменную с именем Items, тип целочисленная с массивом.
Заходим в Редактор Объектов>Предметы и создаём 4 предмета, у меня это:
1. Ботинок
2. Перчатка
3. Щит
4. Кольцо
Заходим в Редактор Объектов>Разрушаемые Объекты и копируем 4 раза BorderD. Чуток изменим данные:
Графика – Заменяемый идентификатор текстур – 31
Графика – Заменяемый файл текстур – на иконку предмета.
Графика – Файл модели – Button.mdl
Графика – Фиксированное вращение – 270.
Текст – Название – Icon
Текст – Суффикс редактор – название вашего предмета.
Теперь запишем:
function Trig_InitShop_Actions takes nothing returns nothing
local integer i=0
set udg_Items[0] = 'I000'
set udg_Items[1] = 'I001'
set udg_Items[2] = 'I002'
set udg_Items[3] = 'I003'
loop
exitwhen i>11
set udg_Cam[i] = false
set i=i+1
endloop
endfunction
//===========================================================================
function InitTrig_InitShop takes nothing returns nothing
set gg_trg_InitShop = CreateTrigger( )
call TriggerRegisterTimerEventSingle( gg_trg_InitShop, 0.01 )
call TriggerAddAction( gg_trg_InitShop, function Trig_InitShop_Actions )
endfunction
Мы записали rawcod итемов, которые будут даваться герою и установили, что игроки не находятся в магазине (udg_cam[i] = false). Создадим способность пустышку с название OpenShop. Она будет открывать нам магазин. А также создадим триггер OpenShop с событием Боевая-единица-Событие Приводит способность в действие и условием Применяемая способность равно OpenShop. Конвертируем в текст и изменяем
function Trig_OpenShop_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A000' ) ) then
return false
endif
return true
endfunction
на
function Trig_OpenShop_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
endfunction
Нужно прицепить камеру. Создаём камеру с названием CamShop и триггер Camera с событие каждые 0.04 сек.. Ставим камеру в центре интерфейса и ставим такие настройки:
Поворот – 90
+Угол атаки+ – 270
Расстояние – 1800
Теперь в триггере Camera пишем.
function Trig_Camera_Actions takes nothing returns nothing
local integer i=0
loop
exitwhen i>11
if GetLocalPlayer() == Player(i) and udg_Cam[i] then //Проверяем игрок в магазине или нет.
call CameraSetupApplyForceDuration(gg_cam_CamShop,true,0.10)// Перемешает камеру к магазину.
endif
set i=i+1
endloop
endfunction
строчки udg_Cam[i] и udg_Cam[i] = true идентичны, поэтому = true можно игнорировать.
Кстати можно использовать таймер, но новичкам и так пойдёт.
Вернёмся к триггеру OpenShop и напишем:
function Trig_OpenShop_Actions takes nothing returns nothing
local unit u = GetSpellAbilityUnit()
local player p = GetOwningPlayer(u)
local integer id = GetPlayerId(p)
set udg_Cam[id] = true
set udg_USER[id] = GetSpellAbilityUnit()
u=null
endfunction
Если используешь способность, то локальная становиться true – значит, игрок находиться в магазине. А также записываем юнита в переменную, что бы знать кому давать предметы.
Так. Установим иконки. В триггере InitShop:
local integer array IconItems
set udg_Items[0] = 'I000' //кольцо
set udg_Items[1] = 'I001' //ботинок
set udg_Items[2] = 'I002' //перчатки
set udg_Items[3] = 'I003' //щит
set IconItems[0] = 'B00B' //иконка кольца
set IconItems[1] = 'B00C' //иконка ботинка
set IconItems[2] = 'B009' //иконка перчатки
set IconItems[3] = 'B00A' //иконка щита
Равкоды могут быть другими. Индексы у Items,ItemsText и IconItems должны быть подходящие друг к другу. Если Items[0] – это ботинок, то IconItems[0] – должен быть иконкой ботинка.
Нам нужно создать иконки в самой игре, для этого в любом месте где вы захотите иконку поставьте Разрушаемый Объект (ботинок, перчатку, кольцо или щит). Затем наведите на центр иконки и в нижнем левом углу увидите 3 значения, запомните первые 2 – это X и Y . Удалите поставленный объект.
function Trig_InitShop_Actions takes nothing returns nothing
local integer i=0
local integer array IconItems
local real x = -1925
local real y = -770
set udg_Items[0] = 'I000' //кольцо
set udg_Items[1] = 'I001' //ботинок
set udg_Items[2] = 'I002' //перчатки
set udg_Items[3] = 'I003' //щит
set IconItems[0] = 'B00B' //иконка кольца
set IconItems[1] = 'B00C' //иконка ботинка
set IconItems[2] = 'B009' //иконка перчатки
set IconItems[3] = 'B00A' //иконка щита
loop
exitwhen i>11
set udg_Cam[i] = false
set i=i+1
endloop
set i=0
loop
exitwhen i>3 // 3 – зависит сколько итемов, щас их 4 потому что начинаем счёт с 0.
set udg_INTERFACE[78+i] = CreateDestructable(IconItems[i],x+65*i,y,0,1,0) // создаём иконки и пихаем их в переменную 78+i, потому что 77 у нас уже использовано.
//x+65*i??? 65 – размер иконки, а умножаем мы, что бы следующую иконку создать правее. Точнее вот
//x+65*I - будет создавать вправо.
//x-65*i - будет создавать влево.
//y+65*I – будет создавать вверх.
//y-65*I – будет создавать вниз.
call SaveDestructableHandle(udg_Hash,udg_Items[i],5,udg_INTERFACE[78+i])
call ShowDestructable(udg_INTERFACE[78+i],false) // Скрываем созданные иконки
call CreateTrack("Trackable.MDX",x+65*i,y,udg_Items[i],gg_trg_TrackableTrack,gg_trg_TrackableHit)
set i=i+1
endloop
endfunction
x и y – координаты, которые мы запомнили.
Нужно разблокировать видимость в магазине и показывать декорации. Создаём область с название Shop, что бы она полностью покрыла наш чёрный интерфейс и дописываем в OpenShop:
function Trig_OpenShop_Actions takes nothing returns nothing
local unit u = GetSpellAbilityUnit()
local player p = GetOwningPlayer(u)
local integer id = GetPlayerId(p)
local integer i = 0
set udg_Cam[id] = true
set udg_USER[id] = GetSpellAbilityUnit()
if GetLocalPlayer() == p then
call FogModifierStart(CreateFogModifierRect(p,FOG_OF_WAR_VISIBLE,gg_rct_Shop,true,false)) // открывает видимость
loop
exitwhen i>82
call ShowDestructable(udg_INTERFACE[i],true) // показывает интерфейс
set i=i+1
endloop
endif
u=null
endfunction
Хм.. Время кнопки “ВЫХОДА”. Копируем разрушаемый объект Icon. Меняем:
Графика - заменяемый файл текстур - ReplaceableTextures\CommandButtons\BTNCancel.blp
Текст – название – Exit
Текст - Суффикс редактора – Пусто
Теперь как и с прошлыми иконками. Ставим на нужное место находим координаты точки, удаляем объект и дописываем в триггер InitShop а также напишем описание к итемам, название итемов и их стоимость:
function Trig_InitShop_Actions takes nothing returns nothing
local integer i=0
local integer array IconItems
local string array ItemsText
local string array ItemsName
local integer array ItemsCost
local real x = -1925
local real ex_x =-320
local real y = -770
local real ex_y =-1470
set udg_Items[0] = 'I000' //кольцо
set udg_Items[1] = 'I001' //ботинок
set udg_Items[2] = 'I002' //перчатки
set udg_Items[3] = 'I003' //щит
set IconItems[0] = 'B00B' //иконка кольца
set IconItems[1] = 'B00C' //иконка ботинка
set IconItems[2] = 'B009' //иконка перчатки
set IconItems[3] = 'B00A' //иконка щита
set ItemsName[0] = "Кольцо"
set ItemsName[1] = "Ботинок"
set ItemsName[2] = "Перчатка"
set ItemsName[3] = "Щит"
set ItemsCost[0] = 50
set ItemsCost[1] = 100
set ItemsCost[2] = 100
set ItemsCost[3] = 200
set ItemsText[0] = ItemsName[0]+"|n|cFFFFFF00Стоимость 50 золота|r|n|n|cFF959697Сам Анубис ходил с этим кольцом. Но однажды кольцо украли и не кто больше ни знал где оно.|r|n|n|nПовышение защиты на 2 ед.|n"
set ItemsText[1] = ItemsName[1]+"|n|cFFFFFF00Стоимость 100 золота|r|n|n|cFF959697Эти ботинки были найдены на Олимпийских Играх.|r|n|n|n|nПовышение скорости перемещения героя."
set ItemsText[2] = ItemsName[2]+"|n|cFFFFFF00Стоимость 100 золота|r|n|n|cFF959697Обычные перчатки из хорошего материала.|r|n|n|n|nУвеличение скорости боя героя."
set ItemsText[3] = ItemsName[3]+"|n|cFFFFFF00Стоимость 200 золота|r|n|n|cFF959697Щит Некролайта. Кто носит этот щит становиться сильнее.|r|n|n|n|rУвеличение силы атаки и защиту."loop
exitwhen i>11
set udg_Cam[i] = false
set i=i+1
endloop
set i=0
loop
exitwhen i>3
set udg_INTERFACE[78+i] = CreateDestructable(IconItems[i],x+65*i,y,0,1,0)
call SaveDestructableHandle(udg_Hash,udg_Items[i],5,udg_INTERFACE[78+i])
call SaveStr(udg_Hash,udg_Items[i],6,ItemsText[i])
call SaveStr(udg_Hash,udg_Items[i],7,ItemsName[i])
call SaveInteger(udg_Hash,udg_Items[i],8,ItemsCost[i])
call ShowDestructable(udg_INTERFACE[78+i],false)
call CreateTrack("Trackable.MDX",x+65*i,y,udg_Items[i],gg_trg_TrackableTrack,gg_trg_TrackableHit)
set i=i+1
endloop
set udg_INTERFACE[78+i] = CreateDestructable('B00D',ex_x,ex_y,0,1,0)
call ShowDestructable(udg_INTERFACE[78+i],false)
call CreateTrack("Trackable.MDX",ex_x,ex_y,0,gg_trg_TrackableTrack,gg_trg_TrackableHit)
endfunction
В триггере OpenShop значение 81 измените на 82. Потому, что мы добавили одну кнопку.
|