// ## 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 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 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();
}
}
}
// À§·Î