Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Наработка
Версия Warcraft:
1.26, 1.27a, 1.27b, 1.28f
Небольшое отступление
- Замена стандартного функционала на фреймах - есть
- Полезная наработка, показанная на примере фреймов - есть
- Рофл функционал, набравший больше всего лайков - есть
- Часто повторяемая и гибкая система - есть
- Нестандартное применение обычного фрейма - есть
- Фрейм на фреймах - ?

Кастомный слайдер
- Работает.
- Из-за сломанного GetFrameValue в отношении слайдеров, крайне полезная наработка.

Функционал
- Имеет адекватный геттер и сеттер.
- Повторяет функционал обычных слайдеров.
- Есть возможность выставлять минимальные и максимальные значения. Адекватная работа возможна только при, (-∞, 0) и (0, ∞)
- Я не математик, поэтому не смог сделать лучше, если есть хорошее решение > жду в комментариях

Требования
- Уверенное пользование jass.
- Мемхак анрайза. (>1.3)
- pjass для работы мемхака. (Закинуть в JNGP/jasshelper)

Использование
1. Скачиваем пример.
2. Копируем папку триггеров CustomSlider и кидаем к себе в карту.
3. Экспортируем text.fdf, uitoc.toc и кидаем к себе в карту.
4. Настраиваем это дело. Это потребует времени
5. Вшиваем в свою систему.
6. Радуемся. (optional)

Код
- 6.
- Из кода, думаю, все ясно.
Init
globals
    
    integer SliderBackdrop
    real BackdropPosX = .4
    real BackdropPosY = .3
    integer SliderThumb
    real ThumbX = 0
    real ThumbY = 0
    // Настройки
    real BackdropWidth = .3
    real MinValue = 0
    real MaxValue = 100
    real CurrentValue = 0
    
    // Демонстрация
    integer Text
    
endglobals
// GetFramePointX|Y работают не корректно

function Trig_Init_Actions takes nothing returns nothing
    
    local integer i = 0
    
    call LoadTOCFile("uitoc.toc")
    
    set SliderBackdrop = CreateFrame("SliderBackdrop", pGameUI, 0)
    call SetFrameSize(SliderBackdrop, BackdropWidth, .01)
    call SetFrameAbsolutePoint(SliderBackdrop, 4, BackdropPosX, BackdropPosY)
    
    set SliderThumb = CreateFrame("SliderThumb", SliderBackdrop, 1)
    call SetFrameSize(SliderThumb, .015, .015)
    call SetFramePoint(SliderThumb, 4, SliderBackdrop, 4, ThumbX, ThumbY)

    set Text = CreateFrame("ChatText2", pGameUI, 2)
    call SetFrameSize(Text, .015, .015)
    call SetFramePoint(Text, 4, pGameUI, 4, 0, .1)
    call SetFrameText(Text, R2S(CurrentValue))
endfunction

//===========================================================================
function InitTrig_Init takes nothing returns nothing
    set gg_trg_Init = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg_Init, 0.05 )
    call TriggerAddAction( gg_trg_Init, function Trig_Init_Actions )
endfunction
MouseEvent
globals
    boolean KeySpan
    boolean OnSlider
endglobals

function SetCSliderValue takes real value returns nothing
    //local real temp
    //local real temp1
    //local real temp2
    //local real temp3
    
    //set temp = value - MinValue
    //set temp1 = temp / MaxValue
    //set temp2 = temp1 * BackdropWidth
    //set temp3 = temp2 - BackdropWidth / 2
    
    set CurrentValue = value
    set ThumbX = ( ( (value - MinValue) / MaxValue ) * BackdropWidth ) - ( BackdropWidth / 2 )
    call SetFramePoint(SliderThumb, 4, SliderBackdrop, 4, ThumbX, ThumbY)
endfunction

function MouseEvent takes nothing returns nothing

    local integer i = 0
    local integer layer = FindCLayerUnderCursor()
    local real frameX = FromPixelX(R2I(GetCursorXRelative()))
    local real frameY = .6 - FromPixelY(R2I(GetCursorYRelative()))

    loop
    exitwhen i == 2
    
    if GetLocalPlayer() == Player(i) then
        
        // call SetCSliderValue(25)
        
        if ( layer == SliderThumb and IsKeyPressed(0x01) ) or OnSlider then
            set OnSlider = true
            if frameX -  BackdropPosX <= BackdropWidth / 2 and  frameX -  BackdropPosX >= -BackdropWidth / 2 then
                set ThumbX = frameX - BackdropPosX
                call SetFramePoint(SliderThumb, 4, SliderBackdrop, 4, ThumbX, ThumbY)
                set CurrentValue = MinValue + ((ThumbX + BackdropWidth / 2) / BackdropWidth) * MaxValue 
            endif
        endif
        
        call SetFrameText(Text, R2S(CurrentValue))
        
        if IsKeyPressed(0x01) then
            set KeySpan = false
        else
            set KeySpan = true
            set OnSlider = false
        endif

    endif

    set i = i + 1
    endloop

endfunction

//===========================================================================
function InitTrig_MouseEvent takes nothing returns nothing
    //set gg_trg_MouseEvent = CreateTrigger(  )
    call TimerStart(CreateTimer(), .001, true, function MouseEvent)
endfunction

Бонус Две наработки в одном ресурсе
- Управление камерой на таких слайдерах.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
8
3 года назад
0
Нормально, нормально
2
32
3 года назад
Отредактирован Берги
2
А можно такое сделать в обычном редакторе, без триггоров?
Загруженные файлы
0
12
3 года назад
0
Ждем фреймы на гуи , давно пора
1
8
3 года назад
1
Daro, мемхак на гуи это какой-то новый вид извращения
Чтобы оставить комментарий, пожалуйста, войдите на сайт.