Help: Isometric map drawing incorrectly

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Before you make a thread asking for help, read this.
Post Reply
Ostego160
Prole
Posts: 14
Joined: Tue Oct 17, 2017 7:18 pm

Help: Isometric map drawing incorrectly

Post by Ostego160 »

Greetings!

I am making an isometric grid composed of nodes(intersections) and tiles. I want the tiles to update when the nodes are adjusted. There are no errors however, one of the isometric tile coordinates is wrong (I believe its the 4th coordinate) and its causing the tiles to be drawn wrong.

Here is the main.lua in its entirety: The .love and pic are attached as well to demonstrate my issue.

Code: Select all

Spectra =   require('spectra')

local lg = love.graphics
local push = table.insert
local width, height = lg.getDimensions()
-------------------------------
-- Helpers
local function dist(x1,y1, x2,y2) return ((x2-x1)^2+(y2-y1)^2)^0.5 end

local function get2D(index, width)
   local i = index - 1
   x = i%width
   y = (i - x)/width
   return x + 1, y + 1
end

local function get1D(x,y, width)
   return x + (y - 1)*width
end

local function createGrid(tw,th, w,h, cx,cy)
   local nodes,tiles = {},{}
   for col=1,w+1 do
      for row=1,h+1 do
         local index = get1D(col,row,w)
         local _x,_y = (col-row)*tw/2+cx, (col+row)*th/2+cy
         nodes[index] = {x=_x, y=_y}
         if (col<=w and row<=h) then
            tiles[index] = lg.newMesh({   {_x,_y},
                                          {_x+tw/2,_y+th/2},
                                          {_x,_y+th},
                                          {_x-tw/2,_y+th/2}
                                       })
         end
      end
   end
   return nodes, tiles
end

function love.load()
   spectra = Spectra()

   range = 512

   gridWidth, gridHeight = 32,32
   nodes,tiles = createGrid(64,32, gridWidth, gridHeight, lg.getWidth()/2,0)
   --Create nodes and tiles 1D arrays for 2D grid
end

function love.update(dt)
   for k,mesh in ipairs(tiles) do
      local tx,ty = get2D(k, gridWidth)
      local x,y = {},{}
      x[1],y[1] = nodes[k].x, nodes[k].y
      x[2],y[2] = nodes[get1D(tx+1,ty, gridWidth)].x,    nodes[get1D(tx+1,ty, gridWidth)].y
      x[3],y[3] = nodes[get1D(tx+1,ty+1, gridWidth)].x,  nodes[get1D(tx+1,ty+1, gridWidth)].y
      x[4],y[4] = nodes[get1D(tx,ty+1, gridWidth)].x,    nodes[get1D(tx,ty+1, gridWidth)].y
      --Get the four node coordinates for the iso tile

      for i=1,mesh:getVertexCount() do
         mesh:setVertexAttribute(i, 1, x[i],y[i])
         --Update iso tile coordinates

         local mx,my = love.mouse.getPosition()
         local distance = dist(x[i],y[i],mx,my)
         mesh:setVertexAttribute(i, 3, spectra:gradient(range,distance, {'white','blue','royalblue','midnight'}))
         --Update colorAttributes for mesh
      end
   end
end

function love.draw()
   for _,mesh in ipairs(tiles) do
      lg.draw(mesh)
   end
end
Can anyone help? :cry:
Attachments
sample.love
Functional .love with draw error
(3.97 KiB) Downloaded 120 times
Error image
Error image
Capture.PNG (200.25 KiB) Viewed 1677 times
Post Reply

Who is online

Users browsing this forum: Ahrefs [Bot], Amazon [Bot], Google [Bot] and 4 guests