SubKorea > CYBER JAVA GAME > º®µ¹±ú±â2 (Javanoid v1.45) > ¼Ò½º #2

// ## JAVANOID GAME CLASS ######################################
// This is the most important class of javanoid : It creates and deletes
// all the geme objects, manages their lives ans collisions, and traducts
// on the game both the user and game events (user moves, bullets, pills
// & balls throws, next level, ...). It's also the player during demo mode.

final class jngame extends jnbuffer {

 final static int nbPills   = 4;    // game default attributes
 final static int nbBullets = 8;
 final static int nbBalls   = 3;

 final static int displayAlt = 100;
 final static int paddleAlt  = 40;
 final static int scoreAlt   = 20;

 final static int nbPillValues = 6;
 
 // flags for game state
 protected boolean goToNext = false;
 protected boolean demoMode = false;
 protected boolean fireMode = false;
 
 // Javanoid objects !!!
 protected jnlevel level;
 protected jnpill pills[]     = new jnpill[nbPills];
 protected jnbullet bullets[] = new jnbullet[nbBullets];
 protected jnball balls[]     = new jnball[nbBalls];
 protected jnpaddle paddle;
 
 // References
 Applet applet;
 jnimageserver imageSrv;
 jnsoundserver soundSrv;
 jnstatus      status;
  
 // Constructor
 public jngame (Applet a, jnimageserver i, jnsoundserver s, int w, int h) {
 
  // Canvas init
  super(a, w, h);
  imageSrv = i; soundSrv = s;
 
  // Status init
  status = new jnstatus(this, imageSrv, scoreAlt, displayAlt);
  }
 
 // Start in demo or game mode
 void startGame(boolean d) {

  demoMode = d; goToNext = false; fireMode = false;
 
  // Level init
  level = new jnlevel(imageSrv, soundSrv, this, status);
 
  // Paddle init
  paddle = new jnpaddle(imageSrv, soundSrv, this, paddleAlt, true);
 
  // Ball init
  balls[0] = new jnball(imageSrv, soundSrv, this, level, paddle);
 
  // Status init
  status.reset();
 
  // Automatic start or level name display
  if (demoMode) { status.showHiScore(); balls[0].launch(); }
  else status.showName(level.getName());
 
  }      // À§·Î

 // End level
 void stopGame() {
  level = null; paddle = null;
  for (int i=0;i<nbBalls;i++) balls[i] = null;
  for (int i=0;i<nbPills;i++) pills[i] = null;
  for (int i=0;i<nbBullets;i++) bullets[i] = null;
 
  }       // À§·Î
 
 // Ball launch
 public void launchBall() {
  if (!demoMode) {
 
    if (fireMode)
      throwBullet(paddle.getX() + paddle.getWidth() / 2, paddle.getY());

    else {
      status.hideName();
 
      for (int i=0;i<nbBalls;i++) {
        if ((balls[i]!=null) && (!balls[i].isLaunched())) balls[i].launch();
      }
    }
 
   }
  }       // À§·Î

 // Jump to next level
 public void jumpNext () { if (demoMode) goToNext = true; }

 // Paddle move
 public void movePaddle (int x) { if ((!demoMode) && (paddle!=null)) paddle.followMouse(x); }

 // Pill events
 public void pillEvent (int v) {

  // Reseting objects
  paddle.setNormal(); fireMode = false;

  for (int i=0;i<nbBalls;i++) {

    if (balls[i]!=null) {
 
       balls[i].setKiller(false);
       balls[i].setGlue(false);

       if (!balls[i].isLaunched()) { balls[i].launch(); }
     }
   }
 
  switch(v) {

   // Set multi-ball mode
   case 0: throwMultiBall();
    break;
 
   // Set fire mode
   case 1: paddle.setFire(); fireMode = true;
    break;
 
   // Set glue mode
   case 2: for (int i=0;i<nbBalls;i++) { if (balls[i]!=null) balls[i].setGlue(!demoMode); }
    break;
 
   // Set big paddle
   case 3: paddle.setBig();
    break;
 
   // Set small paddle
   case 4: paddle.setSmall();
    break;
 
   // Add bonus life, bonus score or gives super ball !
   case 5: switch((int)(4 * Math.random())) {

      case 0: status.addLife();
       break;

      case 1: for (int i=0;i<nbBalls;i++) { if (balls[i]!=null) balls[i].setKiller(true); }
       break;

      default: status.addBonus();
       break;

     }
     break;
 
    }
 
  }       // À§·Î

 // Next level
 void nextLevel() {

  for (int i=0;i<nbPills;i++)   pills[i] = null;
  for (int i=0;i<nbBullets;i++) bullets[i] = null;
  for (int i=0;i<nbBalls;i++)   balls[i] = null;
 
  level.next(); goToNext = false;
 
  // New ball & paddle reset
  balls[0] = new jnball(imageSrv, soundSrv, this, level, paddle);
  paddle.setNormal(); fireMode = false;
 
  // Automatic start or level name display whether demo or not
  if (demoMode) balls[0].launch();
  else status.showName(level.getName());
 
  }       // À§·Î

 // Ball lost
 void ballLost(int j) {
 
  balls[j]=null;

  if (j==0) {
    boolean found = false;

    for (int i=1;i<nbBalls;i++) {
      if ((balls[i]!=null) && (!found)) { balls[0]=balls[i]; balls[i]=null; found = true; }
     }

    if (!found) {
      for (int i=0;i<nbPills;i++) pills[i] = null;
      for (int i=0;i<nbBullets;i++) bullets[i] = null;
      status.removeLife();
 
      // Back to demo mode...
      if (status.getLives() < 0) { stopGame(); startGame(true); }
 
      // Another chance !
      else {
        balls[0] = new jnball(imageSrv, soundSrv, this, level, paddle);
        paddle.setNormal(); fireMode = false;
       }
 
     }
   }
  }       // À§·Î

 // Pill throwing
 void throwPill(int x, int y) {
  int i = 0; int v = (int)(nbPillValues * Math.random());

  while ((i<nbPills) && (pills[i]!=null)) i++;

  if (i<nbPills) pills[i] = new jnpill(imageSrv, soundSrv, this, v, x, y, paddle);
 
  }       // À§·Î

 // Bullet throwing
 void throwBullet(int x, int y) {
  int i = 0;
  while ((i<nbBullets) && (bullets[i]!=null)) i++;
  if (i<nbBullets) bullets[i] = new jnbullet(imageSrv, soundSrv, this, x, y, level);
 
  }       // À§·Î

 // MultiBallThrowing
 void throwMultiBall() {
  for (int i=1;i<nbBalls;i++) {
   if (balls[i]==null) {
    balls[i] = new jnball(imageSrv, soundSrv, this, level, paddle, balls[0], i);
    }
   }
  }       // À§·Î

 // Main part of javanoid ! Controls objects' life & death !
 public void live() {

  // Level is cleared
  if (((level!=null) && (level.isEmpty())) || goToNext) nextLevel();
 
  // Paddle move
  if (paddle != null) {
    if (demoMode) { paddle.followBall(balls[0].getX() + balls[0].getWidth() / 2); }
    paddle.live();
   }
 
  // Ball move
  for (int i=0;i<nbBalls;i++) {
    if (balls[i] != null) {
      if (balls[i].isAlive()) balls[i].live();
      else ballLost(i);
     }
   }
 
   // Pills move
  for (int i=0;i<nbPills;i++) {
    if (pills[i] != null) {
      if (pills[i].isAlive()) pills[i].live();
      else pills[i]=null;
     }
   }
 
  // Bullets move
  for (int i=0;i<nbBullets;i++) {
    if (bullets[i] != null) {
      if (bullets[i].isAlive()) bullets[i].live();
      else bullets[i]=null;
     }
   }
  }       // À§·Î
  
 // Unlock balls when no solutions
 public void unlock() {
  for (int i=0;i<nbBalls;i++) { if (balls[i]!=null) balls[i].setRandomDX(); }
  }       // À§·Î

 // Mouse down & move events
 public boolean mouseMove(Event evt, int x, int y) {
  movePaddle(x); return true;
  }

 public boolean mouseDown(Event evt, int x, int y) {
  requestFocus();
  if (demoMode) { stopGame(); startGame(false); }
  else launchBall();
  return true;
  }
 
 }       // À§·Î