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

#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