Advertisement
BadMinotaur

Raytrace2D

Jan 21st, 2019
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /// Raytrace2D(tilemap_id, x0, x1, y0, y1)
  2. /// @function Raytrace2D
  3. /// @description Traces a line through grid squares, and returns a list of those squares.
  4. /// @param {real} tilemap_id
  5. /// @param {real} x0
  6. /// @param {real} x1
  7. /// @param {real} y0
  8. /// @param {real} y1
  9.  
  10. var tile_size = 32;
  11. var solid_ary = [];
  12. var tilemap = argument[0];
  13. var x0 = argument[1];
  14. var x1 = argument[2];
  15. var y0 = argument[3];
  16. var y1 = argument[4];
  17.  
  18. var dx = abs(x1 - x0);
  19. var dy = abs(y1 - y0);
  20.  
  21. var nx = floor(x0);
  22. var ny = floor(y0);
  23.  
  24. var n = 1;
  25. var x_inc, y_inc;
  26. var error;
  27.  
  28. if(x1 >= x0)
  29. {
  30.     x_inc = 1;
  31.     n += floor(x1) - nx;
  32.     error = (floor(x0) + 1 - x0) * dy;
  33. }
  34. else
  35. {
  36.     x_inc = -1;
  37.     n += nx - floor(x1);
  38.     error = (x0 - floor(x0)) * dy;
  39. }
  40.  
  41. if(y1 > y0)
  42. {
  43.     y_inc = 1;
  44.     n += floor(y1) - ny;
  45.     error -= (floor(y0) + 1 - y0) * dx;
  46. }
  47. else
  48. {
  49.     y_inc = -1;
  50.     n += ny - floor(y1);
  51.     error -= (y0 - floor(y0)) * dx;
  52. }
  53.  
  54. for(; n > 0; n--)
  55. {
  56.     var tile_result = tilemap_get_at_pixel(tilemap, nx, ny);
  57.    
  58.     if(tile_result != 0 && tile_result != 4 && tile_result != 5)
  59.     {
  60.         var trace_result = [nx, ny, tile_result];
  61.         return trace_result;
  62.     }
  63.    
  64.     if(error > 0)
  65.     {
  66.         ny += y_inc;
  67.         error -= dx;
  68.     }
  69.     else
  70.     {
  71.         nx += x_inc;
  72.         error += dy;
  73.     }
  74. }
  75.  
  76. return undefined;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement