love2d_examples/IconMover/main.lua

107 lines
4.1 KiB
Lua

-- 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()
]]--