map.lua 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. --Must merge this with api.lua
  2. local Map = _Class("liko12.map")
  3. function Map:initialize(w,h)
  4. self.w, self.h = w or 24, h or 9
  5. --Initialize the map table
  6. self.m = {}
  7. for x=1, self.w do
  8. self.m[x] = {}
  9. for y=1, self.h do
  10. self.m[x][y] = 0
  11. end
  12. end
  13. end
  14. --If called with a function, it will be called on everycell with x,y,sprid args
  15. --The function can return an new sprid to set
  16. --If called with no args, it will return the map table.
  17. function Map:map(func)
  18. if func then
  19. for x=1, self.w do
  20. for y=1, self.h do
  21. --self.m[x][y] = func(x,y,self.m[x][y]) or self.m[x][y]
  22. func(x,y,self.m[x][y])
  23. end
  24. end
  25. end
  26. return self.m
  27. end
  28. function Map:cell(x,y,newID)
  29. if newID then
  30. self.m[x][y] = newID or 0
  31. return self
  32. else
  33. return self.m[x][y]
  34. end
  35. end
  36. function Map:cut(x,y,w,h)
  37. local x,y,w,h = x or 1, y or 1, w or self.w, h or self.h
  38. local nMap = Map(w,h)
  39. local m = nMap:map()
  40. for mx=1,w do
  41. for my=1,h do
  42. if self.m[mx+x-1] and self.m[mx+x-1][my+y-1] then
  43. m[mx][my] = self.m[mx+x-1][my+y-1]
  44. end
  45. end
  46. end
  47. return nMap
  48. end
  49. function Map:size() return self.w, self.h end
  50. function Map:width() return self.w end
  51. function Map:height() return self.h end
  52. function Map:draw(dx,dy,x,y,w,h,sx,sy)
  53. local dx,dy,x,y,w,h,sx,sy = dx or 1, dy or 1, x or 1, y or 1, w or self.w, h or self.h, sx or 1, sy or 1
  54. local cm = self:cut(x,y,w,h)
  55. cm:map(function(spx,spy,sprid)
  56. if sprid < 1 then return end
  57. api.Sprite(sprid,dx + spx*8*sx - 8*sx, dy + spy*8*sy - 8*sy, 0, sx, sy)
  58. end)
  59. return self
  60. end
  61. function Map:export(filename)
  62. local imgdata = api.ImageData(self.w,self.h)
  63. self:map(function(x,y,sprid)
  64. if sprid > 255 then
  65. imgdata.imageData:setPixel(x-1,y-1,255,sprid-255,0,0)
  66. else
  67. imgdata.imageData:setPixel(x-1,y-1,sprid,0,0,0)
  68. end
  69. end)
  70. return imgdata:export(filename)
  71. end
  72. function Map:import(imgdata)
  73. imgdata.imageData:mapPixel(function(x,y,r,g,b,a)
  74. self:cell(x+1,y+1,r+g)
  75. return r,g,b,a
  76. end)
  77. return self
  78. end
  79. return Map