Guest User

grid back pack

a guest
Dec 1st, 2018
2,862
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.29 KB | None | 0 0
  1. extends TextureRect
  2.  
  3. var items = []
  4.  
  5. var grid = {}
  6. var cell_size = 32
  7. var grid_width = 0
  8. var grid_height = 0
  9.  
  10. func _ready():
  11. var s = get_grid_size(self)
  12. grid_width = s.x
  13. grid_height = s.y
  14.  
  15. for x in range(grid_width):
  16. grid[x] = {}
  17. for y in range(grid_height):
  18. grid[x][y] = false
  19.  
  20. func insert_item(item):
  21. var item_pos = item.rect_global_position + Vector2(cell_size / 2, cell_size / 2)
  22. var g_pos = pos_to_grid_coord(item_pos)
  23. var item_size = get_grid_size(item)
  24. if is_grid_space_available(g_pos.x, g_pos.y, item_size.x, item_size.y):
  25. set_grid_space(g_pos.x, g_pos.y, item_size.x, item_size.y, true)
  26. item.rect_global_position = rect_global_position + Vector2(g_pos.x, g_pos.y) * cell_size
  27. items.append(item)
  28. return true
  29. else:
  30. return false
  31.  
  32. func grab_item(pos):
  33. var item = get_item_under_pos(pos)
  34. if item == null:
  35. return null
  36.  
  37. var item_pos = item.rect_global_position + Vector2(cell_size / 2, cell_size / 2)
  38. var g_pos = pos_to_grid_coord(item_pos)
  39. var item_size = get_grid_size(item)
  40. set_grid_space(g_pos.x, g_pos.y, item_size.x, item_size.y, false)
  41.  
  42. items.remove(items.find(item))
  43. return item
  44.  
  45. func pos_to_grid_coord(pos):
  46. var local_pos = pos - rect_global_position
  47. var results = {}
  48. results.x = int(local_pos.x / cell_size)
  49. results.y = int(local_pos.y / cell_size)
  50. return results
  51.  
  52. func get_grid_size(item):
  53. var results = {}
  54. var s = item.rect_size
  55. results.x = clamp(int(s.x / cell_size), 1, 500)
  56. results.y = clamp(int(s.y / cell_size), 1, 500)
  57. return results
  58.  
  59. func is_grid_space_available(x, y, w ,h):
  60. if x < 0 or y < 0:
  61. return false
  62. if x + w > grid_width or y + h > grid_height:
  63. return false
  64. for i in range(x, x + w):
  65. for j in range(y, y + h):
  66. if grid[i][j]:
  67. return false
  68. return true
  69.  
  70. func set_grid_space(x, y, w, h, state):
  71. for i in range(x, x + w):
  72. for j in range(y, y + h):
  73. grid[i][j] = state
  74.  
  75. func get_item_under_pos(pos):
  76. for item in items:
  77. if item.get_global_rect().has_point(pos):
  78. return item
  79. return null
  80.  
  81. func insert_item_at_first_available_spot(item):
  82. for y in range(grid_height):
  83. for x in range(grid_width):
  84. if !grid[x][y]:
  85. item.rect_global_position = rect_global_position + Vector2(x, y) * cell_size
  86. if insert_item(item):
  87. return true
  88. return false
Add Comment
Please, Sign In to add comment