-- Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. -- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -- Die obenstehende lizenz ist BSD0 -- heist ungefähr: Du darfst den code nutzen für egal was und musst mich nicht als autoren nennen -- oder die lizenz als text kopieren -- Bei fragen zu den love.* funktionen ist die love2d wiki eine gute ressource! -- https://love2d.org/wiki/Main_Page local icons = {} local xPosition = 0 for index, file in pairs(love.filesystem.getDirectoryItems("Icons/")) do table.insert(icons, {image = love.graphics.newImage("Icons/" .. file), x = xPosition, y = 0 }) -- Verschiebe den zeichencursor nach rechts, und zwar um die breite der neuesten textur in icons xPosition = xPosition + icons[#icons].image:getWidth() end function love.draw() -- Alle icons nacheinander zeichnen, icons später in der tabelle werden später gezeichnet. -- Daher sind diese immer über icons zu sehen die vor ihnen gezeichnet wurden for index, icon in ipairs(icons) do love.graphics.draw(icon.image, icon.x, icon.y) end end -- offsetX/Y Beschreibt wie weit der Cursor von dem anfang der textur weg ist, -- sobald die textur dann gezogen wird kann man dies beachten damit die textur nicht zum cursor snappt local offsetX = 0 local offsetY = 0 local grabbedItem = nil function love.mousepressed(x, y, key) -- hier wird das letzte item in der tabelle genommen wo die coordinaten übereinstimmen -- Daher wird auch immer das icon ausgewählt das oben gezeichnet wurde -- -- Der check funktioniert so: die x position des mauszeigers wird mit der x position des icons -- verglichen und mit der x positions des icons plus seiner breite. Wenn das beides stimmt -- muss der cursor innerhalb der breite des icons sein. -- danach wird das gleich mit der y position gemacht, nur dass dies die höhe überprüft. for index, icon in ipairs (icons) do if icon.x <= x and icon.x + icon.image:getWidth() >= x and icon.y <= y and icon.y + icon.image:getHeight() >= y then grabbedItem = icon end end -- Falls kein item gefunden wurde wird die funktion hier verlassen if not grabbedItem then return end if key == 2 then -- Hier wird das icon kopiert, statt das das original genommen wird -- aber nur wenn der "key" d.H der mausknopf der zweite ist, also ein rechtsclick table.insert(icons, { image = grabbedItem.image, x = grabbedItem.x, y = grabbedItem.y }) grabbedItem = icons[#icons] end -- Hier könte man offsetX und offsetY = 0 setzen um den effekt mit dem snappen zu sehen offsetX = grabbedItem.x -x offsetY = grabbedItem.y -y end function love.mousemoved(x, y) -- Das wird nur ausgeführt wenn ein icon zum ziehen gemerkt ist -- andernfalls hat grabbedItem den wer nil, was in lua neben false auch falsch ist if grabbedItem then grabbedItem.x = offsetX + x grabbedItem.y = offsetY + y end end function love.mousereleased(x, y) if grabbedItem then -- Hier wird nur die referenz zum icon gelöscht, daher wird es in mousemoved -- nicht weiter bewegt grabbedItem = nil end end --[[ Hier eine grafik zum veranschaulichen wie love2d eine textur zeichnet +-------------------------------------> x (in pixeln) | | | R----------+ - | | | | | | | | getHeight() | | | | | +----------G - | | |----------| | getWidth() | V Y (in pixeln) Die coordinate an position R ist x und y für die zeichenkoordinaten des Icons das gezeichnet wird, das heist eine textur wird normalerweise von links oben nach rechts unten gezeichnet Die coordinate an position G ist mit der höhe und der breite errechenbar -> x + getWidth() -> y + getHeight() ]]--