Ejemplo n.º 1
0
    @Override
    public synchronized void onDraw(Canvas canvas) {
      long nt = SystemClock.elapsedRealtime();
      if (canvas == null) return;
      if (t < 0) t = nt;

      screenW = canvas.getWidth();
      screenH = canvas.getHeight();

      if (berzerk && nt - berzerkStart > berzerkLength) // Check if still in berzerk mode
      berzerk = false;
      if (mc == null) mc = new Character(screenW / 2, screenH - 30, screenW, screenH);
      if (!over) {
        // add Enemies
        if (firing && nt - g >= 150) { // Add bullets
          bullets.add(new Bullet(_x, _y, mc.getx(), mc.gety(), screenH, screenW));
          g = nt;
        }
        // Adds a new enemy from the specified sets depending on the level reached
        if (nt - f >= 1000) {
          if (level < 2) {
            squares.add(new BoxParticle(r, screenH, screenW, mc.getx(), mc.gety()));
          } else if (level < 3) {
            parabolics.add(new ParabolicParticle(r, screenH, screenW, mc.getx(), mc.gety()));
            turns.add(new TurningParticle(r, screenH, screenW, mc.getx(), mc.gety()));
          } else {
            turns.add(new TurningParticle(r, screenH, screenW, mc.getx(), mc.gety()));
            squares.add(new BoxParticle(r, screenH, screenW, mc.getx(), mc.gety()));
            parabolics.add(new ParabolicParticle(r, screenH, screenW, mc.getx(), mc.gety()));
            homings.add(new HomingParticle(r, 20, 15, screenH, screenW, mc.getx(), mc.gety()));
          }
          f = nt;
        }
        // stop add Enemies
        rms.clear();
        rms2.clear();
        rms3.clear();
        rms4.clear();
        rms5.clear();
        // Garbage Collection
        // Onscreen checking
        for (Bullet i : bullets) if (!i.onscreen()) rms.add(i);
        for (BoxParticle i : squares) if (!i.onscreen()) rms2.add(i);
        for (ParabolicParticle i : parabolics) if (!i.onscreen()) rms3.add(i);
        for (TurningParticle i : turns) if (!i.onscreen()) rms4.add(i);
        for (HomingParticle i : homings) if (!i.onscreen()) rms5.add(i);
        bullets.removeAll(rms);
        squares.removeAll(rms2);
        parabolics.removeAll(rms3);
        turns.removeAll(rms4);
        homings.removeAll(rms5);
        rms.clear();
        rms2.clear();
        rms3.clear();
        rms4.clear();
        rms5.clear();
        // Garbage collection
        // end Onscreen checking
        // Enemy collision with bullets
        for (Bullet i : bullets) {
          for (BoxParticle j : squares) {
            if (sq(i.getx() - j.getx()) + sq(i.gety() - j.gety())
                <= sq(i.getRadius() + j.getRadius())) {
              rms.add(i); // Add to garbage collection set
              rms2.add(j);
              if (r.nextInt(20) == 0)
                berzerkUps.add(new BerzerkUp(j.getx(), j.gety())); // Give chance of berzerk powerup
              score++;
            }
          }
          for (ParabolicParticle j : parabolics) {
            if (sq(i.getx() - j.getx()) + sq(i.gety() - j.gety())
                <= sq(i.getRadius() + j.getRadius())) {
              rms.add(i);
              rms3.add(j);
              if (r.nextInt(20) == 0) berzerkUps.add(new BerzerkUp(j.getx(), j.gety()));
              score++;
            }
          }
          for (TurningParticle j : turns) {
            if (sq(i.getx() - j.getx()) + sq(i.gety() - j.gety())
                <= sq(i.getRadius() + j.getRadius())) {
              rms.add(i);
              rms4.add(j);
              if (r.nextInt(20) == 0) berzerkUps.add(new BerzerkUp(j.getx(), j.gety()));
              score++;
            }
          }
          for (HomingParticle j : homings) {
            if (sq(i.getx() - j.getx()) + sq(i.gety() - j.gety())
                <= sq(i.getRadius() + j.getRadius())) {
              rms.add(i);
              rms5.add(j);
              if (r.nextInt(20) == 0) berzerkUps.add(new BerzerkUp(j.getx(), j.gety()));
              score++;
            }
          }
        }
        squares.removeAll(rms2);
        parabolics.removeAll(rms3);
        turns.removeAll(rms4);
        homings.removeAll(rms5);
        bullets.removeAll(rms);
        rms.clear();
        rms2.clear();
        rms3.clear();
        rms4.clear();
        rms5.clear();
        // Garbage collection
        // end Enemy collision with bullets
        // Enemy collision with character
        //  one cannot die in berzerk mode
        for (BoxParticle j : squares)
          // Collision detection
          if (sq(mc.getx() - j.getx()) + sq(mc.gety() - j.gety())
              <= sq(mc.getRadius() + j.getRadius())) {
            if (berzerk) {
              rms2.add(j);
              score++;
            } else over = true; // Game over if collision
          }
        for (ParabolicParticle j : parabolics)
          if (sq(mc.getx() - j.getx()) + sq(mc.gety() - j.gety())
              <= sq(mc.getRadius() + j.getRadius())) {
            if (berzerk) {
              rms3.add(j);
              score++;
            } else over = true;
          }

        for (TurningParticle j : turns)
          if (sq(mc.getx() - j.getx()) + sq(mc.gety() - j.gety())
              <= sq(mc.getRadius() + j.getRadius())) {
            if (berzerk) {
              rms4.add(j);
              score++;
            } else over = true;
          }
        for (HomingParticle j : homings)
          if (sq(mc.getx() - j.getx()) + sq(mc.gety() - j.gety())
              <= sq(mc.getRadius() + j.getRadius())) {
            if (berzerk) {
              rms5.add(j);
              score++;
            } else over = true;
          }
        if (berzerk) {
          // Garbage collection
          squares.removeAll(rms2);
          parabolics.removeAll(rms3);
          turns.removeAll(rms4);
          homings.removeAll(rms5);
          over = false;
        }
        // end Enemy collision with character
        if (over) {
          berzerk = false;
          stop();
        }
        // Berzerk powerup collision
        if (!berzerk) {
          for (BerzerkUp i : berzerkUps)
            if (sq(mc.getx() - i.getx()) + sq(mc.gety() - i.gety())
                <= sq(mc.getRadius() + i.getRadius())) {
              berzerk = true;
              berzerkStart = SystemClock.elapsedRealtime();
              rmsBU.add(i);
            }
        }
        berzerkUps.removeAll(rmsBU);
        rmsBU.clear();
        // end Berzerk powerup collision
      }
      // Berzerk events
      if (berzerk && !over) {
        // Berzerk paints
        bitmapPaint = invert;
        textPaint = blackTextPaint;
        canvas.drawColor(Color.WHITE);
      } else {
        // Normal paints
        bitmapPaint = aA;
        textPaint = whiteTextPaint;
        canvas.drawColor(Color.BLACK);
      }
      // end Berzerk events

      if (!over) {
        // Rendering particles
        for (BoxParticle i : squares) {
          i.update(((double) (nt - t)) / 1000);
          // Translate to position with rotation
          matrix.setRotate(i.getAngle(), squareW / 2, squareH / 2);
          matrix.postTranslate(i.getx() - squareW / 2, i.gety() - squareH / 2);
          canvas.drawBitmap(squareBitmap, matrix, bitmapPaint);
        }
        for (ParabolicParticle i : parabolics) {
          i.update(((double) (nt - t)) / 1000);
          matrix.setRotate(i.getAngle(), parabolicW / 2, parabolicH / 2);
          matrix.postTranslate(i.getx() - parabolicW / 2, i.gety() - parabolicH / 2);
          canvas.drawBitmap(parabolicBitmap, matrix, bitmapPaint);
        }
        for (TurningParticle i : turns) {
          i.update(((double) (nt - t)) / 1000);
          matrix.setRotate(i.getAngle(), turningW / 2, turningH / 2);
          matrix.postTranslate(i.getx() - turningW / 2, i.gety() - turningH / 2);
          canvas.drawBitmap(turningBitmap, matrix, bitmapPaint);
        }
        for (HomingParticle i : homings) {
          i.update(((double) (nt - t)) / 1000);
          matrix.setRotate(i.getAngle(), homingW / 2, homingH / 2);
          matrix.postTranslate(i.getx() - homingW / 2, i.gety() - homingH / 2);
          canvas.drawBitmap(homingBitmap, matrix, bitmapPaint);
        }
        for (Bullet i : bullets) {
          i.update(((double) (nt - t)) / 1000);

          matrix.setRotate(i.getAngle(), bulletW / 2, bulletH / 2);
          matrix.postTranslate(i.getx() - bulletW / 2, i.gety() - bulletH / 2);
          canvas.drawBitmap(bulletBitmap, matrix, bitmapPaint);
        }
        for (BerzerkUp i : berzerkUps) {
          canvas.drawBitmap(
              berzerkBitmap, i.getx() - berzerkW / 2, i.gety() - berzerkH / 2, bitmapPaint);
        }

        mc.update(((double) (nt - t)) / 1000);
        for (HomingParticle i : homings) {
          i.updateMC(mc.getx(), mc.gety());
        }

        matrix.setRotate(mc.getAngle(), mcW / 2, mcH / 2);
        matrix.postTranslate(mc.getx() - mcW / 2, mc.gety() - mcH / 2);
        canvas.drawBitmap(mcBitmap, matrix, bitmapPaint);
        // end Rendering particles
        // leveling
        if (score >= 50) level = 3;
        else if (score >= 25) level = 2;
      }
      // end leveling
      // Text rendering
      canvas.drawText("Score: " + score, 50, 25, textPaint);
      canvas.drawText("Level: " + level, screenW - 100, 25, textPaint);
      if (over) {
        canvas.drawText(
            OVER_STR,
            (screenW - largeTextPaint.measureText(OVER_STR)) / 2,
            screenH / 2 - 12,
            largeTextPaint);
        canvas.drawText(
            OVER_STR_2,
            (screenW - largeTextPaint.measureText(OVER_STR_2)) / 2,
            screenH / 2 + 16,
            largeTextPaint);
      } else if (berzerk) {
        canvas.drawText(
            BERZERK_STR, (screenW - redTextPaint.measureText(BERZERK_STR)) / 2, 25, redTextPaint);
        String timeStr =
            String.format("%.1f seconds left", ((double) berzerkLength - nt + berzerkStart) / 1000);
        if (nt - berzerkStart < 8000 || ((nt - berzerkStart) / 200) % 2 == 0) {
          canvas.drawText(
              timeStr, (screenW - redTextPaint.measureText(timeStr)) / 2, 40, redTextPaint);
        }
      }
      // end Text rendering
      t = nt;
    }