diff --git a/ants/conf.lua b/ants/conf.lua index 5b1e8fc..7053fce 100644 --- a/ants/conf.lua +++ b/ants/conf.lua @@ -1,4 +1,4 @@ function love.conf(t) - t.window.highdpi = false + t.window.highdpi = true t.window.title = "ants" end diff --git a/ants/main.lua b/ants/main.lua index ae96e21..f1f9c12 100644 --- a/ants/main.lua +++ b/ants/main.lua @@ -33,13 +33,12 @@ local function initColors(rules) local colorbrewer = require("colorbrewer") -- set a specific random seed to avoid picking the same palette every time math.randomseed(os.time()) - local scheme = colorbrewer.random() - local variant = scheme[#rules] + local scheme = colorbrewer.random(#rules) COLORS = {} - for i = 1, #rules do + for i, color in pairs(scheme) do COLORS[i] = { clockwise = rules:sub(i, i) == "r", - rgba = variant[i] + rgba = color } end end @@ -56,12 +55,31 @@ local function initScreen() end) end -local function initAnt() - ANT = { - x = (WIDTH / 2) - ((WIDTH / 2) % UNITS), - y = (HEIGHT / 2) - ((HEIGHT / 2) % UNITS), - direction = "u", - } +local function initFont() + FONT = love.graphics.newFont(24) + love.graphics.setFont(FONT) + FPS_WIDTH = FONT:getWidth("120 FPS") + FPS_HEIGHT = FONT:getHeight() +end + +local function spawnAnt(x, y) + table.insert(ANTS, { + x = x, + y = y, + direction = "u" + }) +end + +local function spawnAntCentered() + spawnAnt( + (WIDTH / 2) - ((WIDTH / 2) % UNITS), + (HEIGHT / 2) - ((HEIGHT / 2) % UNITS) + ) +end + +local function initAnts() + ANTS = {} + spawnAntCentered() end local function initGrid() @@ -82,77 +100,91 @@ end function love.load(args) local rules = args[1] or "RL" - UNITS = args[2] or 8 + UNITS = args[2] or 4 STEPS_PER_FRAME = args[3] or 5 initColors(rules) initScreen() - initAnt() + initFont() + initAnts() initGrid() end -local function color(x, y) - return GRID[x][y] +local function antColor(ant) + return GRID[ant.x][ant.y] end -local function current() - return color(ANT.x, ANT.y) +local function setColor(ant, color) + GRID[ant.x][ant.y] = color end -local function setCurrent(index) - GRID[ANT.x][ANT.y] = index -end - -local function updateCurrent() - local val = current() +local function updateColor(ant) + local val = antColor(ant) if val == #COLORS then val = 1 else val = val + 1 end - setCurrent(val) + setColor(ant, val) end -local function nextColor() - local c = COLORS[current()] - updateCurrent() +local function nextColor(ant) + local c = COLORS[antColor(ant)] + updateColor(ant) return c end +function love.mousepressed(x, y, _, _) + spawnAnt(x, y) +end + function love.update() require("lurker").update() for _ = 1, STEPS_PER_FRAME do - local c = nextColor() - ANT.direction = rotate(ANT.direction, c.clockwise) - CANVAS:renderTo(function() - love.graphics.setBlendMode("alpha") - love.graphics.setColor(c.rgba) - love.graphics.rectangle("fill", ANT.x, ANT.y, UNITS, UNITS) - end) - if ANT.direction == "u" then - ANT.y = ANT.y - UNITS - elseif ANT.direction == "r" then - ANT.x = ANT.x + UNITS - elseif ANT.direction == "d" then - ANT.y = ANT.y + UNITS - else - ANT.x = ANT.x - UNITS - end + for i, ant in pairs(ANTS) do + local c = nextColor(ant) + ant.direction = rotate(ant.direction, c.clockwise) + CANVAS:renderTo(function() + love.graphics.setBlendMode("alpha") + love.graphics.setColor(c.rgba) + love.graphics.rectangle("fill", ant.x, ant.y, UNITS, UNITS) + end) + if ant.direction == "u" then + ant.y = ant.y - UNITS + elseif ant.direction == "r" then + ant.x = ant.x + UNITS + elseif ant.direction == "d" then + ant.y = ant.y + UNITS + else + ant.x = ant.x - UNITS + end - if ANT.x >= WIDTH then - ANT.x = 0 - elseif ANT.x < 0 then - ANT.x = (WIDTH - 1) - ((WIDTH - 1) % UNITS) - end - if ANT.y >= HEIGHT then - ANT.y = 0 - elseif ANT.y < 0 then - ANT.y = (HEIGHT - 1) - ((HEIGHT - 1) % UNITS) + if ant.x >= WIDTH then + ant.x = 0 + elseif ant.x < 0 then + ant.x = (WIDTH - 1) - ((WIDTH - 1) % UNITS) + end + if ant.y >= HEIGHT then + ant.y = 0 + elseif ant.y < 0 then + ant.y = (HEIGHT - 1) - ((HEIGHT - 1) % UNITS) + end + ANTS[i] = ant end end end +local function paintFPS() + love.graphics.setBlendMode("alpha") + local fps = tostring(love.timer.getFPS()) .. " FPS" + love.graphics.setColor(COLORS[1].rgba) + love.graphics.rectangle("fill", WIDTH - FPS_WIDTH - 10, HEIGHT - FPS_HEIGHT - 20, FPS_WIDTH + 10, FPS_HEIGHT + 10) + love.graphics.setColor(COLORS[#COLORS].rgba) + love.graphics.print(fps, WIDTH - FPS_WIDTH - 5, HEIGHT - FPS_HEIGHT - 15) +end + function love.draw() love.graphics.setBlendMode("alpha", "premultiplied") love.graphics.setColor(COLORS[1].rgba) love.graphics.draw(CANVAS, 0, 0) + paintFPS() end diff --git a/colorbrewer.lua b/colorbrewer.lua index cafcac1..9cd7b54 100644 --- a/colorbrewer.lua +++ b/colorbrewer.lua @@ -517,10 +517,11 @@ for _, scheme in pairs(colorbrewer) do end end -function colorbrewer.random() - local index = math.floor(math.random() * #names) - local scheme = names[index] - return colorbrewer[scheme] +function colorbrewer.random(length) + local index = math.floor(math.random() * #names) + 1 + local name = names[index] + local scheme = colorbrewer[name] + return scheme[length] end return colorbrewer diff --git a/flake.nix b/flake.nix index 631768f..fd00d02 100644 --- a/flake.nix +++ b/flake.nix @@ -20,7 +20,7 @@ pkgs.mkShell { LUA_PATH = "vendor/?.lua;;"; name = "love"; - packages = [ love ]; + packages = [ love pkgs.lua ]; shellHook = '' mkdir -p vendor ln -snf ${lume}/lume.lua vendor/lume.lua diff --git a/util.lua b/util.lua index 522a5a4..f384f8c 100644 --- a/util.lua +++ b/util.lua @@ -17,3 +17,5 @@ function printt(t, prefix, maxdepth) end end end + +color = require("colorbrewer")