MenuGame.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  1. package com.darkdimension.ritle_run;
  2. import java.util.Random;
  3. import android.content.res.Resources;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Paint;
  7. public class MenuGame extends Menu
  8. {
  9. //Important Values
  10. private Random randomizer;
  11. private Paint font;
  12. private boolean paused;
  13. private int gameRunning;
  14. public boolean hardReset, hardRestart;
  15. private DiAnimation aStart;
  16. private String sScore;
  17. //Camera
  18. private int cameraX;
  19. private int speed;
  20. private int highScore, score;
  21. //Ground
  22. private int[] groundLevel;
  23. private Ground[] ground;
  24. private int lastGround;
  25. //Trees
  26. private DiPoint[] tree;
  27. private DiPoint lastTree0, lastTree1;
  28. //Pick ups & enemies
  29. private DiPoint[] pickUp;
  30. private DiPoint[] enemy;
  31. private DiAnimation doubleScoreTimer;
  32. //Character
  33. private Character character;
  34. //Crystal Show - UI
  35. private DiPoint diCrystal;
  36. private int dCrystals;
  37. private DiAnimation aCrystal, aCrystalDelay, tutorialDelay;
  38. private DiPoint buttonRestart, buttonBack, buttonResume, buttonMute;
  39. //Results
  40. private DiAnimation aResults;
  41. private int dResults;
  42. private int shownCrystals;
  43. private int shownScore;
  44. private int shownTotal;
  45. //Pause Menu
  46. private String sPaused, sRestart, sResume, sMainMenu;
  47. //Results Texts
  48. private String sResults, sResultsCrystals, sResultsScore, sResultsTotal, sResultsHighScore, sResultsNewHighScore, strTouchAnywhere;
  49. public MenuGame(Resources resources, int gHighScore, boolean gHardRestart)
  50. {
  51. //Super Constructor
  52. super();
  53. //Important Variables
  54. randomizer = new Random(System.currentTimeMillis());
  55. font = new Paint();
  56. font.setColor(Color.argb(255, 143, 231, 134));
  57. font.setTextSize(20 *GameSurface.density);
  58. font.setTextAlign(Paint.Align.CENTER);
  59. font.setAntiAlias(true);
  60. font.setShadowLayer(2, 1, 1, Color.BLACK);
  61. paused = false;
  62. gameRunning = -1;
  63. hardReset = false;
  64. hardRestart = gHardRestart;
  65. aStart = new DiAnimation(50);
  66. aStart.start();
  67. sScore = resources.getString(R.string.score);
  68. //Camera
  69. cameraX = 0;
  70. speed = (int) ((4 *GameSurface.density) *4);
  71. highScore = gHighScore;
  72. score = 0;
  73. //Grounds
  74. //Ground Levels
  75. groundLevel = new int[4];
  76. for (int iii = 0; iii < 4; iii++)
  77. groundLevel[iii] = GameSurface.height *(iii+1) /(groundLevel.length +1);
  78. //First Ground
  79. int N = GameSurface.width /(DiPoint.getWidth(14)*2) +2;
  80. ground = new Ground[N];
  81. ground[0] = new Ground();
  82. ground[0].setWidth(GameSurface.width /ground[0].getWidth() +2);
  83. ground[0].setCenterX(GameSurface.width/2);
  84. ground[0].setBottom(GameSurface.height);
  85. //Rest Grounds
  86. for (int iii = 1; iii < N; iii++)
  87. {
  88. //Init ground
  89. ground[iii] = new Ground();
  90. ground[iii].setWidth(randomizer.nextInt(5) +3);
  91. ground[iii].setLeft(ground[iii-1].getRight());
  92. //Randomize one of the ground levels except the last
  93. ground[iii].setTop( groundLevel[ randomizer.nextInt(3) ] -DiPoint.getHeight(14)/4 );
  94. //If it matches the previous
  95. if (ground[iii].getTop() == ground[iii -1].getTop())
  96. //Give it the last one
  97. ground[iii].setTop( groundLevel[3] -DiPoint.getHeight(14)/4 );
  98. }
  99. lastGround = N -1;
  100. //Trees
  101. tree = new DiPoint[N/2];
  102. //First two trees are fixed
  103. tree[0] = new DiPoint(5);
  104. tree[0].setCenterX(GameSurface.width /4);
  105. tree[0].setBottom (ground[0].getGroundLevel());
  106. tree[1] = new DiPoint(6);
  107. tree[1].setCenterX(GameSurface.width *5/6);
  108. tree[1].setBottom (ground[0].getGroundLevel());
  109. //Rest are on invalid state (for reseting)
  110. for (int iii = 2; iii < N/2; iii++)
  111. {
  112. tree[iii] = new DiPoint(5);
  113. tree[iii].setRight(0);
  114. }
  115. //Last two remain invalid until game stops
  116. lastTree0 = new DiPoint(5);
  117. lastTree0.setRight(0);
  118. lastTree1 = new DiPoint(6);
  119. lastTree1.setRight(0);
  120. //Pick ups & Enemies
  121. pickUp = new DiPoint[N];
  122. for (int iii = 0; iii < N; iii++)
  123. {
  124. pickUp[iii] = new DiPoint(21);
  125. pickUp[iii].setRight(0);
  126. }
  127. doubleScoreTimer = new DiAnimation(250);
  128. enemy = new DiPoint[N];
  129. for (int iii = 0; iii < N; iii++)
  130. {
  131. enemy[iii] = new DiPoint(25);
  132. enemy[iii].setRight(0);
  133. }
  134. //Character
  135. character = new Character();
  136. character.setRight(0);
  137. character.setBottom(ground[0].getGroundLevel() -1);
  138. //Crystals - UI
  139. diCrystal = new DiPoint(21);
  140. diCrystal.setLeft(0);
  141. diCrystal.setTop(GameSurface.height);
  142. dCrystals = 0;
  143. aCrystal = new DiAnimation(16);
  144. aCrystalDelay = new DiAnimation(40);
  145. buttonRestart = new DiPoint(8);
  146. buttonRestart.setCenterX(GameSurface.width /4);
  147. buttonRestart.setCenterY(GameSurface.height *2/3);
  148. buttonResume = new DiPoint(8);
  149. buttonResume.setCenterX(GameSurface.width *2/4);
  150. buttonResume.setCenterY(GameSurface.height *2/3);
  151. buttonBack = new DiPoint(8);
  152. buttonBack .setCenterX(GameSurface.width *3/4);
  153. buttonBack .setCenterY(GameSurface.height *2/3);
  154. tutorialDelay = new DiAnimation(120);
  155. tutorialDelay.start();
  156. buttonMute = new DiPoint(GameSurface.bSound ? 26 : 27);
  157. buttonMute.setRight (GameSurface.width -buttonMute.getWidth ()/2);
  158. buttonMute.setBottom(GameSurface.height -buttonMute.getHeight()/2);
  159. //Results
  160. aResults = new DiAnimation(30);
  161. dResults = 0;
  162. shownCrystals = 0;
  163. shownScore = 0;
  164. shownTotal = 0;
  165. //Pause Menu texts
  166. sPaused = resources.getString(R.string.paused);
  167. sRestart = resources.getString(R.string.button_restart);
  168. sResume = resources.getString(R.string.button_resume);
  169. sMainMenu = resources.getString(R.string.button_main_menu);
  170. //Results texts
  171. sResults = resources.getString(R.string.results);
  172. sResultsCrystals = resources.getString(R.string.results_crystals);
  173. sResultsScore = resources.getString(R.string.results_score);
  174. sResultsTotal = resources.getString(R.string.results_total);
  175. sResultsHighScore = resources.getString(R.string.results_high_score);
  176. sResultsNewHighScore = resources.getString(R.string.results_new_high_score);
  177. strTouchAnywhere = resources.getString(R.string.touch_anywhere);
  178. }
  179. public Action update()
  180. {
  181. super.update();
  182. //Configure Input
  183. if (bTouched)
  184. {
  185. //Cancel input
  186. bTouched = false;
  187. //Skip results
  188. if (aResults.isRunning())
  189. {
  190. switch (dResults)
  191. {
  192. case 1: shownCrystals = dCrystals; break;
  193. case 2: shownScore = (score /100) -1; break;
  194. case 3: shownTotal = shownCrystals +shownScore -1; break;
  195. case 4:
  196. if (buttonRestart.isTouched(touchX, touchY))
  197. {
  198. nMenu = Action.TO_GAME;
  199. aBasic.setMax(10);
  200. aBasic.startFromEnd();
  201. if (gameRunning > 0)
  202. hardReset = true;
  203. } else
  204. if (buttonBack.isTouched(touchX, touchY))
  205. {
  206. nMenu = Action.TO_MAIN_MENU;
  207. aBasic.setMax(10);
  208. aBasic.startFromEnd();
  209. if (gameRunning > 0)
  210. hardReset = true;
  211. }
  212. }
  213. aResults.setCounter(aResults.getMax() -1);
  214. }
  215. else
  216. //Pause Menu
  217. if (paused)
  218. {
  219. if (buttonResume.isTouched(touchX, touchY))
  220. paused = !paused; else
  221. if (buttonRestart.isTouched(touchX, touchY))
  222. {
  223. nMenu = Action.TO_GAME;
  224. aBasic.setMax(10);
  225. aBasic.startFromEnd();
  226. hardReset = true;
  227. } else
  228. if (buttonBack.isTouched(touchX, touchY))
  229. {
  230. nMenu = Action.TO_MAIN_MENU;
  231. aBasic.setMax(10);
  232. aBasic.startFromEnd();
  233. hardReset = true;
  234. } else
  235. if (buttonMute.isTouched(touchX, touchY))
  236. {
  237. if (GameSurface.bSound)
  238. {
  239. GameSurface.bSound = false;
  240. buttonMute.setFrame(27);
  241. }
  242. else
  243. {
  244. GameSurface.bSound = true;
  245. buttonMute.setFrame(26);
  246. }
  247. }
  248. }
  249. else
  250. character.jump();
  251. }
  252. if (paused); else
  253. //Game is Running
  254. if (gameRunning != 0)
  255. {
  256. //Advance Camera
  257. cameraX += speed;
  258. //Check Background Props
  259. //Background.Materialize(cameraX);
  260. Background.checkLimits(randomizer, cameraX);
  261. //Ground
  262. int N = ground.length;
  263. for (int iii = 0; iii < N; iii++)
  264. {
  265. //Reset Ground
  266. if (ground[iii].getRight() -cameraX/4 <= 0
  267. && gameRunning == -1)
  268. {
  269. //Width
  270. if (score < 4000) //5, 6, 7
  271. ground[iii].setWidth(randomizer.nextInt(3) +5); else
  272. if (score < 9000) //4, 5
  273. ground[iii].setWidth(randomizer.nextInt(2) +4); else
  274. if (score < 15000) //3, 4
  275. ground[iii].setWidth(randomizer.nextInt(2) +3);
  276. else //2, 3
  277. ground[iii].setWidth(randomizer.nextInt(2) +2);
  278. //Coordinates
  279. if (score < 2000)
  280. ground[iii].setLeft(ground[lastGround].getRight()); else
  281. if (score < 6500)
  282. ground[iii].setLeft(ground[lastGround].getRight() +DiPoint.getWidth(14)); else
  283. if (score < 12000)
  284. ground[iii].setLeft(ground[lastGround].getRight() +DiPoint.getWidth(14) +DiPoint.getWidth(14)/2); else
  285. if (score < 17000)
  286. ground[iii].setLeft(ground[lastGround].getRight() +DiPoint.getWidth(14) *2);
  287. else
  288. ground[iii].setLeft(ground[lastGround].getRight() +DiPoint.getWidth(14) *3);
  289. ground[iii].setTop( groundLevel[ randomizer.nextInt(3) ] -DiPoint.getHeight(14)/4 );
  290. //Same ground level
  291. if (ground[iii].getTop() == ground[lastGround].getTop())
  292. ground[iii].setTop( groundLevel[3] -DiPoint.getHeight(14)/4 );
  293. lastGround = iii;
  294. //Items
  295. int item = randomizer.nextInt(100);
  296. if (item < 50) item = 0; else
  297. if (item < 60) item = 1; else
  298. if (item < 64) item = 3; else
  299. if (item < 67) item = 2;
  300. else item = -1;
  301. if (item != -1)
  302. //Cycle pickups
  303. for (int jjj = 0; jjj < pickUp.length; jjj++)
  304. if (pickUp[jjj].getRight() <= 0)
  305. {
  306. //Create this pickUp
  307. pickUp[jjj].setFrame(21 +item);
  308. pickUp[jjj].setLeft(ground[iii].getLeft() +randomizer.nextInt(ground[iii].getWidth() -pickUp[jjj].getWidth()));
  309. pickUp[jjj].setBottom(ground[iii].getGroundLevel());
  310. jjj = pickUp.length;
  311. }
  312. //Enemies
  313. item = -1;
  314. if (randomizer.nextInt(100) < 25 && ground[iii].getBlockWidth() > 2)
  315. item = 0;
  316. else
  317. if (ground[iii].getBlockWidth() < 6 && randomizer.nextInt(100) < 60 && score > 3000)
  318. ground[iii].setSelfDestruct(true);
  319. if (item != -1)
  320. //Cycle Enemies
  321. for (int jjj = 0; jjj < enemy.length; jjj++)
  322. if (enemy[jjj].getRight() -cameraX/4 <= 0)
  323. {
  324. //Create Enemy
  325. enemy[jjj].setCenterX(ground[iii].getLeft() +ground[iii].getWidth() /3 *(randomizer.nextInt(2) +1));
  326. enemy[jjj].setBottom(ground[iii].getGroundLevel());
  327. jjj = enemy.length;
  328. }
  329. //Chance for trees
  330. if (ground[iii].getBlockWidth() >= 3 && !ground[iii].isSelfDestruct())
  331. if (randomizer.nextInt(100) < 35)
  332. for (int jjj = 0; jjj < tree.length; jjj++)
  333. if (tree[jjj].getRight() -cameraX/4 <= 0)
  334. {
  335. tree[jjj].setFrame(randomizer.nextBoolean() ? 5 : 6);
  336. tree[jjj].setBottom(ground[iii].getGroundLevel());
  337. tree[jjj].setCenterX(ground[iii].getLeft() +(ground[iii].getWidth() *(randomizer.nextInt(4) +1)/5 ));
  338. jjj = tree.length;
  339. }
  340. }
  341. //Update ground -Self Destruct-
  342. ground[iii].update();
  343. }
  344. //Opening animation
  345. if (aStart.update())
  346. character.setRight(aStart.getDistance(character.getWidth() *2));
  347. //Check if character moved to next ground
  348. if (character.getCenterX() > ground[character.walkingOn].getRight() -cameraX/4)
  349. if (++character.walkingOn >= ground.length) character.walkingOn = 0;
  350. //Character Update
  351. character.update(
  352. (character.getCenterX() > ground[character.walkingOn].getLeft() -cameraX/4 || aBasic.isRunning()) && gameRunning == -1 ?
  353. ground[character.walkingOn].getGroundLevel() : -GameSurface.height*2,
  354. groundLevel[1]);
  355. //Activate ground selfDestruct if there is
  356. if (character.justLanded())
  357. ground[character.walkingOn].selfDestruct();
  358. //PickUps
  359. for (DiPoint cPickUp : pickUp)
  360. if (cPickUp.getRight() -cameraX/4 > 0)
  361. //if Character picked up something
  362. if (isColliding(character.getSquare(), cPickUp.getSquare(-cameraX / 4, 0))
  363. && gameRunning == -1)
  364. {
  365. switch (cPickUp.getFrame() - 21)
  366. {
  367. case 0: //Memory Crystal
  368. dCrystals++;
  369. if (!aCrystal.isPositive())
  370. aCrystal.start();
  371. if (aCrystalDelay.isRunning())
  372. aCrystalDelay.startFromBeginning();
  373. GameSurface.playSound(2);
  374. break;
  375. case 1: //Magic Mana
  376. character.addManaLevel();
  377. break;
  378. case 2: //Shield
  379. character.giveShield();
  380. GameSurface.playSound(6);
  381. break;
  382. case 3: //Double Score
  383. doubleScoreTimer.startFromBeginning();
  384. GameSurface.playSound(5);
  385. break;
  386. }
  387. //Remove pickUp
  388. cPickUp.setRight(0);
  389. }
  390. //Enemies
  391. for (DiPoint cEnemy : enemy)
  392. if (cEnemy.getRight() -cameraX/4 > 0)
  393. {
  394. if (character.justLanded())
  395. if (character.getCenterX() > cEnemy.getLeft () - cameraX/4
  396. && character.getCenterX() < cEnemy.getRight() - cameraX/4)
  397. {
  398. if (character.hasShield())
  399. character.loseShield();
  400. else if (character.hasMana())
  401. character.loseMana();
  402. else
  403. {
  404. aStart.startFromEnd();
  405. character.jump();
  406. destroy(Action.TO_MAIN_MENU);
  407. }
  408. GameSurface.playSound(7);
  409. }
  410. }
  411. //Game Over
  412. if (character.getTop() > GameSurface.height && gameRunning == -1)
  413. {
  414. GameSurface.playSound(7);
  415. destroy(Action.TO_MAIN_MENU);
  416. }else
  417. //if game is ending, and it got to the final frame
  418. if (gameRunning > 0)
  419. if (gameRunning -cameraX/4 < 0)
  420. {
  421. //End game
  422. gameRunning = 0;
  423. //Fix camera so it has same angle as in main menu
  424. cameraX = (ground[lastGround].getCenterX() -GameSurface.width/2) *4;
  425. }
  426. //Survived this frame - award score
  427. //If game not starting && if game not ending
  428. if (!aBasic.isRunning() && gameRunning == -1)
  429. if (doubleScoreTimer.update())
  430. score += 2;
  431. else
  432. score++;
  433. }//End game is running
  434. else
  435. //Game is not running and its not paused (maybe inside a menu)
  436. Background.animate(randomizer, cameraX);
  437. //If game is ended
  438. if (aResults.update())
  439. {
  440. //Game over updated
  441. switch (dResults)
  442. {
  443. case 0: //Menu comes in play
  444. break;
  445. case 1: //Count crystals
  446. if (dCrystals > 0)
  447. shownCrystals++;
  448. break;
  449. case 2: //Count Score
  450. if (score /100 > 0)
  451. shownScore++;
  452. break;
  453. case 3: //Count Total
  454. if (shownCrystals +shownScore > 0)
  455. shownTotal++;
  456. break;
  457. case 4: //Wait for input
  458. break;
  459. }
  460. //Stop updating and start next menu
  461. if (aResults.isAtEnd())
  462. {
  463. boolean changed = false;
  464. if (dResults < 4)
  465. {
  466. dResults++;
  467. changed = true;
  468. }
  469. switch (dResults)
  470. {
  471. case 1:
  472. aResults.start( dCrystals > 0 ? dCrystals : 10);
  473. break;
  474. case 2:
  475. aResults.start(score /100 > 0 ? score /100 : 10);
  476. break;
  477. case 3:
  478. aResults.start(shownCrystals +shownScore > 0 ? shownCrystals +shownScore : 10);
  479. break;
  480. case 4:
  481. aResults.start(50);
  482. break;
  483. }
  484. if (changed && dResults == 4) return Action.SHOW_AD;
  485. }
  486. }
  487. //Crystal Display
  488. if (aCrystalDelay.isRunning())
  489. if (!paused)
  490. {
  491. //Advance Delay
  492. aCrystalDelay.update();
  493. //Action when it's over
  494. if (aCrystalDelay.isAtEnd())
  495. aCrystal.startFromEnd();
  496. }
  497. //else
  498. if (aCrystal.update())
  499. {
  500. diCrystal.setTop(GameSurface.height - aCrystal.getDistance(diCrystal.getHeight()));
  501. if (aCrystal.isAtEnd())
  502. aCrystalDelay.startFromBeginning();
  503. }
  504. //Redraw
  505. bDraw = true;
  506. //Menu destroyed
  507. if (aBasic.isAtStart() && !aBasic.isPositive())
  508. {
  509. Background.Materialize(cameraX);
  510. return nMenu;
  511. }
  512. return Action.NO_ACTION;
  513. }
  514. public void draw(Canvas canvas)
  515. {
  516. super.draw(canvas);
  517. //Background
  518. Background.Draw(canvas, cameraX);
  519. int N;
  520. //Hard Reset - Restart
  521. Paint paint = null;
  522. if (aBasic.isPositive() && hardRestart
  523. || !aBasic.isPositive() && hardReset)
  524. paint = invisible;
  525. //Ground
  526. N = ground.length;
  527. for (int iii = 0; iii < N; iii++)
  528. ground[iii].draw(canvas, -cameraX/4, 0, paint);
  529. //Trees
  530. N = tree.length;
  531. for (int iii = 0; iii < N; iii++)
  532. tree[iii].draw(canvas, -cameraX/4, 0, paint);
  533. lastTree0.draw(canvas, -cameraX/4, 0, paint);
  534. lastTree1.draw(canvas, -cameraX/4, 0, paint);
  535. N = enemy.length;
  536. for (int iii = 0; iii < N; iii++)
  537. enemy[iii].draw(canvas, -cameraX/4, 0, paint);
  538. N = pickUp.length;
  539. for (int iii = 0; iii < N; iii++)
  540. if (pickUp[iii].getRight() > 0)
  541. pickUp[iii].draw(canvas, -cameraX/4, 0, paint);
  542. //Character
  543. character.draw(canvas, paint);
  544. //Crystals
  545. diCrystal.draw(canvas, paint);
  546. if (!aCrystal.isAtStart())
  547. {
  548. canvas.drawText("x ", diCrystal.getRight(), diCrystal.getCenterY() + (diCrystal.getHeight() / 4), GameSurface.font);
  549. canvas.drawText(String.valueOf(dCrystals), diCrystal.getCenterX() *3, diCrystal.getCenterY() + (diCrystal.getHeight() / 4), GameSurface.font);
  550. }
  551. //Score
  552. canvas.drawText(sScore, GameSurface.width /2, (24 + (GameSurface.isPhone ? 0 : 12)) * GameSurface.density, GameSurface.font);
  553. if (doubleScoreTimer.isRunning() && gameRunning == -1)
  554. canvas.drawText(String.valueOf(score), GameSurface.width /2, (44 + (GameSurface.isPhone ? 0 : 12)) * GameSurface.density, font);
  555. else
  556. canvas.drawText(String.valueOf(score), GameSurface.width /2, (44 + (GameSurface.isPhone ? 0 : 12)) * GameSurface.density, GameSurface.font);
  557. //Draw Results
  558. if (aResults.isRunning())
  559. {
  560. canvas.drawText(sResults, GameSurface.width/2, (20 *GameSurface.density) *4, GameSurface.font);
  561. canvas.drawText(sResultsCrystals , GameSurface.width/3, (20 *GameSurface.density) *5, GameSurface.font);
  562. canvas.drawText(sResultsScore , GameSurface.width/3, (20 *GameSurface.density) *6, GameSurface.font);
  563. canvas.drawText(sResultsTotal , GameSurface.width/3, (20 *GameSurface.density) *7, GameSurface.font);
  564. canvas.drawText(sResultsHighScore , GameSurface.width/3, (20 *GameSurface.density) *8, GameSurface.font);
  565. if (dResults == 1) canvas.drawText(String.valueOf(shownCrystals), GameSurface.width*2/3, (20 *GameSurface.density) *5, font);
  566. else canvas.drawText(String.valueOf(shownCrystals), GameSurface.width*2/3, (20 *GameSurface.density) *5, GameSurface.font);
  567. if (dResults == 2) canvas.drawText(String.valueOf(shownScore) , GameSurface.width*2/3, (20 *GameSurface.density) *6, font);
  568. else canvas.drawText(String.valueOf(shownScore) , GameSurface.width*2/3, (20 *GameSurface.density) *6, GameSurface.font);
  569. if (dResults == 3) canvas.drawText(String.valueOf(shownTotal) , GameSurface.width*2/3, (20 *GameSurface.density) *7, font);
  570. else canvas.drawText(String.valueOf(shownTotal) , GameSurface.width*2/3, (20 *GameSurface.density) *7, GameSurface.font);
  571. canvas.drawText(String.valueOf(highScore), GameSurface.width*2/3, (20 *GameSurface.density) *8, GameSurface.font);
  572. if (shownTotal > highScore)
  573. canvas.drawText(sResultsNewHighScore, GameSurface.width/2, (20 *GameSurface.density) *9, GameSurface.font);
  574. if (dResults == 4)
  575. {
  576. buttonRestart.draw(canvas, invisible);
  577. canvas.drawText(sRestart, buttonRestart.getCenterX(), buttonRestart.getCenterY() +(10 *GameSurface.density), GameSurface.font);
  578. buttonBack.draw(canvas, invisible);
  579. canvas.drawText(sMainMenu, buttonBack.getCenterX(), buttonBack.getCenterY() +(10 *GameSurface.density), GameSurface.font);
  580. }
  581. else
  582. canvas.drawText(strTouchAnywhere, GameSurface.width/2, GameSurface.height -(20 *GameSurface.density), GameSurface.font);
  583. }
  584. //Pause Menu
  585. if (paused)
  586. {
  587. canvas.drawText(sPaused, GameSurface.width/2, GameSurface.height/2 +(10 *GameSurface.density), GameSurface.font);
  588. //Resume Button
  589. buttonResume.draw(canvas, invisible);
  590. canvas.drawText(sResume, buttonResume.getCenterX(), buttonResume.getCenterY() +(10 *GameSurface.density), GameSurface.font);
  591. //Restart Button
  592. buttonRestart.draw(canvas, invisible);
  593. canvas.drawText(sRestart, buttonRestart.getCenterX(), buttonRestart.getCenterY() +(10 *GameSurface.density), GameSurface.font);
  594. //Back Button
  595. buttonBack.draw(canvas, invisible);
  596. canvas.drawText(sMainMenu, buttonBack.getCenterX(), buttonBack.getCenterY() +(10 *GameSurface.density), GameSurface.font);
  597. //Mute Button
  598. buttonMute.draw(canvas, invisible);
  599. }
  600. }
  601. //Actions
  602. @Override
  603. public void destroy(Action action)
  604. {
  605. if (gameRunning == -1)
  606. {
  607. nMenu = action;
  608. //Find first not visible ground
  609. //Create Main Menu pattern there
  610. //Make the rest not visible
  611. int iii = character.walkingOn;
  612. int startingPoint = -1;
  613. do
  614. {
  615. //if ground is right from screen
  616. if (ground[iii].getLeft() -cameraX/4 > GameSurface.width)
  617. //First one becomes main menu pattern
  618. if (startingPoint == -1)
  619. {
  620. //Create Main Menu Patter here
  621. ground[iii].setWidth(GameSurface.width /DiPoint.getWidth(14) +2);
  622. ground[iii].setBottom(GameSurface.height);
  623. ground[iii].setSelfDestruct(false);
  624. startingPoint = ground[iii].getCenterX() -GameSurface.width/2;
  625. lastTree0.setCenterX(startingPoint +GameSurface.width /4);
  626. lastTree0.setBottom(ground[iii].getGroundLevel());
  627. lastTree1.setCenterX(startingPoint +GameSurface.width *5/6);
  628. lastTree1.setBottom(ground[iii].getGroundLevel());
  629. lastGround = iii;
  630. }
  631. //The rest of them are gone
  632. else
  633. ground[iii].setTop(GameSurface.height*2);
  634. iii++;
  635. if (iii == ground.length)
  636. iii = 0;
  637. } while (iii != character.walkingOn);
  638. int N;
  639. //Remove unnecessary items
  640. N = pickUp.length;
  641. for (int jjj = 0; jjj < N; jjj++)
  642. if (pickUp[jjj].getLeft() -cameraX/4 > GameSurface.width)
  643. pickUp[jjj].setRight(0);
  644. //Remove unnecessary enemies(int) (startingPoint -(cameraX/4) /(4 *GameSurface.density *speed));
  645. N = enemy.length;
  646. for (int jjj = 0; jjj < N; jjj++)
  647. if (enemy[jjj].getLeft() -cameraX/4 > GameSurface.width)
  648. enemy[jjj].setRight(0);
  649. N = tree.length;
  650. for (int jjj = 0; jjj < N; jjj++)
  651. if (tree[jjj].getLeft() -cameraX/4 > GameSurface.width)
  652. tree[jjj].setRight(0);
  653. //Create game countdown
  654. gameRunning = startingPoint;
  655. //Start showing results
  656. aResults.setMax(30);
  657. aResults.startFromBeginning();
  658. dResults = 0;
  659. }
  660. }
  661. public boolean hasNewHighScore() {return shownTotal > highScore;}
  662. public int getHighScore() {return shownTotal;}
  663. public void pause()
  664. {
  665. //If inside ending screen, go to main menu
  666. if (dResults == 4
  667. && gameRunning != -1)
  668. {
  669. nMenu = Action.TO_MAIN_MENU;
  670. aBasic.setMax(10);
  671. aBasic.startFromEnd();
  672. if (gameRunning > 0)
  673. hardReset = true;
  674. } else
  675. //else pause/un-pause game
  676. if (gameRunning == -1)
  677. {
  678. paused = !paused;
  679. if (!aCrystal.isPositive())
  680. aCrystal.start();
  681. else
  682. if (aCrystalDelay.isRunning())
  683. aCrystalDelay.startFromBeginning();
  684. }
  685. }
  686. private boolean isColliding(int[] object1, int[] object2)
  687. {
  688. return (object1[2] -object2[0] > 0)
  689. != (object1[0] -object2[2] > 0)
  690. && (object1[3] -object2[1] > 0)
  691. != (object1[1] -object2[3] > 0);
  692. }
  693. }