/src/LevelSelect.as

http://github.com/schonstal/shadowmonk · ActionScript · 275 lines · 188 code · 47 blank · 40 comment · 39 complexity · d3920faf1fe8bdda6e5fc0b1c529c62c MD5 · raw file

  1. package
  2. {
  3. import org.flixel.*;
  4. public class LevelSelect extends FlxState
  5. {
  6. [Embed(source='../data/Level_select.png')] private var ImgGlow:Class;
  7. private var levels:Array;
  8. private var _t:FlxText;
  9. private var _oneStar:FlxText;
  10. private var _twoStar:FlxText;
  11. private var _threeStar:FlxText;
  12. private var _stars:StarRating;
  13. //Colors for text
  14. private var _dark:Number = 0xff000000;
  15. private var _light:Number = 0xff682777;
  16. private var _upArrow:ScrollArrow;
  17. private var _downArrow:ScrollArrow;
  18. //Moving arrow timers (when scrolling list)
  19. private var _arrowTime:Number = 0;
  20. private var _arrowAmount:Number = 2;
  21. private var _arrowInterval:Number = 0.1;
  22. //Hold-to-scroll hold amount
  23. private var _holdTimer:Number;
  24. private var _holdInterval:Number = 0.5;
  25. //Hold-to-scroll interval
  26. private var _scrollTimer:Number;
  27. private var _scrollInterval:Number = 0.05;
  28. //Make sure the player can't select after a level has already been selected
  29. private var _selected:Boolean = false;
  30. //First displayed item on the list
  31. private var _window:Number = 1;
  32. private var _windowOffset:Number = 9;
  33. private function get _windowMax():Number {
  34. return _window + _windowOffset;
  35. }
  36. public function LevelSelect()
  37. {
  38. SoundBank.music("level_select");
  39. levels = new Array();
  40. var m:SelectScroll;
  41. m = new SelectScroll();
  42. add(m);
  43. //Make sure the window is in the correct place
  44. if(FlxG.level > 10)
  45. _window = FlxG.level - 9;
  46. //Add all the text to the list
  47. var level:int;
  48. for(level=1; level <= Starter.levels; level++) {
  49. var levelText:LevelText;
  50. levelText = new LevelText(27, 54 + (level * 12), level);
  51. //Make sure the selected level is hilighted
  52. levelText.color = (FlxG.level==level?_light:_dark);
  53. levels[level-1] = levelText;
  54. //Hide text outside the window
  55. setVisibility(level-1);
  56. add(levelText);
  57. }
  58. var bestTimer:GameTimer = new GameTimer(SaveData.best);
  59. //Total stars
  60. _t = new FlxText(203, 9, 92, "" + SaveData.totalStars);
  61. _t.alignment = "right";
  62. _t.setFormat("SNES");
  63. _t.color = 0xffffffff;
  64. add(_t);
  65. //Best time
  66. _t = new FlxText(191, 49, 128, (SaveData.completed>0?bestTimer.render():"--:--.--"));
  67. _t.alignment = "center";
  68. _t.setFormat("SNES");
  69. _t.color = 0xffffffff;
  70. add(_t);
  71. //Star times
  72. _oneStar = new FlxText(191, 121, 128, "--:--.--");
  73. _oneStar.alignment = "center";
  74. _oneStar.setFormat("SNES");
  75. _oneStar.color = 0xffffffff;
  76. add(_oneStar);
  77. _twoStar = new FlxText(191, 155, 128, "--:--.--");
  78. _twoStar.alignment = "center";
  79. _twoStar.setFormat("SNES");
  80. _twoStar.color = 0xffffffff;
  81. add(_twoStar);
  82. _threeStar = new FlxText(191, 189, 128, "--:--.--");
  83. _threeStar.alignment = "center";
  84. _threeStar.setFormat("SNES");
  85. _threeStar.color = 0xffffffff;
  86. add(_threeStar);
  87. //"Level Select"
  88. var t:FlxText = new FlxText(27, 42, 158, "Level Select");
  89. t.alignment = "center";
  90. t.setFormat("SNES");
  91. t.color = _dark;
  92. add(t);
  93. //Arrows
  94. _upArrow = new ScrollArrow(100, 54, "up");
  95. _upArrow.visible = false;
  96. add(_upArrow);
  97. _downArrow = new ScrollArrow(100, 186, "down");
  98. add(_downArrow);
  99. //Only show the arrows if you can scroll
  100. setArrows();
  101. //Show the rating for the current level
  102. _stars = new StarRating(115, 32, SaveData.stars);
  103. add(_stars);
  104. }
  105. override public function update():void
  106. {
  107. //Reset the arrows if you haven't pressed up/down for a while
  108. _arrowTime -= FlxG.elapsed;
  109. if(_arrowTime <= 0) {
  110. _upArrow.y = 54;
  111. _downArrow.y = 186;
  112. }
  113. super.update();
  114. //Allow the player to scroll if they haven't recently
  115. _scrollTimer += FlxG.elapsed;
  116. if(!_selected) {
  117. //Check if the player is holding down or up
  118. if(FlxG.keys.DOWN)
  119. _holdTimer -= FlxG.elapsed;
  120. if(FlxG.keys.UP)
  121. _holdTimer += FlxG.elapsed;
  122. if(!FlxG.keys.UP && !FlxG.keys.DOWN)
  123. _holdTimer = 0;
  124. //If you just pressed UP or if you've been holding it, scroll up
  125. if(FlxG.keys.justPressed("UP") ||
  126. _holdTimer > _holdInterval &&
  127. _scrollTimer >= _scrollInterval) {
  128. if(FlxG.level > 1) {
  129. moveCursor(FlxG.level - 1);
  130. //Don't loop the cursor when the key is held
  131. } else if(_holdTimer < _holdInterval) {
  132. moveCursor(Starter.levels);
  133. }
  134. //See if the player wants to go down
  135. } else if(FlxG.keys.justPressed("DOWN") ||
  136. _holdTimer < -_holdInterval &&
  137. _scrollTimer >= _scrollInterval) {
  138. if(FlxG.level < Starter.levels) {
  139. moveCursor(FlxG.level + 1);
  140. } else if(_holdTimer > -_holdInterval) {
  141. moveCursor(1);
  142. }
  143. //Check if the player wants to start the game
  144. } else if(FlxG.keys.justPressed("X") || FlxG.keys.justPressed("ENTER")) {
  145. if (FlxG.level <= SaveData.completed + 1) {
  146. _selected = true;
  147. FlxG.music.fadeOut(0.5);
  148. SoundBank.play("select");
  149. FlxG.fade.start(0xff000000, 0.5, function():void {
  150. SoundBank.music("game");
  151. Starter.startLevel();
  152. });
  153. } else {
  154. SoundBank.play("nope");
  155. }
  156. }
  157. }
  158. }
  159. private function moveCursor(newLevel:int):void {
  160. //loop var
  161. var i:int;
  162. if(newLevel > FlxG.level)
  163. SoundBank.play("down");
  164. else
  165. SoundBank.play("up");
  166. //Set the previously selected text back to default
  167. levels[FlxG.level-1].color = _dark;
  168. //Reset the timer so they can't scroll again for a little while (useful for holding)
  169. _scrollTimer = 0;
  170. //Scroll the list up
  171. if(newLevel < _window) {
  172. //Animate the up arrow
  173. if(_arrowTime <= 0)
  174. _upArrow.y -= _arrowAmount;
  175. _arrowTime = _arrowInterval;
  176. //Move the level text down
  177. for(i = 0; i < levels.length; i++) {
  178. _window = newLevel;
  179. setVisibility(i);
  180. }
  181. }
  182. //Scroll the window down if necessary
  183. if(newLevel > _windowMax) {
  184. //Animate down arrow
  185. if(_arrowTime <= 0)
  186. _downArrow.y += _arrowAmount;
  187. _arrowTime = _arrowInterval;
  188. //Move the level text up
  189. for(i = 0; i < levels.length; i++) {
  190. _window = newLevel - 9;
  191. setVisibility(i);
  192. }
  193. }
  194. //Only show the arrow if you can scroll
  195. setArrows();
  196. //Update to the new level
  197. FlxG.level = newLevel;
  198. var bestTimer:GameTimer = new GameTimer(SaveData.best);
  199. _stars.rating = SaveData.stars;
  200. _t.text = (bestTimer.elapsed>5999?"--:--.--":bestTimer.render());
  201. //Hilight the selected text
  202. levels[FlxG.level-1].color = _light;
  203. }
  204. //Sets visibility of a menu item depending on it's index relative to the window
  205. private function setVisibility(i:int):void {
  206. //Place the text in the correct position
  207. levels[i].y = 66 + (i*12) - ((_window-1) * 12);
  208. //Check if it's in the window, set visibility accordingly
  209. if(i < _window - 1)
  210. levels[i].visible = false;
  211. else if(i < _windowMax)
  212. levels[i].visible = true;
  213. if(i >= _windowMax)
  214. levels[i].visible = false;
  215. }
  216. //Hides the arrows if you can't scroll the list, shows them if you can
  217. private function setArrows():void {
  218. if(_window > 1)
  219. _upArrow.visible = true;
  220. else
  221. _upArrow.visible = false;
  222. if(_windowMax < Starter.levels)
  223. _downArrow.visible = true;
  224. else
  225. _downArrow.visible = false;
  226. }
  227. }
  228. }