WarCraft 3: Пример работы с trackable. Магазин.

» Раздел: Триггеры и объекты

Автор: pLaY:) (goldplay99)
1) Вступление.
2) Подготовка объектов и импорта.
3) Нужные переменные.
4) Интерфейс магазина.
5) Функции для работы с trackable.
6) Инициализация системы.
7) Click и Hit события.
8) Карта-пример.

1.ВСТУПЛЕНИЕ

Хочу помочь новичкам, ну и средним уровням. Кто не понимает, как работать с трэкайблами. Надеюсь, что статья будет нужна. Есть статьи про трэкайблы, но читая их не все смогут понять.
Примечание: Все названия объектов, функций и переменных не играют роли. Я не буду показывать как лучше делать, как улучшать код. Просто покажу принцип работы с трэкайблами.

2.Подготовка объектов и импорта.

» УКРАЛ ИЗ ИНЕТА:
Такие системы обычно используют Разрушаемые Объекты и Юнитов либо Трэкайблы.
Trackable – специальный объект ассоциированный с моделью, отображаемой в игре. При наведении(или при щелчке) мыши на модель Трэкайбла, можно производить определенные действия. Основная проблема работы с Трэкайблами состоит в том что мы не можем их перемещать, удалять или скрывать. Все верно но мы можем вынести их в отдельную область и при необходимости переносить туда камеру. Что бы не говорили – Трэкайблы работают в мультиплеере.
Для начала скачайте ЭТО, необходимые модели рамок и кнопок. Вообще без них нельзя будет сделать. Импортируем всё в нашу карту, по желанию убираем war3mapImported.
Далее заходим в Редактор Объектов>Разрушаемые Объекты. Создаем Разрушаемый Объект, за основу мне нравиться брать Блокировку пути. Этот объект я назвал Border. Теперь будем его редактировать, а именно:
Бой - Тип брони – Эфир
Бой - Тип цели –
Графика – Заменяемый идентификатор текстур – 32
Графика – Заменяемый файл текстур – Читайте на след. строке.
» ТУТ
В этой строке зависит какой будет наш интерфейс, а точнее к какой расе он будет принадлежать.
Люди - UI\Widgets\EscMenu\Human\human-options-menu-border.blp
Орки - UI\Widgets\EscMenu\Orc\Orc-options-menu-border.blp
Нежить - UI\Widgets\EscMenu\Undead\Undead-options-menu-border.blp
Эльфы - UI\Widgets\EscMenu\NightElf\NightElf-options-menu-border.blp – я выбрал.
Графика - Размер выбора: игра – 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_TrackableHi​t)
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_TrackableHi​t)
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. Потому, что мы добавили одну кнопку.

7.Click и Hit события.

Трэкайблы реагируют только на 2 события:
native TriggerRegisterTrackableTrackEvent takes trigger whichTrigger,trackable t returns event
Это событие реагирует, когда на трэкайбл наводят курсор.
Native TriggerRegisterTrackableHitEvent takes trigger whichTrigger,trackable t returns event
Это событие реагирует, когда на трэкайбл щелкают мышкой.
Пора время создать 2 триггера, которые мы уже указывали в строках. Например здесь:
call CreateTrack("Trackable.MDX",ex_x,y,0,gg_trg_TrackableTrack,gg_trg_TrackableHit)
И так создаём 2 пустых триггера с названиями: TrackbaleTrack и TrackableHit.
В этих триггерах мы можем работать с трекайблами, когда на них наводят или щёлкают через GetTriggeringTrackable()
Начнём с триггера TrackableTrack.
function Trig_TrackableTrack_Actions takes nothing returns nothing
local trackable tr = GetTriggeringTrackable() // Наведённый трэкайбл
local player p = GetTrackableOwner(tr) // Владелец трэкайбла
local integer id = GetPlayerId(p) // ID Владельца трэкайбла
local integer items = GetTrackableItems(tr) // Получаем rawcod итема из переменной udg_items
local string text = LoadStr(udg_Hash,items,6) // Получаем текст описания предмета
local real x =-1900
local real y =-1500
if udg_Cam[id] == true then // Проверяем, использует ли игрок магазин. Что бы не использовать трэкайблы, если игрок не в магазине.
call DestroyTextTag(udg_ItemsText[id]) // Уничтожаем описание
if GetLocalPlayer() == p then
if items == 0 then // 0 – означает иконку выхода.
set udg_ItemsText[id] = CreateTextTagLocBJ( "|cFFFFFF00ВЫХОД ИЗ МАГАЗИНА|r", Location (-1900.00, -1500.00), 0, 10, 100, 100, 100, 0 ) // Создаём текст, если наведено на иконку выхода
else
set udg_ItemsText[id] = CreateTextTagLocBJ( text, Location (-1900.00, -1500.00), 0, 10, 100, 100, 100, 0 ) // Создаём текст, если наведено на  другую иконку.
endif
endif
endif
set tr=null
endfunction
x и y здесь означает нижнею левую границу текста. Этот триггер готов. Приступим к TrackableHit.
function Trig_TrackableHit_Actions takes nothing returns nothing
local trackable tr = GetTriggeringTrackable() // Используемый трэкайбл
local player p = GetTrackableOwner(tr) // Кликнувший на трэкайбл
local integer id = GetPlayerId(p) // ID игрока p
local integer items = GetTrackableItems(tr) // Привязанный предмет к трэкайблу tr
local string text = LoadStr(udg_Hash,items,6) // Привязанное описание предмета  items
local string name = LoadStr(udg_Hash,items,7) // Привязанное название предмета items
local integer cost = LoadInteger(udg_Hash,items,8) // Привязанное число предмета items
local integer nocost=cost - GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD) // Кол-во золота – не хватающего до покупки
local real x = GetTrackableX(tr) // Координата X трэкайбла tr
local real y = GetTrackableY(tr) // Координата Y трэкайбла tr
local integer i = 0 
local location loc = GetUnitLoc(udg_USER[id]) // Позиция, куда будем возвращать камеру
if udg_Cam[id] == true then // Проверяем, использует ли игрок магазин. Что бы не использовать трэкайблы, если игрок не в магазине.
call DestroyTextTag(udg_ItemsText[id]) // Удаляем текст-описанния.
if GetLocalPlayer() == p then 
if items == 0 then // Если предмет items равно ВЫХОД
set udg_Cam[id] = false // Устанавливаем камеру false. Что бы камера не крепилась к магазину.
loop
exitwhen i>82
call ShowDestructable(udg_INTERFACE[i],false) // Скрываем интерфейс
call ResetToGameCameraForPlayer(p,0) // Сбрасываем камеру
call PanCameraToTimedLocForPlayer( p, loc, 0 ) // и перемешаем её к покупающему юниту
set i=i+1
endloop
else
if GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD) >= cost then // Проверяем, есть ли деньги на покупку
if UnitInventoryCount(udg_USER[id]) < 6 then // Если, да проверяем есть ли свободный слот
// Если есть, то сообщаем игроку о приобритении предмета. 
set udg_ItemsText[id] = CreateTextTagLocBJ( "|cFFFFFF00Вы купили предмет с названием "+name+" за "+I2S(cost)+" золота.|r", Location(-1900.00, -1500.00), 0, 10, 100, 100, 100, 0 )
call AdjustPlayerStateBJ( -cost,p, PLAYER_STATE_RESOURCE_GOLD ) // Отнимает золото.
call UnitAddItemByIdSwapped( items, udg_USER[id] ) // И даём предмет
else // Если нету слотов, то сообщаем игроку.
set udg_ItemsText[id] = CreateTextTagLocBJ( "|cFFFFFF00Недостаточно места в инвентаре.|r", Location(-1900.00, -1500.00), 0, 10, 100, 100, 100, 0 )
endif
else // Если нету денег, то сообщаем игроку.
set udg_ItemsText[id] = CreateTextTagLocBJ( "|cFFFFFF00Недостаточно "+I2S(nocost)+" золота.|r", Location(-1900.00, -1500.00), 0, 10, 100, 100, 100, 0 )
endif    
endif
endif
endif
call RemoveLocation(loc)
set loc = null
set tr = null
endfunction
Вот и конец статьи. Спасибо, что дочитали её=). Надеюсь она вам поможет.

8.Карта-пример

Скачать тут

Просмотров: 11 730

» Лучшие комментарии


goldplay99 #1 - 5 лет назад 4
Спасибо за публикацию и спасибо за плюс. Но комментарии всё же хочется =)
Bornikkeny #2 - 5 лет назад 3
Крепко пожал бы руку автору. Не поленился. Да и вообще материал редкий. Жаль только что версии для гуи нет
Hate #3 - 5 лет назад 0
на гуи невозможно работать с трекейблами. А использование локалок - это уже можно сказать жасс даже если в кастом скрипте, и на гуи такая система была бы... мягко говоря громоздкой
Bornikkeny #4 - 5 лет назад 2
Я понимаю. Но можно же сделать наполовину того и того? =)
Msey #5 - 5 лет назад -14
По-моему глупо делать огромную статью, тратить время только чтобы продемонстрировать пару действий из UMSWE.
Тем, кто знает jass эта статья не пригодится вовсе, а гуишники не поймут. Проще было сделать полностью на гуи и со скринами.
Bornikkeny #6 - 5 лет назад 2
Эй. Я делал на гуи. Правда для сингл и оочень примитивную... У меня тока небыло таких "рамочек" и использовал в других целей... и не зря я писал что редкая статья, ведь множество новичков ГУИ хотят сделать оригинальную рпг, а статья в помошь. Тем более автор так грамотно написал, душу приложил...
goldplay99 #7 - 5 лет назад 5
Msey:
По-моему глупо делать огромную статью, тратить время только чтобы продемонстрировать пару действий из UMSWE.
Тем, кто знает jass эта статья не пригодится вовсе, а гуишники не поймут. Проще было сделать полностью на гуи и со скринами.
А есть люди которые не хотят делать на гуй, хотят перейти на Джасс и не могут, потому что статьи для них написанны на другом языке.
Msey #8 - 5 лет назад 0
стоит только высказать свое мнение, так вы сразу мне мозг выносить начинаете.
Bornikkeny, я не сомневаюсь, что вложил душу
перейти на Джасс
они будут читать статьи по переходу на джасс, а не созданию гуи трекаблей, уж поверь
Uber #9 - 5 лет назад 0
Далее заходим в Редактор Объектов>Разрешаемые Объекты. Создаем Разрешаемый Объект,
Как минимум, разрушаемые объекты.
Bornikkeny #10 - 5 лет назад 0
Извини, просто не понял. Но мог бы ннаписать имхо... кэп))))
ADOLF #11 - 5 лет назад 8
Отступы!!!
Харгард #12 - 5 лет назад (отредактировано ) 2
Лажа эти ваши тракаблы.
Представив итемы в инвентаре плоскими юнитами-иконками, и возможностей больше, и пользователю с ними удобней.
Одни выделение рамкой и даблклик чего стоят.
На тракаблах их реализовывать запыхаешься.
alexprey #13 - 5 лет назад -5
Харгард, как раз таки на оборот
Харгард #14 - 5 лет назад (отредактировано ) 3
Правильно.
Нахрен надо выделение нескольких предметов с зажатым шифтом/рамкой. - Канонично "клевать" мышой.
Нахрен нужна возможность дать предмету ауру свечения при выделении/экипировке. - А зачем, ведь в описании видно, какой предмет выделен.
Нахрен нужны способности с горячими клавишами, при выделении предметов, вроде одеть/выкинуть/продать. - Ведь издревле повелось все делать кликами мыши.
Doc #15 - 5 лет назад 6
Харгард, лол если ты думаешь, что сложно реализовать даблклик и свечение, а юниты лучше трекаблей - ты очень и очень глуп.
ADOLF, +
Отступов в коде нет, полно грамматических ошибок. Ненужное выделение зеленым.
Непрофессионально короче.
Diaboliko #16 - 5 лет назад -6
Бесполезные понты, на мой взгляд.
Харгард #17 - 5 лет назад -6
Doc:
Харгард, лол если ты думаешь, что сложно реализовать даблклик и свечение, а юниты лучше трекаблей - ты очень и очень глуп.
Зато ты я смотрю дофига умный. Настолько, что наверное даже можешь реализовать поддержку хоткеев для операций с предметами. В мультиплеере. Или не осилишь?
А может тракаблы лучше тем, что для каждого игрока нужно создавать свое "поле" с инвентарем?
Или у них больше полей. чем у юнитов, к которым можно обратиться функциями (здоровье, абилки, бафы, ект)?
Doc #18 - 5 лет назад 10
Харгард, думаю в этом я опытней тебя)
Хоткеи? Ничего сложного, не могу понять зачем ты вообще это спросил, понты, агр?
Могу тебе сказать, что дело в том, что юниты в отличие от трекаблей не предназначены для такого рода систем и выглядят в них просто глупо и неудобно.
И для чего же нужны тебе эти дополнительные поля?
Что ты будешь в них хранить?
И как ты будешь делать разные инвентари в мультиплеере? Изворачиваться с GetLocalPlayer()? С юнитами это не так просто, как с дестрактаблами/трекаблами.
Ты не шаришь в общем, как я понял.
goldplay99 #19 - 5 лет назад 2
Doc:
Харгард, лол если ты думаешь, что сложно реализовать даблклик и свечение, а юниты лучше трекаблей - ты очень и очень глуп.
ADOLF, +
Отступов в коде нет, полно грамматических ошибок. Ненужное выделение зеленым.
Непрофессионально короче.
К сожалению ты прав. =( Но в общем понять же можно? Я например по статья, где описываются только 3-4 функции не очь понимал. А примеры - которые пихали вообще вынос мозга. Статья на 20 строк, а пример на строк +100500...
Mud_Flow #20 - 5 лет назад 0
Ох сколько-же зеленого...а так плюс.
goldplay99 #21 - 5 лет назад 0
я выделял все названия) и пути =)
HappyDeath #22 - 5 лет назад 0
Отличная статья, только нельзя ли доработать так, чтобы при нажатии правой кнопкой на магазин он не шел туда?
мб при нажатии скила(магазин) сделать вокруг юнита блокираторы пути, а лучше снизить скорость бега до 0?
Doc #23 - 5 лет назад 3
HappyDeath, я думаю, это уже должен "программист" решать. Я просто паузил героя например. Но лучше, конечно, просто не давать ему идти туда.
goldplay99 #24 - 5 лет назад 2
Это уже не мои проблемы) Пускай сами решают.
Sidzzz8 #25 - 5 лет назад 0
Msey:
По-моему глупо делать огромную статью, тратить время только чтобы продемонстрировать пару действий из UMSWE.
Тем, кто знает jass эта статья не пригодится вовсе, а гуишники не поймут. Проще было сделать полностью на гуи и со скринами.
Тоесть новички пусть сосут палец да? Это ты хотел сказать?
goldplay99 #26 - 5 лет назад 2
Sidzzz8:
По-моему глупо делать огромную статью, тратить время только чтобы продемонстрировать пару действий из UMSWE.
Тем, кто знает jass эта статья не пригодится вовсе, а гуишники не поймут. Проще было сделать полностью на гуи и со скринами.
Тоесть новички пусть сосут палец да? Это ты хотел сказать?
Наверное =). Проше было бы найти статью и как минимум 1 день думать - куда пихать этот чертов код и как отследить трэкайбл.
4 комментария удалено
Nighty #31 - 5 лет назад 0
есть вопрос - обязательно ли рамки должны быть "разрушаемыми" или можно простой "декор" ставить?
goldplay99 #32 - 5 лет назад 2
Можно
Dreii ну так что где сылка? Или только болтать ок?
Это сообщение удалено
Dechimo #34 - 5 лет назад 0
Автор молоток. Материал редкий. Спасибо автору =)
Это сообщение удалено
KO3bMA #36 - 5 лет назад 0
Есть сведения, какое максимальное количество тракейблов можно разместить на карте?
Clamp #37 - 5 лет назад 0
KO3bMA, в своё время зи делал с джоном шутер в 3д, там трекейблов овер 3к было =)
из всей статьи при моём нулевом опыте работы с трекейблами полезной оказалась только ссылка на элементы интерфейса =D
Doc #38 - 5 лет назад 2
KO3bMA, я заполнял 64х64 или 96х96 полностью. Не помню в целом, могу карту скинуть.
Кстати кламп некрофил.
Это сообщение удалено
Clamp #40 - 5 лет назад 0
Алсо, Bottom и Top, а не Down and Up. Это я про названия декораций.
map_maiker #41 - 4 года назад 0
Хорошая статья
Как-то нашел в common.j переменную типа trackable и начал интересоваться этим зверем,это первая статья,которую я нашел(и пока единственная))
Спасибо автору и большой плюс
pusha1999 #43 - 3 года назад 0
nvc123, обоснуй свой довод. всю жизнь пользуюсь и никаких проблем. ни в сингл ни в мультиплеере
Revenantik #44 - 2 года назад 3
2 дня поковыряв наработку получилось что то такое. Спасибо автору)))
прикреплены файлы
Artyom18 #45 - 2 года назад -1
Для начала скачайте ЭТО, необходимые модели рамок и кнопок. Вообще без них нельзя будет сделать. Импортируем всё в нашу карту, по желанию убираем war3mapImported.
Далее заходим в Редактор Объектов>Разрешаемые Объекты. Создаем Разрешаемый Объект, за основу мне нравиться брать Блокировку пути. Этот объект я назвал Border. Теперь будем его редактировать, а
не РАЗРЕШАЕМЫЕ а РАЗРУШАЕМЫЕ!!!
darkowlom #46 - 2 года назад 0
Artyom18, 4 года никаких археологов это не беспокоило, исправил, но зачем столь бурно реагировать?!
На сайте есть функция цитат