Advertisement
Guest User

Untitled

a guest
Apr 13th, 2013
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.50 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. resetVectorAppearence()
  231. findStartingPoint();
  232. }
  233. }
  234. private function makeIntoEndArea(e:MouseEvent):void
  235. {
  236. // This Is Purely Aesthetic - Like All gotoAndStop It Only Adjusts The Appearence Of The Tiles This Loop Can Be Removed
  237. resetVectorAppearence()
  238. // Make Current Tile Into An End Area
  239. e.currentTarget.gotoAndStop(3);
  240. e.currentTarget.walkable = true;
  241. // Sets The Selected Tile To The Current Target Of The Pathfinding
  242. currentTarget = e.currentTarget;
  243. // Finds The Paths Starting Point
  244. findStartingPoint();
  245.  
  246. }
  247. private function resetVectorAppearence():void
  248. {
  249. // rLVA = Reset Level Vector Appearence
  250. for (var rLVA=0; rLVA<levelVector.length; rLVA++)
  251. {
  252. if (levelVector[rLVA].currentFrame == 3 || levelVector[rLVA].currentFrame == 7)
  253. {
  254. levelVector[rLVA].gotoAndStop(1);
  255. }
  256. }
  257. }
  258. private function findStartingPoint():void
  259. {
  260. // fSP = Find Starting Point
  261. for (var fSP=0; fSP<levelVector.length; fSP++)
  262. {
  263. // lVHEV = Level Vector Hitting Enemy Vector
  264. for (var lVHEV=0; lVHEV<enemyVector.length; lVHEV++)
  265. {
  266. if (levelVector[fSP].hitTestPoint(enemyVector[lVHEV].x,enemyVector[lVHEV].y,true))
  267. {
  268. enemyVector[lVHEV].currentTileEnemyIn = levelVector[fSP];
  269. startingParent = levelVector[fSP];
  270. setPathfindingForCurrentParentTile(enemyVector[lVHEV].currentTileEnemyIn);
  271. findAPathForEnemy(enemyVector[lVHEV]);
  272. //break;
  273. }
  274. }
  275. }
  276. // Update Path
  277. //setPathfindingForCurrentParentTile(enemyVar.currentTileEnemyIn);
  278. //findAPathForEnemy(enemyVar);
  279. }
  280. private function findAPathForEnemy(currentEnemy:Object):void
  281. {
  282. // At The Start We Assume A Path Can Be Found
  283. noPathCanBeFound = false;
  284. // Reset The Open And Closed Lists
  285. openListArray = [];
  286. closeListArray = [];
  287. // Push The Tile The Enemy Is In Into The Open List
  288. openListArray.push(currentEnemy.currentTileEnemyIn);
  289. // Resets The Level Vectors Values For Pathfinding;
  290. // rLVPV = Reset Level Vector Pathfinding Values
  291. for (var rLVPV=0; rLVPV<levelVector.length; rLVPV++)
  292. {
  293. levelVector[rLVPV].gScore = 0;
  294. levelVector[rLVPV].hScore = 0;
  295. levelVector[rLVPV].fScore = 0;
  296. levelVector[rLVPV].currentTileParent = null;
  297. levelVector[rLVPV].alreadyOnClosedList = false;
  298. }
  299. // Reset The Fact That We Have Found The Square We Are Going To
  300. currentTargetFound = false;
  301. // Set The Current Parent Square To The Square The Enemy Is Currently In
  302. currentParent = currentEnemy.currentTileEnemyIn;
  303. // Loop Until We Find A Target
  304. while (currentTargetFound == false)
  305. {
  306. // If We Run Out Of Possible Tiles In Our Open List It Means The Target Can Not Be Reached (Is Surrounded By Impassable Tiles)
  307. if (openListArray.length == 0)
  308. {
  309. // We Break The Loop
  310. currentTargetFound = true;
  311. // And Set It So The onFrame Function Does Not Try To Move The Enemy To A Point That Can Not Be Reahced
  312. noPathCanBeFound = true;
  313. }
  314. // The Start Of Fun Pathfinding Functions
  315. setPathfindingForCurrentParentTile(currentParent);
  316. // Through The Above Function We Will Set currentTargetFound To True Unless It Is Impossible To Get To The Current Target
  317. if (currentTargetFound == true)
  318. {
  319. // Sets The Enemies Parth To The Final List Path We Create With The setPathfindingForCurrentParentTile Function
  320. currentEnemy.enemyPathArray = finalListArray;
  321. // Reverses This List Becuase It Starts At The End
  322. currentEnemy.enemyPathArray.reverse();
  323. // Remove The First Object In This List As We Are Already In That Square;
  324. currentEnemy.enemyPathArray.splice(0,1);
  325. }
  326. }
  327. }
  328. private function setPathfindingForCurrentParentTile(currentParentTile:Object):void
  329. {
  330. // Remove Current Parent From Open List
  331. // rCPFOL = Remove Current Parent From Open List
  332. for (var rCPFOL=0; rCPFOL<openListArray.length; rCPFOL++)
  333. {
  334. if (currentParent == openListArray[rCPFOL])
  335. {
  336. openListArray.splice(rCPFOL,1);
  337. break;
  338. }
  339. }
  340. // Add Current Parent To Close List - AKA The List Of Objects We've Checked
  341. closeListArray.push(currentParentTile);
  342. currentParentTile.alreadyOnClosedList = true;
  343. // NW Tile
  344. // Note If YOu Want Enemies To Not Be Able To Cut Through Walls At All
  345. // Check If Going NW Would Go Through A Wall - NOTE: IF YOU WANT TO ALLOW ENEMIES TO CUT THROUGH CORNERS REMOVE THIS IF STATEMENT
  346. // NOTE: If You Want Enemies To Be Able TO Move Diaginol Make This A Or
  347. if (levelVector[currentParentTile.positionInArray-(gridWidth)].walkable == true || levelVector[currentParentTile.positionInArray-(1)].walkable == true)
  348. {
  349. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray-(gridWidth+1)]);
  350. }
  351. // N Tile
  352. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray-(gridWidth)]);
  353. // Check If Going NE Would Go Through A Wall - NOTE: IF YOU WANT TO ALLOW ENEMIES TO CUT THROUGH CORNERS REMOVE THIS IF STATEMENT
  354. if (levelVector[currentParentTile.positionInArray-(gridWidth)].walkable == true || levelVector[currentParentTile.positionInArray+(1)].walkable == true)
  355. {
  356. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray-(gridWidth-1)]);
  357. }
  358. // W Tile
  359. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray-(1)]);
  360. // E Tile
  361. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray+(1)]);
  362. // SW Tile
  363. // Check If Going NW Would Go Through A Wall - NOTE: IF YOU WANT TO ALLOW ENEMIES TO CUT THROUGH CORNERS REMOVE THIS IF STATEMENT
  364. if (levelVector[currentParentTile.positionInArray+(gridWidth)].walkable == true || levelVector[currentParentTile.positionInArray-(1)].walkable == true)
  365. {
  366. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray+(gridWidth-1)]);
  367. }
  368. // S Tile
  369. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray+(gridWidth)]);
  370. // Check If Going SE Would Go Through A Wall - NOTE: IF YOU WANT TO ALLOW ENEMIES TO CUT THROUGH CORNERS REMOVE THIS IF STATEMENT
  371. if (levelVector[currentParentTile.positionInArray+(gridWidth)].walkable == true || levelVector[currentParentTile.positionInArray+(1)].walkable == true)
  372. {
  373. checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(levelVector[currentParentTile.positionInArray+(gridWidth+1)]);
  374. }
  375. // Find New Current Parent Tile
  376. getNewCurrentParentTile();
  377. }
  378. private function checkIfThisCurrentSurroundingTileIsOnOpenListAndIfNotAddIt(currentChildToCheckIfOnOpenArray:Object):void
  379. {
  380. var currentTileChildGScoreToTest:int = currentChildToCheckIfOnOpenArray.gScore
  381. var comparisionOfCurrentChildGScoreOnCurrentParth:int
  382. // If The Target We Are Checking Is The Target Point We Want To Get To Then We Have Found Our Path
  383. if (currentChildToCheckIfOnOpenArray == currentTarget)
  384. {
  385. currentTargetFound = true;
  386. // Sets End Tile Parent To Current Parent
  387. currentTarget.currentParent = currentParent;
  388. // This Function Gives Us Our Path From The End To The Tile The Enemy Is In
  389. findWayBack();
  390. }
  391. // If We Have Not Found Our Target And This Tile Is Not Our Target Then...
  392. if (currentChildToCheckIfOnOpenArray != currentTarget && currentTargetFound == false)
  393. {
  394. // If It Is A Wall Or Already On The Closed List We Skip It
  395. if (currentChildToCheckIfOnOpenArray.walkable == true && currentChildToCheckIfOnOpenArray.alreadyOnClosedList == false)
  396. {
  397. // Check If This Child If Already On The Open List
  398. var thisChildIsNotAlreadyOnOpenList:Boolean = true;
  399. // aCPSTTOL = Add Current Parent Surrounding Tiles To Open List
  400. for (var aCPSTTOL=0; aCPSTTOL<openListArray.length; aCPSTTOL++)
  401. {
  402. if (openListArray[aCPSTTOL] == currentChildToCheckIfOnOpenArray)
  403. {
  404. // 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
  405. // Check If Parent Is Up Down Left Or Right Of This Tile
  406. comparisionOfCurrentChildGScoreOnCurrentParth = currentParent.gScore
  407. 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)
  408. {
  409. // A Up Down Left Or Right Movement Cost 10
  410. comparisionOfCurrentChildGScoreOnCurrentParth += 10
  411. }
  412. // Check If Parent Is Diagonal To This Tile
  413. 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)
  414. {
  415. // A Diagonal Movement Cost 14
  416. comparisionOfCurrentChildGScoreOnCurrentParth += 14
  417. }
  418. // If Going To That Child Would Make A Longer Path Then Reparent It
  419. if(comparisionOfCurrentChildGScoreOnCurrentParth < currentTileChildGScoreToTest)
  420. {
  421. currentChildToCheckIfOnOpenArray.currentParent = currentParent;
  422. addToATileGScore(currentChildToCheckIfOnOpenArray)
  423. }
  424. thisChildIsNotAlreadyOnOpenList = false;
  425. break;
  426. }
  427. }
  428. // If thisChildIsNotAlreadyOnOpenList Is Still True Then Add It To The Open List
  429. if (thisChildIsNotAlreadyOnOpenList == true)
  430. {
  431. // Add Current Child To Open Array
  432. openListArray.push(currentChildToCheckIfOnOpenArray);
  433. // Sets Child Of Current Parent, Parent Var To That Of The Current Parent;
  434. currentChildToCheckIfOnOpenArray.currentParent = currentParent;
  435. // Give This Tile An H Score
  436. // An H Score Is The Number Of Tiles This Tile Is From The End (Not Counting Walls) Times 10
  437. updateATileHScore(currentChildToCheckIfOnOpenArray);
  438. // Add To This Tiles G Score
  439. // 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
  440. // 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
  441. addToATileGScore(currentChildToCheckIfOnOpenArray);
  442. // Update The Tiles F Score
  443. // A F Score Is The Tiles H + The Tiles G Score
  444. // The Lower The F Score The Better The Path Is To TAke
  445. updateATileFScore(currentChildToCheckIfOnOpenArray);
  446. }
  447. }
  448. }
  449. }
  450. private function getNewCurrentParentTile():void
  451. {
  452. // If We Still Have Not Found Out Target
  453. if (currentTargetFound == false)
  454. {
  455. // Look For The Lowest F Value
  456. var currentLowestFValue:int = 10000;
  457. // fLFV = Find Lowest F Value
  458. for (var fLFV=0; fLFV<openListArray.length; fLFV++)
  459. {
  460. // If A Tiles F Value Is Lower Then The Current One Then Our Parent Becomes That Tile
  461. if (openListArray[fLFV].fScore < currentLowestFValue)
  462. {
  463. currentLowestFValue = openListArray[fLFV].fScore;
  464. currentParent = openListArray[fLFV];
  465. }
  466. }
  467. }
  468. }
  469. private function findWayBack():void
  470. {
  471. // We Have Found Our Current Target Now We Just Keep Adding The Parent Of Each Square Until We Get To Our Starting Square
  472. var currentFindWayBackParent:Object = currentTarget;
  473. // Each New Parent We Hop To Is Added To Our Final List Array
  474. finalListArray = [];
  475. while (currentFindWayBackParent != startingParent)
  476. {
  477. finalListArray.push(currentFindWayBackParent);
  478. currentFindWayBackParent.gotoAndStop(7);
  479. currentFindWayBackParent = currentFindWayBackParent.currentParent;
  480. }
  481. // When We Find Our Parent We Have The Shortest Path From The Current Target To Our Parent
  482. if (currentFindWayBackParent == startingParent)
  483. {
  484. finalListArray.push(startingParent);
  485. startingParent.gotoAndStop(7);
  486. }
  487. }
  488. private function addToATileGScore(currentTileGScoreToAddTo:Object):void
  489. {
  490. // Check If Parent Is Up Down Left Or Right Of This Tile
  491. 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)
  492. {
  493. // A Up Down Left Or Right Movement Cost 10
  494. currentTileGScoreToAddTo.gScore = currentTileGScoreToAddTo.currentParent.gScore + 10;
  495. }
  496. // Check If Parent Is Diagonal To This Tile
  497. 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)
  498. {
  499. // A Diagonal Movement Cost 14
  500. currentTileGScoreToAddTo.gScore = currentTileGScoreToAddTo.currentParent.gScore + 14;
  501. }
  502. }
  503. private function updateATileHScore(currentTileHScoreToUpdate:Object):void
  504. {
  505. // Simple Math To Find The Combined Diffrence Between The Current Tiles Collum And Row Compated To The Target Tile Collum And Row
  506. var currentTargetCollum:int = currentTarget.currentCollum;
  507. var currentTargetRow:int = currentTarget.currentRow;
  508. var currentCollumDiffrence:int;
  509. var currentRowDiffrence:int;
  510. currentCollumDiffrence = currentTargetCollum - currentTileHScoreToUpdate.currentCollum;
  511. if (currentCollumDiffrence < 0)
  512. {
  513. currentCollumDiffrence *= -1;
  514. }
  515. currentRowDiffrence = currentTargetRow - currentTileHScoreToUpdate.currentRow;
  516. if (currentRowDiffrence < 0)
  517. {
  518. currentRowDiffrence *= -1;
  519. }
  520. currentTileHScoreToUpdate.hScore = 10 * (currentCollumDiffrence + currentRowDiffrence);
  521. }
  522. private function updateATileFScore(currentTileGScoreToUpdate:Object):void
  523. {
  524. // Adds The Tile G and H Score Together
  525. currentTileGScoreToUpdate.fScore = currentTileGScoreToUpdate.hScore + currentTileGScoreToUpdate.gScore;
  526. }
  527. // Keyboard Events
  528. private function keyIsUp(e:KeyboardEvent):void
  529. {
  530. if (e.keyCode == 32)
  531. {
  532. spaceKeyDown = false;
  533. }
  534. }
  535. private function keyIsDown(e:KeyboardEvent):void
  536. {
  537. if (e.keyCode == 32)
  538. {
  539. spaceKeyDown = true;
  540. }
  541. }
  542. }
  543. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement