PageRenderTime 53ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/demos/src/tests/TestNavigationMeshPathfinding.as

http://libdamago.googlecode.com/
ActionScript | 718 lines | 493 code | 172 blank | 53 comment | 28 complexity | 682866281bf413ab745b4ba773e4c3f5 MD5 | raw file
Possible License(s): Apache-2.0
  1. package tests
  2. {
  3. import com.threerings.display.GraphicsUtil;
  4. import com.threerings.flashbang.AppMode;
  5. import com.threerings.geom.Vector2;
  6. import com.threerings.text.TextFieldUtil;
  7. import com.threerings.ui.SimpleTextButton;
  8. import com.threerings.util.Set;
  9. import com.threerings.util.Sets;
  10. import com.threerings.util.Util;
  11. import flash.display.Sprite;
  12. import flash.events.MouseEvent;
  13. import flash.geom.Point;
  14. import flash.geom.Rectangle;
  15. import flash.text.TextField;
  16. import net.amago.pathfinding.navmesh.NavMesh;
  17. import net.amago.pathfinding.navmesh.NavMeshNode;
  18. import net.amago.pathfinding.navmesh.NavMeshPathFinder;
  19. import net.amago.pathfinding.navmesh.NavMeshPolygonExclusion;
  20. import net.amago.pathfinding.navmesh.NavmeshUtil;
  21. import net.amago.pathfinding.navmesh.PathToFollow;
  22. public class TestNavigationMeshPathfinding extends AppMode
  23. {
  24. protected var _navTestSprite :Sprite;
  25. protected var _currentNavTest :int = 0;
  26. protected var _text :TextField;
  27. protected var _nextNavMeshTestButton :SimpleTextButton;
  28. protected function nextNavTest (...ignored) :void
  29. {
  30. while(_navTestSprite.numChildren > 0) { _navTestSprite.removeChildAt(0); }
  31. _navTestSprite.graphics.clear();
  32. try
  33. {
  34. var tempFunction :Function = TESTS[_currentNavTest] as Function;//this["navTest" + _currentNavTest];
  35. var meshSprite :Sprite = new Sprite();
  36. _navTestSprite.addChild(meshSprite);
  37. tempFunction(meshSprite);
  38. TextFieldUtil.updateText(_text, " Test: " + (_currentNavTest + 1));
  39. }
  40. catch (err :ReferenceError)
  41. {
  42. _currentNavTest = 0;
  43. nextNavTest();
  44. }
  45. _currentNavTest++;
  46. if (_currentNavTest >= TESTS.length) {
  47. _currentNavTest = 0;
  48. }
  49. }
  50. protected static function drawNavMesh(meshSprite :Sprite, navmesh :NavMesh, path :PathToFollow, start :Vector2, target :Vector2) :void
  51. {
  52. //Draw everything
  53. drawNavigationMesh(meshSprite, navmesh, path.path);
  54. meshSprite.graphics.beginFill(0xff0033);
  55. meshSprite.graphics.drawCircle(start.x, start.y, 4);
  56. meshSprite.graphics.beginFill(0x009900);
  57. meshSprite.graphics.drawCircle(target.x, target.y, 4);
  58. NavmeshUtil.drawGrid(meshSprite.graphics, 100, 0xff9999);
  59. meshSprite.graphics.lineStyle(2, 0xcc00cc);
  60. var pathNodes :Array = path.path;
  61. for(var k :int = 0; k < pathNodes.length - 1; k++) {
  62. meshSprite.graphics.moveTo(pathNodes[k].x, pathNodes[k].y);
  63. meshSprite.graphics.lineTo(pathNodes[k + 1].x, pathNodes[k + 1].y);
  64. }
  65. }
  66. override protected function enter() :void
  67. {
  68. super.enter();
  69. modeSprite.graphics.clear();
  70. modeSprite.graphics.beginFill(0xffffff);
  71. modeSprite.graphics.drawRect(0, 0, 1600, 1600);
  72. modeSprite.graphics.endFill();
  73. _navTestSprite = new Sprite();
  74. _navTestSprite.x = 100;
  75. _navTestSprite.y = 100;
  76. _navTestSprite.scaleX = 0.7;
  77. _navTestSprite.scaleY = _navTestSprite.scaleX;
  78. modeSprite.addChild(_navTestSprite);
  79. _nextNavMeshTestButton = new SimpleTextButton("Next NavMesh Test");
  80. _nextNavMeshTestButton.addEventListener(MouseEvent.CLICK, nextNavTest);
  81. _nextNavMeshTestButton.x = 100;
  82. _nextNavMeshTestButton.y = 60;
  83. modeSprite.addChild(_nextNavMeshTestButton);
  84. _text = TextFieldUtil.createField("Test " + _currentNavTest, {x:250, y:_nextNavMeshTestButton.y, scaleX:2, scaleY:2});
  85. modeSprite.addChild(_text);
  86. nextNavTest();
  87. }
  88. public static function drawNavigationMesh(sprite :Sprite, mesh :NavMesh, path :Array = null) :void
  89. {
  90. var drawnNodePairs :Set = Sets.newSetOf(Object);
  91. var k :int;
  92. //Draw bounds
  93. // if(mesh.getBounds() != null) {
  94. // var rect :Rectangle = mesh.getBounds();
  95. // sprite.graphics.lineStyle(3, 0xff3333);
  96. // sprite.graphics.drawRect(rect.x, rect.y, rect.width, rect.height);
  97. //
  98. // sprite.graphics.lineStyle(1, 0xff3333);
  99. // sprite.graphics.drawRect(0, 0, BOARD_SIZE.x, BOARD_SIZE.y);
  100. // }
  101. for each (var poly :NavMeshPolygonExclusion in mesh._polygonsAll) {
  102. drawPolygon(poly, sprite);
  103. }
  104. for each (var node :NavMeshNode in mesh.nodes) {
  105. drawNode(node, sprite);
  106. }
  107. sprite.graphics.lineStyle(2, 0xffcccc);
  108. if(path != null) {
  109. for(k = 0; k < path.length - 1; k++) {
  110. sprite.graphics.moveTo(path[k].x, path[k].y);
  111. sprite.graphics.lineTo(path[k + 1].x, path[k + 1].y);
  112. }
  113. }
  114. //Draw path if given
  115. if(path != null && path.length > 1) {
  116. var start :Vector2 = path[0];
  117. var target :Vector2 = path[path.length - 1];
  118. sprite.graphics.moveTo(start.x, start.y);
  119. sprite.graphics.beginFill(0xff0033);
  120. sprite.graphics.drawCircle(start.x, start.y, 4);
  121. sprite.graphics.beginFill(0x009900);
  122. sprite.graphics.drawCircle(target.x, target.y, 4);
  123. NavmeshUtil.drawGrid(sprite.graphics, 100, 0xff9999);
  124. sprite.graphics.lineStyle(2, 0xcc00cc);
  125. for(k = 0; k < path.length - 1; k++) {
  126. sprite.graphics.moveTo(path[k].x, path[k].y);
  127. sprite.graphics.lineTo(path[k + 1].x, path[k + 1].y);
  128. }
  129. }
  130. function drawPolygon(poly :NavMeshPolygonExclusion, sprite :Sprite, buffer :int = 0) :void
  131. {
  132. if(buffer != 0) {
  133. poly.pad(buffer);
  134. }
  135. sprite.graphics.lineStyle(3, 0);
  136. for(var i :int = 0; i < poly.vertices.length - 1; i++) {
  137. var vertex1 :Vector2 = poly.vertices[ i ] as Vector2;
  138. var vertex2 :Vector2 = poly.vertices[ i + 1 ] as Vector2;
  139. if(buffer == 0) {
  140. sprite.graphics.moveTo(vertex1.x, vertex1.y);
  141. sprite.graphics.lineTo(vertex2.x, vertex2.y);
  142. }
  143. else {
  144. GraphicsUtil.dashTo(sprite.graphics, vertex1.x, vertex1.y, vertex2.x, vertex2.y);
  145. }
  146. sprite.graphics.drawCircle(vertex1.x, vertex1.y, 3);
  147. }
  148. var vertexFirst :Vector2 = poly.vertices[ 0 ] as Vector2;
  149. var vertexLast :Vector2 = poly.vertices[ poly.vertices.length - 1 ] as Vector2;
  150. if(buffer == 0) {
  151. sprite.graphics.moveTo(vertexLast.x, vertexLast.y);
  152. sprite.graphics.lineTo(vertexFirst.x, vertexFirst.y);
  153. }
  154. else {
  155. GraphicsUtil.dashTo(sprite.graphics, vertexLast.x, vertexLast.y, vertexFirst.x, vertexFirst.y);
  156. }
  157. sprite.graphics.drawCircle(vertexLast.x, vertexLast.y, 3);
  158. sprite.graphics.endFill();
  159. if(buffer != 0) {
  160. poly.pad(-buffer);
  161. }
  162. }
  163. function drawNode(node :NavMeshNode, sprite :Sprite) :void
  164. {
  165. sprite.graphics.lineStyle(1, 0x00cc33, 1);
  166. for each(var neighbour :NavMeshNode in node.getNeighbors()) {
  167. var nodePairKey :int = NavmeshUtil.hashForIdPair(node.hashCode(), neighbour.hashCode());
  168. if(!drawnNodePairs.contains(nodePairKey)) {
  169. GraphicsUtil.dashTo(sprite.graphics, node.vector.x, node.vector.y, neighbour.vector.x, neighbour.vector.y);
  170. var distanceLabel:TextField= new TextField();
  171. if(!mesh._distances.containsKey(NavmeshUtil.hashForIdPair(node._id, neighbour._id))) {
  172. distanceLabel.text = " X";
  173. }
  174. else {
  175. distanceLabel.text = "" + int(mesh._distances.get(NavmeshUtil.hashForIdPair(node._id, neighbour._id)));
  176. }
  177. distanceLabel.selectable = false;
  178. var labelPos :Vector2 = Vector2.interpolate(node, neighbour, 0.5);
  179. distanceLabel.x = labelPos.x;
  180. distanceLabel.y = labelPos.y;
  181. sprite.addChild(distanceLabel);
  182. drawnNodePairs.add(nodePairKey);
  183. }
  184. }
  185. sprite.graphics.drawCircle(node.x, node.y, 3);
  186. var label:TextField= new TextField();
  187. label.text = " " + node.getNodeId();
  188. label.selectable = false;
  189. label.x = node.vector.x;
  190. label.y = node.vector.y;
  191. sprite.addChild(label);
  192. }
  193. }
  194. protected function navTest12 (meshSprite :Sprite) :void
  195. {
  196. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  197. var target :Vector2 = new Vector2(110, 300);
  198. var start :Vector2 = new Vector2(195.95343588531367, 244.8525571403164);
  199. var buffer :int = 168;
  200. var terrain :Array = new Array();
  201. terrain.push(NavMeshPolygonExclusion.fromRect(350, 420, 100, 350));
  202. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  203. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  204. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  205. }
  206. protected function navTest5 (meshSprite :Sprite) :void
  207. {
  208. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  209. var target :Vector2 = new Vector2(40, 40);
  210. var start :Vector2 = new Vector2(320, 120);
  211. var buffer :int = 200;
  212. var terrain :Array = scenario(4);
  213. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  214. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  215. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  216. }
  217. protected function navTest6 (meshSprite :Sprite) :void
  218. {
  219. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  220. var target :Vector2 = new Vector2(40, 40);
  221. var start :Vector2 = new Vector2(40, 240);
  222. var buffer :int = 30;
  223. var terrain :Array = new Array();
  224. terrain.push(NavMeshPolygonExclusion.fromRect(-10, 200, 600, 20));
  225. terrain.push(NavMeshPolygonExclusion.fromRect(390, 380, 80, 10));
  226. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  227. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  228. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  229. }
  230. protected function navTest7 (meshSprite :Sprite) :void
  231. {
  232. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  233. var target :Vector2 = new Vector2(50, 40);
  234. var start :Vector2 = new Vector2(60, 240);
  235. var buffer :int = 100;
  236. var terrain :Array = scenario(4);
  237. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  238. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  239. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  240. }
  241. protected function navTest16 (meshSprite :Sprite) :void
  242. {
  243. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  244. var target :Vector2 = new Vector2(40, 40);
  245. var start :Vector2 = new Vector2(40, 240);
  246. var buffer :int = 100;
  247. var terrain :Array = new Array();
  248. terrain.push(NavMeshPolygonExclusion.fromRect(-10, 200, 600, 20));
  249. terrain.push(NavMeshPolygonExclusion.fromRect(400, 385, 80, 10));
  250. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  251. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  252. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  253. }
  254. protected function navTest15 (meshSprite :Sprite) :void
  255. {
  256. var size :Vector2 = new Vector2(BOARD_SIZE.x, BOARD_SIZE.y);
  257. BOARD_SIZE.x = 400;
  258. BOARD_SIZE.y = 400;
  259. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  260. var target :Vector2 = new Vector2(370, 40);
  261. var start :Vector2 = new Vector2(40, 370);
  262. var buffer :int = 100;
  263. var terrain :Array = new Array();
  264. // terrain.push(NavMeshPolygon.fromRect(400, 200, 500, 20));
  265. terrain.push(NavMeshPolygonExclusion.fromRect(0, 300, 500, 20));
  266. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  267. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  268. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  269. BOARD_SIZE.x = size.x;
  270. BOARD_SIZE.y = size.y;
  271. }
  272. protected function navTest8 (meshSprite :Sprite) :void
  273. {
  274. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  275. var target :Vector2 = new Vector2(600, 500);
  276. var start :Vector2 = new Vector2(600, 250);
  277. var buffer :int = 100;
  278. var terrain :Array = new Array();
  279. terrain.push(NavMeshPolygonExclusion.fromRect(850, 350, 800, 50));
  280. terrain.push(NavMeshPolygonExclusion.fromRect(500, 350, 40, 350));
  281. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  282. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  283. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  284. }
  285. protected function navTest14 (meshSprite :Sprite) :void
  286. {
  287. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  288. // var target :Vector2 = new Vector2(300, 100);
  289. var target :Vector2 = new Vector2(450, 250);
  290. var start :Vector2 = new Vector2(420, 700);
  291. var buffer :int = 40;
  292. var terrain :Array = new Array();
  293. terrain.push(NavMeshPolygonExclusion.fromRect(300, 450, 300, 60));
  294. terrain.push(NavMeshPolygonExclusion.fromRect(300, 250, 100, 30));
  295. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  296. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  297. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  298. }
  299. protected function navTest1(meshSprite :Sprite) :void
  300. {
  301. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  302. var target :Vector2 = new Vector2(310, 120);
  303. var start :Vector2 = new Vector2(400, 600);
  304. var buffer :int = 201;
  305. var terrain :Array = new Array();
  306. // terrain.push(NavMeshPolygon.fromRect(200, BOARD_SIZE.y - 100, 200, 60));
  307. // terrain.push(NavMeshPolygon.fromRect(200, BOARD_SIZE.x - 200, BOARD_SIZE.y - 100, 200, 60));
  308. // terrain.push(NavMeshPolygon.fromRect(200, BOARD_SIZE.x - 200, 100, 200, 60));
  309. // terrain.push(NavMeshPolygon.fromRect(200, 200, 100, 200, 60));
  310. terrain.push(new NavMeshPolygonExclusion([
  311. // new Vector2(200, 200),
  312. // new Vector2(400, 200),
  313. // new Vector2(400, 400),
  314. // new Vector2(200, 400),
  315. new Vector2(200, 200),
  316. new Vector2(400, 200),
  317. new Vector2(500, 300),
  318. new Vector2(400, 400),
  319. new Vector2(300, 400),
  320. ]).translateLocal(200, 200));
  321. var isOverlapping :Boolean = true;
  322. // do {
  323. // //Check for overlapping. If we find it, change the terrain, and break.
  324. //
  325. // isOverlapping = false;
  326. //
  327. // bothLoops: for each (var p1 :NavMeshPolygon in terrain) {
  328. // for each (var p2 :NavMeshPolygon in terrain) {
  329. // if (p1 == p2) {
  330. // continue;
  331. // }
  332. // if (Geometry.isPolygonsIntersecting(p1.vertices, p1.vertices)) {
  333. // ArrayUtil.removeAll(terrain, p1);
  334. // ArrayUtil.removeAll(terrain, p2);
  335. // trace("Creating union of polygons");
  336. // var union :Array = Geometry.unionPolygons(p1.vertices, p2.vertices);
  337. // trace("union=" + union);
  338. // var navpoly :NavMeshPolygon =
  339. // new NavMeshPolygon(union);
  340. //
  341. // trace("Removing");
  342. // trace(p1.toStringLong());
  343. // trace(p2.toStringLong());
  344. // trace("Adding");
  345. // trace(navpoly.toStringLong());
  346. // terrain.push(navpoly);
  347. // isOverlapping = true;
  348. // break bothLoops;
  349. // }
  350. // }
  351. // }
  352. // } while (isOverlapping)
  353. // trace(terrain);
  354. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  355. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  356. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  357. }
  358. protected function navTest9 (meshSprite :Sprite) :void
  359. {
  360. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  361. var target :Vector2 = new Vector2(100, 10);
  362. var start :Vector2 = new Vector2(280, 750);
  363. var buffer :int = 75;
  364. var terrain :Array = new Array();
  365. var width :int = 300;
  366. terrain.push(NavMeshPolygonExclusion.fromRect(BOARD_SIZE.x - 200, BOARD_SIZE.y - 100, width, 60));
  367. terrain.push(NavMeshPolygonExclusion.fromRect(200, BOARD_SIZE.y - 100, width, 60));
  368. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  369. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  370. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  371. }
  372. protected function navTest10 (meshSprite :Sprite) :void
  373. {
  374. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  375. var target :Vector2 = new Vector2(40, 40);
  376. var start :Vector2 = new Vector2(40, 350);
  377. var buffer :int = 200;
  378. var terrain :Array = new Array();
  379. var riverMouthWidth :Number = 200;
  380. var riverHalfLength :Number = (BOARD_SIZE.x / 2) - (riverMouthWidth / 2);
  381. terrain.push(NavMeshPolygonExclusion.fromRect(riverHalfLength/2, BOARD_SIZE.y/3, riverHalfLength, 50));
  382. terrain.push(NavMeshPolygonExclusion.fromRect(BOARD_SIZE.x - riverHalfLength / 2, BOARD_SIZE.y/3, riverHalfLength, 50));
  383. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  384. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  385. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  386. }
  387. protected function navTest4 (meshSprite :Sprite) :void
  388. {
  389. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  390. var target :Vector2 = new Vector2(40, 40);
  391. var start :Vector2 = new Vector2(340, 460);
  392. var buffer :int = 500;
  393. var terrain :Array = new Array();
  394. terrain.push(NavMeshPolygonExclusion.fromRect(300, 300, 300, 300));
  395. terrain.push(NavMeshPolygonExclusion.fromRect(300, 300, 100, 100));
  396. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  397. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  398. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  399. }
  400. protected function navTest13 (meshSprite :Sprite) :void
  401. {
  402. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  403. var target :Vector2 = new Vector2(40, 40);
  404. var start :Vector2 = new Vector2(340, 460);
  405. var buffer :int = 500;
  406. var terrain :Array = new Array();
  407. terrain.push(NavMeshPolygonExclusion.fromRect(300, 300, 300, 300));
  408. terrain.push(NavMeshPolygonExclusion.fromRect(500, 500, 100, 100));
  409. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  410. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  411. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  412. }
  413. protected function navTest3 (meshSprite :Sprite) :void
  414. {
  415. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  416. var target :Vector2 = new Vector2(40, 170);
  417. var start :Vector2 = new Vector2(40, 750);
  418. var buffer :int = 50;
  419. var terrain :Array = scenario(5);
  420. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  421. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  422. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  423. }
  424. protected function navTest2 (meshSprite :Sprite) :void
  425. {
  426. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  427. var target :Vector2 = new Vector2(40, 180);
  428. var start :Vector2 = new Vector2(40, 750);
  429. var buffer :int = 50;
  430. var terrain :Array = new Array();
  431. terrain.push(NavMeshPolygonExclusion.fromRect(-10, 200, 500, 20));
  432. terrain.push(NavMeshPolygonExclusion.fromRect(600, 400, 600, 20));
  433. terrain.push(NavMeshPolygonExclusion.fromRect(-10, 600, 600, 20));
  434. terrain.push(NavMeshPolygonExclusion.fromRect(800, 800, 1000, 20));
  435. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  436. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  437. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  438. }
  439. protected function navTest11 (meshSprite :Sprite) :void
  440. {
  441. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  442. var target :Vector2 = new Vector2(130, 180);
  443. var start :Vector2 = new Vector2(130, 750);
  444. var buffer :int = 350;
  445. var terrain :Array = new Array();
  446. terrain.push(NavMeshPolygonExclusion.fromRect(-10, 200, 600, 20));
  447. terrain.push(NavMeshPolygonExclusion.fromRect(800, 400, 1000, 20));
  448. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  449. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  450. drawNavMesh(meshSprite, pathfinder.navMesh, path, start, target);
  451. }
  452. protected function navTest17 (meshSprite :Sprite) :void
  453. {
  454. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  455. var target :Vector2 = new Vector2(110, 300);
  456. var start :Vector2 = new Vector2(222.901133137304, 221.9154921433647);
  457. var buffer :int = 168;
  458. var terrain :Array = new Array();
  459. terrain.push(NavMeshPolygonExclusion.fromRect(350, 420, 100, 350));
  460. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  461. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  462. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  463. }
  464. protected function navTest18 (meshSprite :Sprite) :void
  465. {
  466. var pathfinder :NavMeshPathFinder = new NavMeshPathFinder(BOARD_SIZE.x, BOARD_SIZE.y);
  467. var target :Vector2 = new Vector2(110, 300);
  468. var start :Vector2 = new Vector2(343.1099633926767, 146.57854798993506);
  469. var buffer :int = 168;
  470. var terrain :Array = new Array();
  471. terrain.push(NavMeshPolygonExclusion.fromRect(350, 420, 100, 350));
  472. terrain.forEach(Util.adapt(pathfinder.addNavMeshPolygon));
  473. var path :PathToFollow = pathfinder.getPath(start, target, buffer);
  474. drawNavMesh(meshSprite, pathfinder.navMesh, path, start , target);
  475. }
  476. protected static function scenario (scenarioCode :int) :Array
  477. {
  478. if( scenarioCode >= 1 && scenarioCode <= TERRAIN_SCENARIOS) {
  479. return TestNavigationMeshPathfinding["scenario" + scenarioCode]();
  480. }
  481. return [];
  482. }
  483. protected static function scenario1 () :Array//Bridge over river
  484. {
  485. var terrain :Array = new Array();
  486. var riverMouthWidth :Number = 150;
  487. var riverHalfLength :Number = (BOARD_SIZE.x / 2) - (riverMouthWidth / 2);
  488. terrain.push(NavMeshPolygonExclusion.fromRect(riverHalfLength/2, BOARD_SIZE.y/2, riverHalfLength, 50));
  489. terrain.push(NavMeshPolygonExclusion.fromRect(BOARD_SIZE.x - riverHalfLength / 2, BOARD_SIZE.y/2, riverHalfLength, 50));
  490. return terrain;
  491. }
  492. protected static function scenario2() :Array
  493. {
  494. var terrain :Array = new Array();
  495. terrain.push(NavMeshPolygonExclusion.fromRect(BOARD_SIZE.x / 2, BOARD_SIZE.y / 2, 250, 150));
  496. return terrain;
  497. }
  498. protected static function scenario3 () :Array//Castle
  499. {
  500. var terrain :Array = new Array();
  501. var riverMouthWidth :Number = 200;
  502. var riverHalfLength :Number = (BOARD_SIZE.x / 2) - (riverMouthWidth / 2);
  503. terrain.push(NavMeshPolygonExclusion.fromRect(riverHalfLength/2, BOARD_SIZE.y/3, riverHalfLength, 50));
  504. terrain.push(NavMeshPolygonExclusion.fromRect(BOARD_SIZE.x - riverHalfLength / 2, BOARD_SIZE.y/3, riverHalfLength, 50));
  505. return terrain;
  506. }
  507. protected static function scenario4 () :Array
  508. {
  509. var terrain :Array = new Array();
  510. terrain.push(NavMeshPolygonExclusion.fromRect(-10, 200, 600, 20));
  511. terrain.push(NavMeshPolygonExclusion.fromRect(390, 380, 80, 10));
  512. return terrain;
  513. }
  514. protected static function scenario5 () :Array//Maze
  515. {
  516. var terrain :Array = new Array();
  517. terrain.push(NavMeshPolygonExclusion.fromRect(-10, 200, 600, 20));
  518. terrain.push(NavMeshPolygonExclusion.fromRect(800, 400, 1000, 20));
  519. terrain.push(NavMeshPolygonExclusion.fromRect(-10, 600, 600, 20));
  520. terrain.push(NavMeshPolygonExclusion.fromRect(800, 800, 1000, 20));
  521. return terrain;
  522. }
  523. protected var TESTS :Array = [
  524. navTest1,
  525. navTest2,
  526. navTest3,
  527. navTest4,
  528. navTest5,
  529. navTest6,
  530. navTest7,
  531. navTest8,
  532. navTest9,
  533. navTest10,
  534. navTest11,
  535. navTest12,
  536. navTest13,
  537. navTest14,
  538. navTest15,
  539. navTest16,
  540. navTest17,
  541. navTest18,
  542. ];
  543. protected static const BOARD_SIZE :Point = new Point(1000, 1000);
  544. public static const TERRAIN_SCENARIOS :int = 5;
  545. }
  546. }