Раздел:
Триггеры и объекты
Автор: 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_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. Потому, что мы добавили одну кнопку.

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.Карта-пример

Скачать тут
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
7
8
12 лет назад
7
Msey:
По-моему глупо делать огромную статью, тратить время только чтобы продемонстрировать пару действий из UMSWE.
Тем, кто знает jass эта статья не пригодится вовсе, а гуишники не поймут. Проще было сделать полностью на гуи и со скринами.
А есть люди которые не хотят делать на гуй, хотят перейти на Джасс и не могут, потому что статьи для них написанны на другом языке.
4
29
12 лет назад
4
стоит только высказать свое мнение, так вы сразу мне мозг выносить начинаете.
Bornikkeny, я не сомневаюсь, что вложил душу
перейти на Джасс
они будут читать статьи по переходу на джасс, а не созданию гуи трекаблей, уж поверь
2
26
12 лет назад
2
Далее заходим в Редактор Объектов>Разрешаемые Объекты. Создаем Разрешаемый Объект,
Как минимум, разрушаемые объекты.
0
22
12 лет назад
0
Извини, просто не понял. Но мог бы ннаписать имхо... кэп))))
10
33
12 лет назад
10
Отступы!!!
5
15
12 лет назад
Отредактирован Харгард
5
Лажа эти ваши тракаблы.
Представив итемы в инвентаре плоскими юнитами-иконками, и возможностей больше, и пользователю с ними удобней.
Одни выделение рамкой и даблклик чего стоят.
На тракаблах их реализовывать запыхаешься.
1
29
12 лет назад
1
Харгард, как раз таки на оборот
3
15
12 лет назад
Отредактирован Харгард
3
Правильно.
Нахрен надо выделение нескольких предметов с зажатым шифтом/рамкой. - Канонично "клевать" мышой.
Нахрен нужна возможность дать предмету ауру свечения при выделении/экипировке. - А зачем, ведь в описании видно, какой предмет выделен.
Нахрен нужны способности с горячими клавишами, при выделении предметов, вроде одеть/выкинуть/продать. - Ведь издревле повелось все делать кликами мыши.
7
29
12 лет назад
7
Харгард, лол если ты думаешь, что сложно реализовать даблклик и свечение, а юниты лучше трекаблей - ты очень и очень глуп.
ADOLF, +
Отступов в коде нет, полно грамматических ошибок. Ненужное выделение зеленым.
Непрофессионально короче.
2
20
12 лет назад
2
Бесполезные понты, на мой взгляд.
1
15
12 лет назад
1
Doc:
Харгард, лол если ты думаешь, что сложно реализовать даблклик и свечение, а юниты лучше трекаблей - ты очень и очень глуп.
Зато ты я смотрю дофига умный. Настолько, что наверное даже можешь реализовать поддержку хоткеев для операций с предметами. В мультиплеере. Или не осилишь?
А может тракаблы лучше тем, что для каждого игрока нужно создавать свое "поле" с инвентарем?
Или у них больше полей. чем у юнитов, к которым можно обратиться функциями (здоровье, абилки, бафы, ект)?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.