Browse Source

wowowow

master
churchianity 6 years ago
parent
commit
c011dfdde1
  1. 78
      hex.lua
  2. 5
      main.lua

78
hex.lua

@ -2,15 +2,17 @@
--[[ author@churchianity.ca --[[ author@churchianity.ca
-- INTRODUCTION -- INTRODUCTION
this is a library for making grids of hexagons using lua. this is a library for making grids of hexagons using lua.
it has made use of exclusively standard lua 5.2 functionality,
making it as portable as possible. it doesn't even use a point
class, (or classes/metatables at all) simply returning tables
it has made exclusive (though not thorough) use of standard lua
5.2 functionality, making it as portable as possible. it
doesn't even use a point class, simply returning tables
of integers, which can later be unpacked into your amulet of integers, which can later be unpacked into your amulet
vectors, or whatever else you want to use.
vectors, or whatever else you want to use. in honor of amulet,
when necessary to name cube/hex coordinates, (s, t, z) is the
convention.
this can result in some nasty looking lines with lots of table
unpacks, but if your graphics library likes traditional lua
types, you will be better off.
only returning tables can result in some nasty looking lines
with lots of table unpacks, but if your graphics library likes
traditional lua types, you will be better off.
it supports triangular, hexagonal, rectangular, and it supports triangular, hexagonal, rectangular, and
parallelogram map shapes. parallelogram map shapes.
@ -24,6 +26,10 @@
series of lines connecting points), the flat orientation is series of lines connecting points), the flat orientation is
default and recommended. other orientations are possible default and recommended. other orientations are possible
with am.rotate, but can cause aliasing issues. TODO work on this. with am.rotate, but can cause aliasing issues. TODO work on this.
-- TODO NOTE -
amulet has another draw function I neglected, simply am.draw.
i don't understand how it works, but it seems to be able to
draw arbitrary polygons via a list of vertices. so.
-- RESOURCES USED TO DEVELOP THIS LIBRARY -- RESOURCES USED TO DEVELOP THIS LIBRARY
https://redblobgames.com/grid/hexagons - simply amazing. amit is a god. https://redblobgames.com/grid/hexagons - simply amazing. amit is a god.
@ -74,18 +80,18 @@ end
----- [[ LAYOUT, ORIENTATION & COORDINATE CONVERSION ]] ----------------------- ----- [[ LAYOUT, ORIENTATION & COORDINATE CONVERSION ]] -----------------------
-- forward & inverse matrices used for the flat orientation. -- forward & inverse matrices used for the flat orientation.
FLAT_ORIENTATION = {3.0/2.0, 0.0, 3.0^0.5/2.0, 3.0^0.5,
2.0/3.0, 0.0, -1.0/3.0 , 3.0^0.5/3.0}
local FLAT = {3.0/2.0, 0.0, 3.0^0.5/2.0, 3.0^0.5,
2.0/3.0, 0.0, -1.0/3.0 , 3.0^0.5/3.0}
-- forward & inverse matrices used for the pointy orientation. -- forward & inverse matrices used for the pointy orientation.
POINTY_ORIENTATION = {3.0^0.5, 3.0^0.5/2.0, 0.0, 3.0/2.0,
3.0^0.5/3.0, -1.0/3.0, 0.0, 2.0/3.0}
local POINTY = {3.0^0.5, 3.0^0.5/2.0, 0.0, 3.0/2.0,
3.0^0.5/3.0, -1.0/3.0, 0.0, 2.0/3.0}
-- layout. -- layout.
function layout_init(origin, size, orientation) function layout_init(origin, size, orientation)
return {origin = origin or {0, 0}, return {origin = origin or {0, 0},
size = size or {11, 11}, size = size or {11, 11},
orientation = orientation or FLAT_ORIENTATION}
orientation = orientation or FLAT}
end end
-- hex to screen -- hex to screen
@ -122,8 +128,10 @@ end
-- returns parallelogram-shaped map. -- returns parallelogram-shaped map.
function map_parallelogram_init(layout, width, height) function map_parallelogram_init(layout, width, height)
map = {} map = {}
setmetatable(map, {__index={layout=layout, shape=parallelogram}})
setmetatable(map, {__index={layout=layout,
shape="parallelogram",
width=width,
height=height}})
for s = 0, width do for s = 0, width do
for t = 0, height do for t = 0, height do
table.insert(map, hex_to_pixel(s, t, layout)) table.insert(map, hex_to_pixel(s, t, layout))
@ -135,8 +143,9 @@ end
-- returns triangular map. -- returns triangular map.
function map_triangular_init(layout, size) function map_triangular_init(layout, size)
map = {} map = {}
setmetatable(map, {__index={layout=layout, shape=triangular}})
setmetatable(map, {__index={layout=layout,
shape="triangular",
size=size}})
for s = 0, size do for s = 0, size do
for t = size - s, size do for t = size - s, size do
table.insert(map, hex_to_pixel(s, t, layout)) table.insert(map, hex_to_pixel(s, t, layout))
@ -148,8 +157,9 @@ end
-- returns hexagonal map. length of map is radius * 2 + 1 -- returns hexagonal map. length of map is radius * 2 + 1
function map_hexagonal_init(layout, radius) function map_hexagonal_init(layout, radius)
map = {} map = {}
setmetatable(map, {__index={layout=layout, shape=hexagonal}})
setmetatable(map, {__index={layout=layout,
shape="hexagonal",
radius=radius}})
for s = -radius, radius do for s = -radius, radius do
t1 = math.max(-radius, -s - radius) t1 = math.max(-radius, -s - radius)
t2 = math.min(radius, -s + radius) t2 = math.min(radius, -s + radius)
@ -164,8 +174,10 @@ end
-- returns rectangular map. -- returns rectangular map.
function map_rectangular_init(layout, width, height) function map_rectangular_init(layout, width, height)
map = {} map = {}
setmetatable(map, {__index={layout=layout, shape=rectangular}})
setmetatable(map, {__index={layout=layout,
shape="rectangular",
width=width,
height=height}})
for s = 0, width do for s = 0, width do
soffset = math.floor(s/2) soffset = math.floor(s/2)
@ -181,8 +193,30 @@ function map_store(map)
end end
-- retrieves single hex from map table, if it is present.
function map_retrieve(map)
-- retrieves single hex from map table. explodes if can't find it.
function map_retrieve(map, hex)
if map.shape == "rectangular" then
if map.layout.orientation == FLAT then
return {hex[1] + math.floor(hex[2]/2), hex[2]}
else
return {hex[1], hex[2] + math.floor(hex[1]/2)}
end
elseif map.shape == "hexagonal" then
if map.layout.orientation == FLAT then
else
end
elseif map.shape == "parallelogram" then
if map.layout.orientation == FLAT then
else
end
else
end
end end

5
main.lua

@ -50,7 +50,8 @@ local test_scene = am.group()
win.scene = am.group{test_scene, game_scene} win.scene = am.group{test_scene, game_scene}
test_scene:action(function() test_scene:action(function()
x, y = unpack(pixel_to_hex(win:mouse_position().x, win:mouse_position().y, layout))
hexpos = pixel_to_hex(win:mouse_position().x, win:mouse_position().y, layout)
x, y = unpack(map_retrieve(map, hexpos))
test_scene:remove_all("text") test_scene:remove_all("text")
test_scene:append(am.translate(vec2(unpack(hex_to_pixel(x, y, layout)))) ^ am.text(string.format("%d, %d", x, y)))
test_scene:append(am.translate(x, y) ^ am.text(string.format("%d, %d", hexpos[1], hexpos[2])))
end) end)
Loading…
Cancel
Save