欢迎光临散文网 会员登陆 & 注册

jass基础-仓库UI-拾取交互

2023-08-26 10:13 作者:庞各庄大棚  | 我要投稿

#include "../../jass/BlizzardAPI.j"

library demo initializer test


    // 仓库UI - 拾取交互


    globals

        Storage sto


        unit hero

    endglobals


    struct Storage

        integer parentUI  // 父UI

        integer backUI   // 背景图

        integer array cellArr[100]  // 格子

        integer array cellBtnArr[100]  // 格子按钮

        item array itemArr[100] // 存起来的道具

        real cellSize  // 格子的大小(长宽)

        real borderSize // 边框大小

        integer row  // 横向格子数

        integer col  // 纵向格子数

        string backStr = ""  // 背景图路径

        string cellStr = "ReplaceableTextures\\PassiveButtons\\PASBTNStatUp.blp" // 格子图路径


        boolean isPick = false


        boolean isOpen = false


        integer array btnUIArr[3] // 背包开关按钮数组


        public static method create takes integer row, integer col, real cellSize, real borderSize returns thistype

            local Storage this = Storage.allocate()

            set this.row = row

            set this.col = col

            set this.cellSize = cellSize

            set this.borderSize = borderSize

            return this

        endmethod

    endstruct


    function openOrClose takes nothing returns nothing

        if sto.isOpen == true then

            set sto.isOpen = false

        else

            set sto.isOpen = true

        endif

        call DzFrameShow(sto.parentUI, sto.isOpen)

    endfunction


    function storageInit takes nothing returns nothing

        local integer i = 0

        local integer j = 0

        local integer index

        set sto = Storage.create(10, 6, 0.04, 0.01)

        set sto.parentUI = DzCreateFrameByTagName("FRAME", "", DzGetGameUI(), "", 0)

        call DzFrameSetAbsolutePoint(sto.parentUI, 0, 0.2, 0.5)

        call DzFrameSetSize(sto.parentUI, 2 * sto.borderSize + sto.row * sto.cellSize, 2 * sto.borderSize + sto.col * sto.cellSize)

        set sto.backUI = DzCreateFrameByTagName("BACKDROP", "", sto.parentUI, "", 0)

        call DzFrameSetPoint(sto.backUI, 0, sto.parentUI, 0, 0, 0)

        call DzFrameSetSize(sto.backUI, 2 * sto.borderSize + sto.row * sto.cellSize, 2 * sto.borderSize + sto.col * sto.cellSize)

        call DzFrameSetTexture(sto.backUI, sto.backStr, 0)


        set sto.btnUIArr[0] = DzCreateFrameByTagName("FRAME", "", DzGetGameUI(), "", 0)

        call DzFrameSetAbsolutePoint(sto.btnUIArr[0], 6, 0.78, 0.2)

        call DzFrameSetSize(sto.btnUIArr[0], 0.02, 0.02)


        set sto.btnUIArr[1] = DzCreateFrameByTagName("BACKDROP", "", sto.btnUIArr[0], "", 0)

        call DzFrameSetPoint(sto.btnUIArr[1], 6, sto.btnUIArr[0], 6, 0, 0)

        call DzFrameSetSize(sto.btnUIArr[1], 0.02, 0.02)

        call DzFrameSetTexture(sto.backUI, "", 0)


        set sto.btnUIArr[2] = DzCreateFrameByTagName("GLUEBUTTON", "", sto.btnUIArr[1], "", 0)

        call DzFrameSetPoint(sto.btnUIArr[2], 6, sto.btnUIArr[1], 6, 0, 0)

        call DzFrameSetSize(sto.btnUIArr[2], 0.02, 0.02)

        call DzFrameSetScript(sto.btnUIArr[2], 1, "openOrClose", false)

        loop

            exitwhen i >= sto.col

            loop

                exitwhen j >= sto.row

                set index = j + i * sto.row

                set sto.cellArr[index] = DzCreateFrameByTagName("BACKDROP", "", sto.backUI, "", 0)

                call DzFrameSetPoint(sto.cellArr[index], 0, sto.backUI, 0, sto.borderSize + j * sto.cellSize, - (sto.borderSize + i * sto.cellSize))

                call DzFrameSetSize(sto.cellArr[index], sto.cellSize, sto.cellSize)

                call DzFrameSetTexture(sto.cellArr[index], sto.cellStr, 0)

                set j = j + 1

            endloop

            set j = 0

            set i = i + 1

        endloop


        call DzFrameShow(sto.parentUI, false)

    endfunction


    function doSomething takes nothing returns nothing

        call storageInit()

    endfunction


    function findFreeIndex takes integer btn returns integer

        local integer i = 0

        loop

            exitwhen i >= sto.row * sto.col

            if sto.cellBtnArr[i] == btn then

                return i

            endif

            set i = i + 1

        endloop

        return - 1

    endfunction


    function isFull takes nothing returns boolean

        local integer i = 0

        loop

            exitwhen i >= 6

            if UnitItemInSlot(hero, i) == null then

                return false

            endif

            set i = i + 1

        endloop

        return true

    endfunction


    function clickBtn takes nothing returns nothing

        local integer btn = DzGetTriggerUIEventFrame()

        local integer index = findFreeIndex(btn)

        if index == -1 then

            return

        endif

        if isFull() then

            call BJDebugMsg("背包满了")

            return

        endif

        set sto.isPick = true

        call DzFrameSetTexture(sto.cellArr[index], sto.cellStr, 0)

        call DzFrameClearAllPoints(btn)

        call DzDestroyFrame(btn)

        set sto.cellBtnArr[index] = 0


        call UnitAddItem(hero, sto.itemArr[index])

        set sto.isPick = false

    endfunction


    function pickAction takes nothing returns nothing

        local unit u = GetTriggerUnit()

        local item it = GetManipulatedItem()

        // 获取道具的图标

        local string str = YDWEGetItemDataString(GetItemTypeId(it), 1)

        local integer freeIndex = findFreeIndex(0)

        if index == -1 then

            call BJDebugMsg("仓库满了")

            return

        endif

        if u == hero and not sto.isPick then

            call DzFrameSetTexture(sto.cellArr[freeIndex], str, 0)

            set sto.cellBtnArr[freeIndex] = DzCreateFrameByTagName("GLUEBUTTON", "", sto.cellArr[freeIndex], "", 0)

            call DzFrameSetPoint(sto.cellBtnArr[freeIndex], 6, sto.cellArr[freeIndex], 6, 0, 0)

            call DzFrameSetSize(sto.cellBtnArr[freeIndex], sto.cellSize, sto.cellSize)

            call DzFrameSetScript(sto.cellBtnArr[freeIndex], 1, "clickBtn", false)


            call UnitDropItemPoint(hero, it, GetUnitX(hero), GetUnitY(hero))

            call SetItemPosition(it, 1000, 1000)

            set sto.itemArr[freeIndex] = it

        endif

        set it = null

         set u = null

    endfunction


    function triggerInit takes nothing returns nothing

        local trigger t = CreateTrigger()

        local trigger t2 = CreateTrigger()

        local trigger t3 = CreateTrigger()

        call TriggerRegisterPlayerChatEvent(t, Player(0), "1", true)

        call TriggerAddAction(t, function doSomething)


        call TriggerRegisterTimerEventSingle(t2, 0)

        call TriggerAddAction(t2, function storageInit)


        call TriggerRegisterAnyUnitEventBJ(t3, EVENT_PLAYER_UNIT_PICKUP_ITEM)

        call TriggerAddAction(t3, function pickAction)

        set t = null

        set t2 = null

        set t3 = null

    endfunction


    function gameInit takes nothing returns nothing

        local unit u2 = CreateUnit(Player(0), 'hrif', 100, 100, 0)

        set hero = CreateUnit(Player(0), 'Hpal', 0, 0, 0)

        call EnableDragSelect(false, true)

        call FogEnable(false)

        call FogMaskEnable(false)


        call CreateItem('rat3', 0, 0)

        call CreateItem('rat3', 0, 0)

        call CreateItem('rat3', 0, 0)

        call CreateItem('evtl', 0, 0)

        call CreateItem('evtl', 0, 0)

        call CreateItem('evtl', 0, 0)

        call CreateItem('evtl', 0, 0)

        call CreateItem('rst1', 0, 0)

        call CreateItem('rst1', 0, 0)

        call CreateItem('rst1', 0, 0)

        call CreateItem('rst1', 0, 0)

    endfunction


    function test takes nothing returns nothing

        call gameInit()

        call triggerInit()

    endfunction

endlibrary

jass基础-仓库UI-拾取交互的评论 (共 条)

分享到微博请遵守国家法律