Advertisement
Guest User

Untitled

a guest
Apr 13th, 2013
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.39 KB | None | 0 0
  1. package
  2. {
  3. import flash.display.Sprite;
  4. import flash.display.MovieClip;
  5. import flash.events.Event;
  6. import flash.events.MouseEvent;
  7. import flash.events.KeyboardEvent;
  8. import flash.ui.Keyboard;
  9. import flash.ui.Mouse;
  10.  
  11. public class Main extends Sprite
  12. {
  13. // Createing The Level
  14. // Reference To Tile Moveiclip
  15. private var tileVar:Tile;
  16. // Grid Width Can Be Set To Whatever Number Of Tiles Is In Each Line In The levelArray
  17. private var gridWidth:uint = 18;
  18. // The Level Array Holds Number Values To Repersent If A Tile Is A Empty Space, Wall, End Point, Etc
  19. private var levelArray:Array =
  20. [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  21. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  22. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  23. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  24. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  25. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  26. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  27. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  28. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  29. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  30. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  31. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  32. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  33. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  34. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  35. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  36. 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  37. 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];
  38. // Level Vector Is A Vector That Is Later Filled With All The Tile Objects That Make Up The Level
  39. private var levelVector:Vector.<Object > = new Vector.<Object > ;
  40. // Pathfinding
  41. // Open List Is An Array Of The Current Tiles Being Checked
  42. private var openListArray:Array = [];
  43. // Close List Is An Array Of Tiles That Have Been Checked
  44. private var closeListArray:Array = [];
  45. // Current Parent Is The Current Tile We Are Checking The Surroundings Of
  46. private var currentParent:Object;
  47. // Current Target Is Our Target Tile
  48. private var currentTarget:Object;
  49. // Starting Parent Doesn't Really Need To Exist But Is A Reference To The First Tile Being Checked At The Start Of Pathfinding
  50. private var startingParent:Object;
  51. // A Variable To Check If The Path Has Been Found
  52. private var currentTargetFound:Boolean;
  53. // A Variable That Checks If No Path Can Be Found
  54. private var noPathCanBeFound:Boolean;
  55. // The Final Array That Is Filled With The Shortest Path To A Point
  56. private var finalListArray:Array = [];
  57. // Enemy
  58. private var enemyVector:Vector.<Object > = new Vector.<Object > ;
  59. private var enemyVar:Enemy;
  60. //private var currentTileEnemyInVector:Vector.<Object > = new Vector.<Object > ;
  61. //private var currentTileEnemyIn:Object = null;
  62. // Keyboard
  63. // Used As A Pause Button
  64. private var spaceKeyDown:Boolean;
  65. public function Main()
  66. {
  67. // Remove Right Click Menu;
  68. stage.addEventListener(MouseEvent.RIGHT_CLICK, function(e:Event){});
  69. // Create The Level
  70. createLevel();
  71. // Create The Enemy
  72. createEnemy();
  73. /*createEnemy();
  74. createEnemy();
  75. createEnemy();
  76. createEnemy();
  77. createEnemy();*/
  78. // On Enter Frame Events
  79. addEventListener(Event.ENTER_FRAME,onFrame);
  80. //
  81. stage.addEventListener(KeyboardEvent.KEY_UP,keyIsUp);
  82. stage.addEventListener(KeyboardEvent.KEY_DOWN,keyIsDown);
  83. }
  84. // On Frame Events
  85. private function onFrame(e:Event):void
  86. {
  87. // Checks If There Is A Path To Move Along
  88. if (noPathCanBeFound == false)
  89. {
  90. // Checks If Enemy Has Finished Path And If Enemy Movement Should Be Paused - If Both False Then Enemy Move Along Its Path
  91. // eV = Enemy Vector
  92. for (var eV=0; eV<enemyVector.length; eV++)
  93. {
  94. if (enemyVector[eV].enemyPathArray.length != 0 && spaceKeyDown == false)
  95. {
  96. // Simple Movement To Get To Each Tile
  97. if (enemyVector[eV].y > enemyVector[eV].enemyPathArray[0].y)
  98. {
  99. enemyVector[eV].y -= enemyVector[eV].enemySpeed;
  100. }
  101. if (enemyVector[eV].y < enemyVector[eV].enemyPathArray[0].y)
  102. {
  103. enemyVector[eV].y += enemyVector[eV].enemySpeed;
  104. }
  105. if (enemyVector[eV].x > enemyVector[eV].enemyPathArray[0].x)
  106. {
  107. enemyVector[eV].x -= enemyVector[eV].enemySpeed;
  108. }
  109. if (enemyVector[eV].x < enemyVector[eV].enemyPathArray[0].x)
  110. {
  111. enemyVector[eV].x += enemyVector[eV].enemySpeed;
  112. }
  113. // If The Enemy Reaches The Center Of A Tile Remove It From The List Of Tiles It Needs To Move To
  114. //if(this._x <= _root._xmouse + 1 && this._x >= _root._xmouse - 1){
  115. // if(this._y <= _root._ymouse + 1 && this._y >= _root._ymouse - 1 ){
  116. if (enemyVector[eV].x <= enemyVector[eV].enemyPathArray[0].x + enemyVector[eV].enemySpeed && enemyVector[eV].x >= enemyVector[eV].enemyPathArray[0].x - enemyVector[eV].enemySpeed)
  117. {
  118. if (enemyVector[eV].y <= enemyVector[eV].enemyPathArray[0].y + enemyVector[eV].enemySpeed && enemyVector[eV].y >= enemyVector[eV].enemyPathArray[0].y - enemyVector[eV].enemySpeed)
  119. {
  120. if (enemyVector[eV].enemyPathArray.length == 1)
  121. {
  122. enemyVector[eV].x = enemyVector[eV].enemyPathArray[0].x;
  123. enemyVector[eV].y = enemyVector[eV].enemyPathArray[0].y;
  124. }
  125. enemyVector[eV].enemyPathArray.splice(0,1);
  126. }
  127. }
  128. }
  129. }
  130. }
  131. }
  132. // Create Enemy
  133. private function createEnemy():void
  134. {
  135. enemyVar = new Enemy();
  136. enemyVar.x = 40 + Math.round(Math.random() * 640);
  137. enemyVar.y = 40 + Math.round(Math.random() * 640);
  138. enemyVar.enemyPathArray = [];
  139. enemyVar.currentTileEnemyIn = null;
  140. enemyVar.enemySpeed = 1;
  141. addChild(enemyVar);
  142. enemyVector.push(enemyVar);
  143. }
  144. // Create Level;
  145. private function createLevel():void
  146. {
  147. var tilePlacementX:Number = 20;
  148. var tilePlacementY:Number = 20;
  149. var currentCollum:int = 1;
  150. var currentRow:int = 1;
  151. // cLT = Create Level Tiles
  152. for (var cLT=0; cLT<levelArray.length; cLT++)
  153. {
  154. tileVar = new Tile();
  155. tileVar.x = tilePlacementX;
  156. tileVar.y = tilePlacementY;
  157. // Purely Aesthetic
  158. tileVar.gotoAndStop(levelArray[cLT]+1);
  159. // If The Level Array Not A 1 Then The Tile Is Walkable;
  160. if (levelArray[cLT] != 1)
  161. {
  162. tileVar.walkable = true;
  163. }
  164. else
  165. {
  166. // If The Level Array Is A 1 Then Make A Non-Walkable Wall Tile
  167. if (levelArray[cLT] == 1)
  168. {
  169. tileVar.walkable = false;
  170. }
  171. }
  172. // This Is A Little Preset Thing I Did Where If In The Level Array At The Start I Put A 2 In That Would Be The End Point
  173. // Much Like In A TD That Could Be The Point The Enemies Want To Get To
  174. /*if (levelArray[cLT] == 2)
  175. {
  176. currentTarget = tileVar;
  177. }*/
  178. // These Vars Are Used In The Pathfinding Functions And Are Explined When They Come Up
  179. tileVar.positionInArray = cLT;
  180. tileVar.currentRow = currentRow;
  181. tileVar.currentCollum = currentCollum;
  182. tileVar.gScore = 0;
  183. tileVar.hScore = 0;
  184. tileVar.fScore = 0;
  185. tileVar.currentTileParent = null;
  186. tileVar.alreadyOnClosedList = false;
  187. // This Listener Let Us Add And Remove Walls
  188. tileVar.addEventListener(MouseEvent.CLICK,makeIntoWall);
  189. // This Listener Lets Us Make A End Point
  190. tileVar.addEventListener(MouseEvent.RIGHT_MOUSE_DOWN,makeIntoEndArea);
  191. // Add The Child To Stage
  192. addChild(tileVar);
  193. // Push This Object Into The Level Vector
  194. levelVector.push(tileVar);
  195. // Updates The X and Y Placemetn For The Next Tile;
  196. tilePlacementX += 40;
  197. currentRow++;
  198. if (tilePlacementX >= 720)
  199. {
  200. currentCollum++;
  201. currentRow = 1;
  202. tilePlacementX = 20;
  203. tilePlacementY += 40;
  204. }
  205. }
  206. setChildIndex(tutorialText,numChildren - 1);
  207. }
  208. // This Function Lets Us Add/Remove Walls
  209. private function makeIntoWall(e:MouseEvent):void
  210. {
  211. // If Tile Is Not A Wall Make It A Wall
  212. if (e.currentTarget.walkable == true)
  213. {
  214. e.currentTarget.gotoAndStop(2);
  215. e.currentTarget.walkable = false;
  216. }
  217. else
  218. {
  219. // If Tile Is A Wall Make It Not A Wall
  220. if (e.currentTarget.walkable == false)
  221. {
  222. e.currentTarget.gotoAndStop(0);
  223. e.currentTarget.walkable = true;
  224. }
  225. }
  226. // If You Have A End Point Then Update The Path If You Have No End Point This Prevent A Crash
  227. if (currentTarget != null)
  228. {
  229. // Finds The Paths Starting Point
  230. findStartingPoint();
  231. }
  232. }
  233. private function makeIntoEndArea(e:MouseEvent):void
  234. {
  235. // This Is Purely Aesthetic - Like All gotoAndStop It Only Adjusts The Appearence Of The Tiles This Loop Can Be Removed
  236. // rLVA = Reset Level Vector Appearence
  237. for (var rLVA=0; rLVA<levelVector.length; rLVA++)
  238. {
  239. if (levelVector[rLVA].currentFrame == 3 || levelVector[rLVA].currentFrame == 7)
  240. {
  241. levelVector[rLVA].gotoAndStop(1);
  242. }
  243. }
  244. // Make Current Tile Into An End Area
  245. e.currentTarget.gotoAndStop(3);
  246. e.currentTarget.walkable = true;
  247. // Sets The Selected Tile To The Current Target Of The Pathfinding
  248. currentTarget = e.currentTarget;
  249. // Finds The Paths Starting Point
  250. findStartingPoint();
  251.  
  252. }
  253. private function findStartingPoint():void
  254. {
  255. // fSP = Find Starting Point
  256. for (var fSP=0; fSP<levelVector.length; fSP++)
  257. {
  258. // lVHEV = Level Vector Hitting Enemy Vector
  259. for (var lVHEV=0; lVHEV<enemyVector.length; lVHEV++)
  260. {
  261. if (levelVector[fSP].hitTestPoint(enemyVector[lVHEV].x,enemyVector[lVHEV].y,true))
  262. {
  263. enemyVector[lVHEV].currentTileEnemyIn = levelVector[fSP];
  264. startingParent = levelVector[fSP];
  265. setPathfindingForCurrentParentTile(enemyVector[lVHEV].currentTileEnemyIn);
  266. findAPathForEnemy(enemyVector[lVHEV]);
  267. //break;
  268. }
  269. }
  270. }
  271. // Update Path
  272. //setPathfindingForCurrentParentTile(enemyVar.currentTileEnemyIn);
  273. //findAPathForEnemy(enemyVar);
  274. }
  275. private function findAPathForEnemy(currentEnemy:Object):void
  276. {
  277. // At The Start We Assume A Path Can Be Found
  278. noPathCanBeFound = false;
  279. // Reset The Open And Closed Lists
  280. openListArray = [];
  281. closeListArray = [];
  282. // Push The Tile The Enemy Is In Into The Open List
  283. openListArray.push(currentEnemy.currentTileEnemyIn);
  284. // Resets The Level Vectors Values For Pathfinding;
  285. // rLVPV = Reset Level Vector Pathfinding Values
  286. for (var rLVPV=0; rLVPV<levelVector.length; rLVPV++)
  287. {
  288. levelVector[rLVPV].gScore = 0;
  289. levelVector[rLVPV].hScore = 0;
  290. levelVector[rLVPV].fScore = 0;
  291. levelVector[rLVPV].currentTileParent = null;
  292. levelVector[rLVPV].alreadyOnClosedList = false;
  293. }
  294. // Reset The Fact That We Have Found The Square We Are Going To
  295. currentTargetFound = false;
  296. // Set The Current Parent Square To The Square The Enemy Is Currently In
  297. currentParent = currentEnemy.currentTileEnemyIn;
  298. // Loop Until We Find A Target
  299. while (currentTargetFound == false)
  300. {
  301. // If We Run Out Of Possible Tiles In Our Open List It Means The Target Can Not Be Reached (Is Surrounded By Impassable Tiles)
  302. if (openListArray.length == 0)
  303. {
  304. // We Break The Loop
  305. currentTargetFound = true;
  306. // And Set It So The onFrame Function Does Not Try To Move The Enemy To A Point That Can Not Be Reahced
  307. noPathCanBeFound = true;
  308. }
  309. // The Start Of Fun Pathfinding Functions
  310. setPathfindingForCurrentParentTile(currentParent);
  311. // Through The Above Function We Will Set currentTargetFound To True Unless It Is Impossible To Get To The Current Target
  312. if (currentTargetFound == true)
  313. {
  314. // Sets The Enemies Parth To The Final List Path We Create With The setPathfindingForCurrentParentTile Function
  315. currentEnemy.enemyPathArray = finalListArray;
  316. // Reverses This List Becuase It Starts At The End
  317. currentEnemy.enemyPathArray.reverse();
  318. // Remove The First Object In This List As We Are Already In That Square;
  319. currentEnemy.enemyPathArray.splice(0,1);
  320. }
  321. }
  322. }
  323. private function setPathfindingForCurrentParentTile(currentParentTile:Object):void
  324. {
  325. // Remove Current Parent From Open List
  326. // rCPFOL = Remove Current Parent From Open List
  327. for (var rCPFOL=0; rCPFOL<openListArray.length; rCPFOL++)
  328. {
  329. if (currentParent == openListArray[rCPFOL])
  330. {
  331. openListArray.splice(rCPFOL,1);
  332. break;
  333. }
  334. }
  335. // Add Current Parent To Close List - AKA The List Of Objects We've Checked
  336. closeListArray.push(currentParentTile);
  337. currentParentTile.alreadyOnClosedList = true;
  338. // NW Tile
  339. // Note If YOu Want Enemies To Not Be Able To Cut Through Walls At All
  340. // Check If Going NW Would Go Through A Wall - NOTE: IF YOU WANT TO ALLOW ENEMIES TO CUT THROUGH CORNERS REMOVE THIS IF STATEMENT
  341. // NOTE: If You Want Enemies To Be Able TO Move Diaginol Make This A Or
  342. if (levelVector[currentParentTile.positionInArray-(gridWidth)].walkable == true || levelVector[currentParentTile.positionInArray-(1)].walkable == true)
  343. {
  344. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray-(gridWidth+1)]);
  345. }
  346. // N Tile
  347. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray-(gridWidth)]);
  348. // Check If Going NE Would Go Through A Wall - NOTE: IF YOU WANT TO ALLOW ENEMIES TO CUT THROUGH CORNERS REMOVE THIS IF STATEMENT
  349. if (levelVector[currentParentTile.positionInArray-(gridWidth)].walkable == true || levelVector[currentParentTile.positionInArray+(1)].walkable == true)
  350. {
  351. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray-(gridWidth-1)]);
  352. }
  353. // W Tile
  354. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray-(1)]);
  355. // E Tile
  356. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray+(1)]);
  357. // SW Tile
  358. // Check If Going NW Would Go Through A Wall - NOTE: IF YOU WANT TO ALLOW ENEMIES TO CUT THROUGH CORNERS REMOVE THIS IF STATEMENT
  359. if (levelVector[currentParentTile.positionInArray+(gridWidth)].walkable == true || levelVector[currentParentTile.positionInArray-(1)].walkable == true)
  360. {
  361. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray+(gridWidth-1)]);
  362. }
  363. // S Tile
  364. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray+(gridWidth)]);
  365. // Check If Going SE Would Go Through A Wall - NOTE: IF YOU WANT TO ALLOW ENEMIES TO CUT THROUGH CORNERS REMOVE THIS IF STATEMENT
  366. if (levelVector[currentParentTile.positionInArray+(gridWidth)].walkable == true || levelVector[currentParentTile.positionInArray+(1)].walkable == true)
  367. {
  368. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray+(gridWidth+1)]);
  369. }
  370. // Find New Current Parent Tile
  371. getNewCurrentParentTile();
  372. }
  373. private function checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(currentChildToCheckIfOnOpenArray:Object):void
  374. {
  375. var currentTileChildGScoreToTest:int = currentChildToCheckIfOnOpenArray.gScore
  376. var comparisionOfCurrentChildGScoreOnCurrentParth:int
  377. // If The Target We Are Checking Is The Target Point We Want To Get To Then We Have Found Our Path
  378. if (currentChildToCheckIfOnOpenArray == currentTarget)
  379. {
  380. currentTargetFound = true;
  381. // Sets End Tile Parent To Current Parent
  382. currentTarget.currentParent = currentParent;
  383. // This Function Gives Us Our Path From The End To The Tile The Enemy Is In
  384. findWayBack();
  385. }
  386. // If We Have Not Found Our Target And This Tile Is Not Our Target Then...
  387. if (currentChildToCheckIfOnOpenArray != currentTarget && currentTargetFound == false)
  388. {
  389. // If It Is A Wall Or Already On The Closed List We Skip It
  390. if (currentChildToCheckIfOnOpenArray.walkable == true && currentChildToCheckIfOnOpenArray.alreadyOnClosedList == false)
  391. {
  392. // Check If This Child If Already On The Open List
  393. var thisChildIsNotAlreadyOnOpenList:Boolean = true;
  394. // aCPSTTOL = Add Current Parent Surrounding Tiles To Open List
  395. for (var aCPSTTOL=0; aCPSTTOL<openListArray.length; aCPSTTOL++)
  396. {
  397. if (openListArray[aCPSTTOL] == currentChildToCheckIfOnOpenArray)
  398. {
  399. // This Child Is On The Open List So We Do A Special Check To Find A New A Parent If A Better Movement Can Be Found
  400. // Check If Parent Is Up Down Left Or Right Of This Tile
  401. comparisionOfCurrentChildGScoreOnCurrentParth = currentParent.gScore
  402. if (levelVector[currentChildToCheckIfOnOpenArray.positionInArray-(gridWidth)] == currentChildToCheckIfOnOpenArray.currentParent || levelVector[currentChildToCheckIfOnOpenArray.positionInArray-(1)] == currentChildToCheckIfOnOpenArray.currentParent|| levelVector[currentChildToCheckIfOnOpenArray.positionInArray+(1)] == currentChildToCheckIfOnOpenArray.currentParent || levelVector[currentChildToCheckIfOnOpenArray.positionInArray+(gridWidth)] == currentChildToCheckIfOnOpenArray.currentParent)
  403. {
  404. // A Up Down Left Or Right Movement Cost 10
  405. comparisionOfCurrentChildGScoreOnCurrentParth += 10
  406. }
  407. // Check If Parent Is Diagonal To This Tile
  408. if (levelVector[currentChildToCheckIfOnOpenArray.positionInArray - (gridWidth - 1)] == currentChildToCheckIfOnOpenArray.currentParent || levelVector[currentChildToCheckIfOnOpenArray.positionInArray - (gridWidth + 1)] == currentChildToCheckIfOnOpenArray.currentParent || levelVector[currentChildToCheckIfOnOpenArray.positionInArray + (gridWidth - 1)] == currentChildToCheckIfOnOpenArray.currentParent || levelVector[currentChildToCheckIfOnOpenArray.positionInArray + (gridWidth + 1)] == currentChildToCheckIfOnOpenArray.currentParent)
  409. {
  410. // A Diagonal Movement Cost 14
  411. comparisionOfCurrentChildGScoreOnCurrentParth += 14
  412. }
  413. // If Going To That Child Would Make A Longer Path Then Reparent It
  414. if(comparisionOfCurrentChildGScoreOnCurrentParth < currentTileChildGScoreToTest)
  415. {
  416. currentChildToCheckIfOnOpenArray.currentParent = currentParent;
  417. addToATileGScore(currentChildToCheckIfOnOpenArray)
  418. }
  419. thisChildIsNotAlreadyOnOpenList = false;
  420. break;
  421. }
  422. }
  423. // If thisChildIsNotAlreadyOnOpenList Is Still True Then Add It To The Open List
  424. if (thisChildIsNotAlreadyOnOpenList == true)
  425. {
  426. // Add Current Child To Open Array
  427. openListArray.push(currentChildToCheckIfOnOpenArray);
  428. // Sets Child Of Current Parent, Parent Var To That Of The Current Parent;
  429. currentChildToCheckIfOnOpenArray.currentParent = currentParent;
  430. // Give This Tile An H Score
  431. // An H Score Is The Number Of Tiles This Tile Is From The End (Not Counting Walls) Times 10
  432. updateATileHScore(currentChildToCheckIfOnOpenArray);
  433. // Add To This Tiles G Score
  434. // A G Score Is How Far A Tile Is In The Path We Are Taking - If Getting To This Tile Is A Up, Down, Left, Or Right Movement
  435. // Then The G Score Is Equal To Its Parents G Score + 10, If Its A Diagonal Movement Then The G Score Is Equal To Its Parents G Score + 14 Beucase Moveing Diagonal Is Slightly Longer Path
  436. addToATileGScore(currentChildToCheckIfOnOpenArray);
  437. // Update The Tiles F Score
  438. // A F Score Is The Tiles H + The Tiles G Score
  439. // The Lower The F Score The Better The Path Is To TAke
  440. updateATileFScore(currentChildToCheckIfOnOpenArray);
  441. }
  442. }
  443. }
  444. }
  445. private function getNewCurrentParentTile():void
  446. {
  447. // If We Still Have Not Found Out Target
  448. if (currentTargetFound == false)
  449. {
  450. // Look For The Lowest F Value
  451. var currentLowestFValue:int = 10000;
  452. // fLFV = Find Lowest F Value
  453. for (var fLFV=0; fLFV<openListArray.length; fLFV++)
  454. {
  455. // If A Tiles F Value Is Lower Then The Current One Then Our Parent Becomes That Tile
  456. if (openListArray[fLFV].fScore < currentLowestFValue)
  457. {
  458. currentLowestFValue = openListArray[fLFV].fScore;
  459. currentParent = openListArray[fLFV];
  460. }
  461. }
  462. }
  463. }
  464. private function findWayBack():void
  465. {
  466. // We Have Found Our Current Target Now We Just Keep Adding The Parent Of Each Square Until We Get To Our Starting Square
  467. var currentFindWayBackParent:Object = currentTarget;
  468. // Each New Parent We Hop To Is Added To Our Final List Array
  469. finalListArray = [];
  470. while (currentFindWayBackParent != startingParent)
  471. {
  472. finalListArray.push(currentFindWayBackParent);
  473. currentFindWayBackParent.gotoAndStop(7);
  474. currentFindWayBackParent = currentFindWayBackParent.currentParent;
  475. }
  476. // When We Find Our Parent We Have The Shortest Path From The Current Target To Our Parent
  477. if (currentFindWayBackParent == startingParent)
  478. {
  479. finalListArray.push(startingParent);
  480. startingParent.gotoAndStop(7);
  481. }
  482. }
  483. private function addToATileGScore(currentTileGScoreToAddTo:Object):void
  484. {
  485. // Check If Parent Is Up Down Left Or Right Of This Tile
  486. if (levelVector[currentTileGScoreToAddTo.positionInArray-(gridWidth)] == currentTileGScoreToAddTo.currentParent || levelVector[currentTileGScoreToAddTo.positionInArray-(1)] == currentTileGScoreToAddTo.currentParent|| levelVector[currentTileGScoreToAddTo.positionInArray+(1)] == currentTileGScoreToAddTo.currentParent || levelVector[currentTileGScoreToAddTo.positionInArray+(gridWidth)] == currentTileGScoreToAddTo.currentParent)
  487. {
  488. // A Up Down Left Or Right Movement Cost 10
  489. currentTileGScoreToAddTo.gScore = currentTileGScoreToAddTo.currentParent.gScore + 10;
  490. }
  491. // Check If Parent Is Diagonal To This Tile
  492. if (levelVector[currentTileGScoreToAddTo.positionInArray - (gridWidth - 1)] == currentTileGScoreToAddTo.currentParent || levelVector[currentTileGScoreToAddTo.positionInArray - (gridWidth + 1)] == currentTileGScoreToAddTo.currentParent || levelVector[currentTileGScoreToAddTo.positionInArray + (gridWidth - 1)] == currentTileGScoreToAddTo.currentParent || levelVector[currentTileGScoreToAddTo.positionInArray + (gridWidth + 1)] == currentTileGScoreToAddTo.currentParent)
  493. {
  494. // A Diagonal Movement Cost 14
  495. currentTileGScoreToAddTo.gScore = currentTileGScoreToAddTo.currentParent.gScore + 14;
  496. }
  497. }
  498. private function updateATileHScore(currentTileHScoreToUpdate:Object):void
  499. {
  500. // Simple Math To Find The Combined Diffrence Between The Current Tiles Collum And Row Compated To The Target Tile Collum And Row
  501. var currentTargetCollum:int = currentTarget.currentCollum;
  502. var currentTargetRow:int = currentTarget.currentRow;
  503. var currentCollumDiffrence:int;
  504. var currentRowDiffrence:int;
  505. currentCollumDiffrence = currentTargetCollum - currentTileHScoreToUpdate.currentCollum;
  506. if (currentCollumDiffrence < 0)
  507. {
  508. currentCollumDiffrence *= -1;
  509. }
  510. currentRowDiffrence = currentTargetRow - currentTileHScoreToUpdate.currentRow;
  511. if (currentRowDiffrence < 0)
  512. {
  513. currentRowDiffrence *= -1;
  514. }
  515. currentTileHScoreToUpdate.hScore = 10 * (currentCollumDiffrence + currentRowDiffrence);
  516. }
  517. private function updateATileFScore(currentTileGScoreToUpdate:Object):void
  518. {
  519. // Adds The Tile G and H Score Together
  520. currentTileGScoreToUpdate.fScore = currentTileGScoreToUpdate.hScore + currentTileGScoreToUpdate.gScore;
  521. }
  522. // Keyboard Events
  523. private function keyIsUp(e:KeyboardEvent):void
  524. {
  525. if (e.keyCode == 32)
  526. {
  527. spaceKeyDown = false;
  528. }
  529. }
  530. private function keyIsDown(e:KeyboardEvent):void
  531. {
  532. if (e.keyCode == 32)
  533. {
  534. spaceKeyDown = true;
  535. }
  536. }
  537. }
  538. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement