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

// ## JAVANOID BALL CLASS ######################################
// This class represents the balls in the game : they are moving object
// that have a really hard life (paddle & block collisions)

final class jnball extends jnmovingobject {

 final static int defaultSpeed  = 6;  // default attributes
 final static int defaultWidth  = 12;
 final static int defaultHeight = 12;
 final static int defaultImage  = 0;
 
 protected int speed;                 // ball speed (speed^2 = dx^2 + dy^2)
 
 protected boolean launched = false;  // when not launched, follow the paddle
 protected boolean glueMode = false;  // glue mode : wait for user for launch
 protected boolean killMode = false;  // kill mode : go through all blocks
 
 protected int defaultDX = 3;         // Default direction for launch
 protected int posX = 0, posY = 0;    // position on the paddle when not launched

 jnsoundserver soundSrv;
 jnimageserver imageSrv;
 jnlevel level;
 jnpaddle paddle;
  
 // Constructors (normal + for multiball mode)
 public jnball(jnimageserver i, jnsoundserver s, jngame c, jnlevel l, jnpaddle p) {
  super(c, i.ballImage(0), defaultWidth, defaultHeight, p.getX() + p.getWidth() / 2,
   p.getY() - defaultHeight, 0, 0);
 
  imageSrv = i; soundSrv = s;
  level = l; paddle = p;
  speed = defaultSpeed;
 
  posX = (paddle.getWidth() - width) / 2;
  posY = - height;
 
  }               // À§·Î

 public jnball(jnimageserver i, jnsoundserver s, jngame c, jnlevel l, jnpaddle p, jnball b, int n) {
  super(c, i.ballImage(0), defaultWidth, defaultHeight, b.getX(), b.getY(), 0, 0);
 
  imageSrv = i; soundSrv = s;
  level = l; paddle = p;
  speed = defaultSpeed;
 
  posX = (paddle.getWidth() - width) / 2;
  posY = - height;
 
  if (n==1) setBallDX(b.getDX() + 1, (b.getDY()<0));
  else setBallDX(b.getDX() - 1, (b.getDY()<0));
  launched = true;
 
  }                // À§·Î

 // ball launch & live methods
 public void launch() {
  if (!glueMode) { soundSrv.playStart(); setBallDX(defaultDX, true); }
  launched = true;
 
  }                // À§·Î
  
 // ball life (paddle & block detection)
 public void live() {
  int oldX = X; int oldY = Y;

  // follow paddle when not launched
  if (!launched) { X = paddle.getX() + posX; Y = paddle.getY() + posY; }
 
  super.live();       // Ball movement

  if (launched) {

   if (dY > 0) {

    if (paddle.isHit(X + width / 2, Y + height)) {         // Paddle hit

     if (glueMode) {
      launched = false; posX = X - paddle.getX(); posY = Y - paddle.getY();
      }
     setBallDX(paddle.hit(X + width / 2, dX, speed), true);

     }

    else if (level.hitBlock(X + width / 2, Y + height, killMode)) invertDY();
    }

   else if (level.hitBlock(X + width / 2, Y, killMode)) invertDY();

   if (dX < 0) {
    if (level.hitBlock(X, Y + height / 2, killMode)) invertDX();
    }

   else if (level.hitBlock(X + width, Y + height / 2, killMode)) invertDX();
   }
  }                // À§·Î
  
 // Ball settings
 public void setBallDX (int d, boolean b) {
  dX = d;
  dY = (int)(Math.max(Math.sqrt((double)(speed * speed - dX * dX)), 1));
  if (b) dY = - dY;
 
  }                // À§·Î

 public void setSpeed (int s) { speed = s; }

 public void setGlue (boolean g) { glueMode = g; }

 public void setKiller (boolean g) {
  killMode = g;
  if (killMode) change(imageSrv.ballImage(1), defaultWidth, defaultHeight);
  else change(imageSrv.ballImage(0), defaultWidth, defaultHeight);
 
  }                // À§·Î

 public void setRandomDX() {
  setBallDX((int)((speed - 1) * (2 * Math.random() - 1)), false);
 
  }                // À§·Î

 // Ball requests
 public int getSpeed() { return speed; }

 public boolean isLaunched() { return launched; }
 
 }                // À§·Î
 
 
// ## JAVANOID PILL CLASS #####################################
// This class represents the pills in the game : They are moving objects
// with a value that gives their effects on the game when they're catched
// by the paddle

final class jnpill extends jnmovingobject {

 final static int defaultSpeed  = 3;  // default attributes
 final static int defaultWidth  = 16;
 final static int defaultHeight = 8;
 
 protected int pillValue;      // Determines the effect

 jnsoundserver soundSrv;
 jngame game;
 jnpaddle paddle;
  
 // Constructor
 public jnpill(jnimageserver i, jnsoundserver s, jngame c, int v, int bx, int by, jnpaddle p) {
  super(c, i.pillImage(v), defaultWidth, defaultHeight, bx, by, 0, defaultSpeed);
  soundSrv = s; paddle = p; game = c;
  pillValue = v;
 
  }                // À§·Î

 // Pill life (paddle detection + dies when at the top of the screen)
 public void live() {
  super.live();          // Pill movement
 
  if (paddle.isHit(X + width / 2, Y + height)) {         // Paddle hit
   soundSrv.playHit(); game.pillEvent(pillValue); die();
   }

  }
 
 }                 // À§·Î