X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=example%2Fmain.lua;fp=example%2Fmain.lua;h=460d99c80b91b34d270f92a3359adf50d75caa6a;hb=70456152fafb83e661fa882fe4e7ec04a29670fd;hp=0000000000000000000000000000000000000000;hpb=21bc35bf32c48a229aec09a6d433c55acc532e77;p=lua-star.git diff --git a/example/main.lua b/example/main.lua new file mode 100644 index 0000000..460d99c --- /dev/null +++ b/example/main.lua @@ -0,0 +1,107 @@ +--[[ + + Lua star example - Run with love (https://love2d.org/) + + Copyright 2017 wesley werner + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see http://www.gnu.org/licenses/. + +]]-- + +local luastar = require("lua-star") + +-- a 2D map where true is open and false is blocked +local map = { } +local mapsize = 10 +local screensize = 500 +local tilesize = screensize / mapsize + +-- path start and end +local path = nil +local start = { x = 1, y = 10 } +local goal = { x = 10, y = 1 } + +function love.load() + + love.window.setMode( screensize, screensize ) + + -- build an open map + for x=1, mapsize do + map[x] = {} + for y=1, mapsize do + map[x][y] = true + end + end + + requestPath() + +end + +function love.keypressed(key) + + if key == "escape" then + love.event.quit() + end + +end + +function love.draw() + + -- draw walls + love.graphics.setColor(255, 255, 255) + for x=1, mapsize do + for y=1, mapsize do + local fillstyle = "line" + if map[x][y] == false then fillstyle = "fill" end + love.graphics.rectangle(fillstyle, (x-1)*tilesize, (y-1)*tilesize, tilesize, tilesize) + end + end + + -- draw start and end + love.graphics.print("START", (start.x-1) * tilesize, (start.y-1) * tilesize) + love.graphics.print("GOAL", (goal.x-1) * tilesize, (goal.y-1) * tilesize) + + -- draw the path + if path then + for i, p in ipairs(path) do + love.graphics.setColor(0, 128, 0) + love.graphics.rectangle("fill", (p.x-1)*tilesize, (p.y-1)*tilesize, tilesize, tilesize) + love.graphics.setColor(255, 255, 255) + love.graphics.print(i, (p.x-1) * tilesize, (p.y-1) * tilesize) + end + end + +end + +function love.mousepressed( x, y, button, istouch ) + + local dx = math.floor(x / tilesize) + 1 + local dy = math.floor(y / tilesize) + 1 + map[dx][dy] = not map[dx][dy] + requestPath() + +end + +function positionIsOpenFunc(x, y) + + -- should return true if the position is open to walk + return map[x][y] + +end + +function requestPath() + + path = luastar:find(mapsize, mapsize, start, goal, positionIsOpenFunc) + +end