Как разработать "Динамическую систему инвентаризации" для игры "укажи и щелкни"?
Я провел много исследований по системе Invetory для игры "укажи и щелкни" в Lua и Corona. Я сталкивался с этим примером, я делаю что-то похожее на это, но мне нужна динамическая система инвентаризации. Я имею в виду, что если у меня есть 4 слота, и все они заполнены, пятый объект перейдет к следующему слоту, поэтому будет стрелка вправо, чтобы я мог щелкнуть и перейти на следующую страницу. И представьте, что есть 5 предметов, и у меня есть 4 слота, пятый слот будет на следующей странице. Я использую третий элемент, и третий слот будет пустым, поэтому я хочу, чтобы четвертый и пятый элементы автоматически переместились обратно в третий и четвертый слот. Мне трудно понять это. Спасибо за продвижение.
local myInventoryBag={}
local maxItems = 10 -- change this to how many you want
myInventoryBag[5]=3 -- Hammer for instance
myInventoryBag[4]=7 -- A metal Pipe for instance
local function getImageForItem(thisItem)
local itemNumber = tonumber(thisItem)
local theImage=""
if itemNumber==3 then
theImage="hammer.png"
elseif itemNumber == 7 then
theImage="metalpipe.png"
elseif ... -- for other options
...
else
return nil
end
local image = display.newImage(theImage)
return image
end
local function displayItems()
local i
for i=1,#myInventoryBag do
local x = 0 -- calculate based on the i
local y = 0 -- calculate based on the i
local image = getImageForItem(myInventoryBag[i])
if image==nil then return end
image.setReferencePoint(display.TopLeftReferencePoint)
image.x = x
image.y = y
end
end
2 ответа
local itemImages =
{
[0] = display.newImage('MISSING_ITEM_IMAGE.PNG'),
[3] = display.newImage('hammer.png'),
[7] = display.newImage('metalpipe.png'),
}
function getImageForItem(itemId)
return itemImages[itemId] or itemImages[0]
end
local myInventoryBag={}
local maxItems = 10 -- change this to how many you want
local visibleItems = 4 -- show this many items at a time (with arrows to scroll to others)
-- show inventory items at index [first,last]
local function displayInventoryItems(first,last)
local x = 0 -- first item goes here
local y = 0 -- top of inventory row
for i=first,last do
image = getImageForItem(myInventoryBag[i])
image.x = x
image.y = y
x = x + image.width
end
end
-- show inventory items on a given "page"
local function displayInventoryPage(page)
page = page or 1 -- default to showing the first page
if page > maxItems then
-- error! handle me!
end
local first = (page - 1) * visibleItems + 1
local last = first + visibleItems - 1
displayInventoryItems(first, last)
end
myInventoryBag[5] = 3 -- Hammer for instance
myInventoryBag[4] = 7 -- A metal Pipe for instance
displayInventoryPage(1)
displayInventoryPage(2)
По сути, вы должны перебрать все слоты инвентаря и проверить, пуст ли слот. Если он пуст, поместите предмет в этот слот и остановите цикл. Если это не так, переходите к следующему.
Если вы хотите удалить предмет из инвентаря, вы можете просто позвонить table.delete(myInventoryBag, slotToEmpty)
,
Для страниц, вы бы просто page
переменная. При рисовании слотов инвентаря, просто петли из слотов (page-1) * 4 + 1
в page * 4
,
(Изменить: я настоятельно рекомендую использовать правильные отступы, так как это сделает код намного более читабельным.)