aboutsummaryrefslogtreecommitdiff
path: root/example/main.lua
blob: 460d99c80b91b34d270f92a3359adf50d75caa6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
--[[

   Lua star example - Run with love (https://love2d.org/)

   Copyright 2017 wesley werner <wesley.werner@gmail.com>

   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