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