Tile based water flow algorithm


SUBMITTED BY: tritondreyja

DATE: July 9, 2017, 6:08 p.m.

UPDATED: July 9, 2017, 6:12 p.m.

FORMAT: Java

SIZE: 1.7 kB

HITS: 237

  1. if (watertime >= 1) {
  2. boolean canflow = false;
  3. try {
  4. for (int x = blockX - 36; x < x1 + 36; x++) {
  5. if (x <= 0)
  6. continue;
  7. for (int y = y1 + 17; y > blockY - 17; y--) {
  8. if (y <= 0)
  9. continue;
  10. if (x >= worldW || y >= worldH)
  11. continue;
  12. if (waterFall(x, y) == true) {
  13. makeW(x, y);
  14. makeW(x + 1, y);
  15. makeW(x - 1, y);
  16. makeW(x, y + 1);
  17. }
  18. }
  19. }
  20. canflow = false;
  21. for (int x = x1 + 36; x > blockX - 36; x--) {
  22. if (x <= 0)
  23. continue;
  24. for (int y = y1 + 17; y > blockY - 17; y--) {
  25. if (y <= 0)
  26. continue;
  27. if (x >= worldW || y >= worldH)
  28. continue;
  29. if (block[x][y + 1] != null) {
  30. if (water[x][y + 1] == wMass || getState(x, y + 1) == 1)
  31. canflow = true;
  32. }
  33. if (canflow) {
  34. if (x <= 1 || y <= 1)
  35. continue;
  36. if (x >= worldW - 1 || y >= worldH - 1)
  37. continue;
  38. waterRight(x, y);
  39. }
  40. }
  41. }
  42. canflow = false;
  43. for (int x = blockX - 36; x < x1 + 36; x++) {
  44. if (x <= 0)
  45. continue;
  46. for (int y = y1 + 17; y > blockY - 17; y--) {
  47. if (y <= 0)
  48. continue;
  49. if (x >= worldW || y >= worldH)
  50. continue;
  51. if (water[x][y + 1] == wMass || getState(x, y + 1) == 1)
  52. canflow = true;
  53. if (canflow) {
  54. if (x < 0 || y < 0)
  55. continue;
  56. if (x > worldW || y > worldH)
  57. return;
  58. if (World.block[x][y] == null)
  59. continue;
  60. waterLeft(x, y);
  61. }
  62. // waterUp(x, y);
  63. }
  64. }
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. }
  68. watertime = 0;
  69. } else {
  70. watertime += delta;
  71. }

comments powered by Disqus