//Title: boingo.java
//Version:
//Copyright: Copyright (c) 2000
//Author: SyGem Software
import java.awt.*;
import java.applet.*;
import sygem.jazz3d2_102.*;
public class boingo extends Applet implements Runnable {
Thread m_ce;
world boingo_world;
int banner_id;
int banner2_id = -1;
int score_id = -1;
int hit_id = -1;
int base_id;
int light1;
int pid,pid2,pid3,pid4;
int enemy_object;
int score = 0;
int level = 1;
int hit = 0;
int enemy_step = 3;
int total = 0;
int bullets[];
int bullets_display[];
boolean fired[];
double xvec[];
double yvec[];
double xpos[];
double ypos[];
int current_bullet = 5;
int energy[];
int enemy_id;
double temp_y = 0;
int step = 0;
int step2 = 100;
int step3 = 250;
double bounce[];
double height = 0;
int b_step = 0;
double posx,posy,posz;
double speed = 0.1;
double bullet_speed = 0.2;
int energy_level = 10;
boolean titlepage = true;
boolean main_game = false;
boolean redraw = true;
boolean create_new_enemy = true;
boolean fire_bullet = false;
boolean game_over = false;
boolean animate_hit = false;
boolean animate_hit2 = false;
boolean game_completed = false;
boolean new_level = true;
int new_level_frames = 0;
font3d arial;
//Construct the applet
public boingo() {
}
//Initialize the applet
public void init() {
resize(320,240);
boingo_world = new world(this);
setLayout(new BorderLayout());
add("Center", boingo_world);
bullets = new int[5];
bullets_display = new int[6];
fired = new boolean[5];
xvec = new double[5];
yvec = new double[5];
xpos = new double[5];
ypos = new double[5];
energy = new int[10];
bounce = new double[360];
for (int i = 0;i < 360;i++) {
double temp_y = Math.sin(i*Math.PI/180);
bounce[i] = Math.abs(temp_y);
}
arial = new font3d("Arial", boingo_world);
light temp_light = new light(0,0,1);
light temp_light2 = new light(0,-1,0);
light1 = boingo_world.addLight(temp_light);
light1 = boingo_world.addLight(temp_light2);
}
//Start the applet
public void start() {
if (m_ce == null) {
m_ce = new Thread(this);
m_ce.start();
}
}
//Stop the applet
public void stop() {
if (m_ce != null) {
m_ce.stop();
m_ce = null;
}
}
//Destroy the applet
public void destroy() {
}
public void run() {
setup_title_page();
while (true) {
if (game_over) {
// should go to highscore table
setup_score_display();
}
if (titlepage) {
title_page_animate();
}
if (main_game && ! game_over) {
main_game_loop();
}
boingo_world.redraw();
}
}
void setup_title_page() {
boingo_world.suspend();
titlepage = true;
main_game = false;
game_over = false;
renderfs wireframe = new renderfs();
boingo_world.deleteAllObjects();
text3d title_page = new text3d("Boingo!", arial, 0.5, 0.1, 0.1, -0.15, 0.35, 8);
title_page.rotateLocal(0,0,20);
title_page.setColour(255,0,0);
pid = boingo_world.addObject(title_page, wireframe);
sphere3d title_boing = new sphere3d(10,10,0.4,-0.4,7.5);
title_boing.scaleObject(0.5,0.5,0.5);
title_boing.setColour(0,255,0);
pid2 = boingo_world.addObject(title_boing, wireframe);
sphere3d title_boing2 = new sphere3d(10,10,0,-0.2,8);
title_boing2.scaleObject(0.2,0.2,0.2);
title_boing2.setColour(0,255,255);
pid3 = boingo_world.addObject(title_boing2, wireframe);
sphere3d title_boing3 = new sphere3d(10,10,-0.5,0,8.5);
title_boing3.scaleObject(0.3,0.3,0.3);
title_boing3.setColour(0,0,255);
pid4 = boingo_world.addObject(title_boing3, wireframe);
boingo_world.prep();
boingo_world.resume();
}
void title_page_animate() {
step+= 2;
if (step >= 360) step -= 360;
step2+= 3;
if (step2 >= 360) step2 -= 360;
step3+= 4;
if (step3 >= 360) step3 -= 360;
boingo_world.rotateObjectLocal(pid,4,0,0);
boingo_world.setObjectPosition(pid2,0.4,bounce[step]-0.6,7.5);
boingo_world.rotateObjectLocal(pid2,1,3,2);
boingo_world.setObjectPosition(pid3,0,(bounce[step2]*0.9)-0.6,8);
boingo_world.rotateObjectLocal(pid3,0,3,0);
boingo_world.setObjectPosition(pid4,-0.5,(bounce[step3]*0.8)-0.6,8.5);
boingo_world.rotateObjectLocal(pid4,5,1,2);
}
void setup_main_game() {
boingo_world.suspend();
titlepage = false;
main_game = true;
game_over = false;
game_completed = false;
posx = posy = posz = 0;
enemy_step = 3;
energy_level = 10;
current_bullet = 5;
level = 1;
boingo_world.deleteAllObjects();
checkerboard3d base = new checkerboard3d(5,20,0,-0.1,11);
base.scaleObject(0.5,20,1);
base.rotateWorld(90,0,0);
renderfs wireframe = new renderfs();
base_id = boingo_world.addObject(base,wireframe);
sphere3d enemy = new sphere3d(10,10,0,0,0);
enemy.scaleObject(0.1,0.1,0.1);
enemy.setColour(255,0,255);
enemy_id = boingo_world.addObject(enemy,wireframe);
for (int i = 0;i < 5;i++) {
sphere3d new_sphere = new sphere3d(5,5,0,0,-2);
new_sphere.scaleObject(0.10,0.10,0.10);
bullets[i] = boingo_world.addObject(new_sphere,wireframe);
}
for (int i = 0;i < 10;i++) {
cube3d new_cube = new cube3d(0.85,(i*0.1)-0.2,8);
new_cube.scaleObject(0.08,0.08,0.08);
new_cube.setColour(0,255,0);
energy[i] = boingo_world.addObject(new_cube,wireframe);
}
text3d zero = new text3d("0", arial, 0.5, 0.1, 0.1, -0.8, 0.1, 8);
text3d one = new text3d("1", arial, 0.5, 0.1, 0.1, -0.8, 0.1, 8);
text3d two = new text3d("2", arial, 0.5, 0.1, 0.1, -0.8, 0.1, 8);
text3d three = new text3d("3", arial, 0.5, 0.1, 0.1, -0.8, 0.1, 8);
text3d four = new text3d("4", arial, 0.5, 0.1, 0.1, -0.8, 0.1, 8);
text3d five = new text3d("5", arial, 0.5, 0.1, 0.1, -0.8, 0.1, 8);
bullets_display[0] = boingo_world.addObject(zero, wireframe);
bullets_display[1] = boingo_world.addObject(one, wireframe);
bullets_display[2] = boingo_world.addObject(two, wireframe);
bullets_display[3] = boingo_world.addObject(three,wireframe);
bullets_display[4] = boingo_world.addObject(four, wireframe);
bullets_display[5] = boingo_world.addObject(five, wireframe);
for (int i = 0;i < 5;i++) {
boingo_world.setObjectVisible(bullets_display[i],false);
}
enemy_id = boingo_world.addObject(enemy,wireframe);
text3d score_display = new text3d("0", arial, 0.3,0.01,0.2,-0.7,0.65,8);
score_display.setColour(0,255,255);
score_id = boingo_world.addObject(score_display, wireframe);
boingo_world.prepNewObjects();
boingo_world.resume();
}
void main_game_loop() {
for (int i = 0;i < 10;i++) {
boingo_world.rotateObjectLocal(energy[i],1,2,3);
}
if (new_level) {
new_level_frames++;
if (new_level_frames > 50) {
new_level = false;
boingo_world.deleteObject(banner_id);
boingo_world.deleteObject(banner2_id);
boingo_world.setObjectVisible(score_id, true);
}
return;
}
if (animate_hit) {
boingo_world.translateObjectWorld(hit_id,0,0,0.3);
if (boingo_world.getObjectCenter(hit_id).getZ() > 6) {
animate_hit = false;
animate_hit2 = true;
}
return;
}
if (animate_hit2) {
boingo_world.translateObjectWorld(hit_id,0,0.3,0);
if (boingo_world.getObjectCenter(hit_id).getY() > 2) {
animate_hit = false;
animate_hit2 = false;
boingo_world.deleteObject(hit_id);
}
return;
}
if (create_new_enemy) {
posz = 16;
posx = (Math.random()*0.5) - 0.25;
posy = (Math.random()*0.4) + 0.2;
height = posy;
boingo_world.setObjectPosition(enemy_id,posx,posy,posz);
create_new_enemy = false;
total++;
}
b_step += enemy_step;
if (b_step >= 360) b_step -= 360;
posz -= speed;
posy = (height*bounce[b_step])-0.05;
if (posz <= 0) {
create_new_enemy = true;
energy_level--;
if (energy_level < 0) {
game_over = true;
} else {
boingo_world.setObjectColour(energy[energy_level],255,0,0);
}
}
boingo_world.setObjectPosition(enemy_id,posx,posy,posz);
for (int i = 0;i < 10;i++) {
boingo_world.rotateObjectLocal(energy[i],1,2,3);
}
for (int i = 0;i < 6;i++) {
boingo_world.setObjectVisible(bullets_display[i],false);
}
boingo_world.setObjectVisible(bullets_display[current_bullet],true);
for (int i = 0;i < 5;i++) {
if (fired[i]) {
if (boingo_world.testCollision(enemy_id,bullets[i])) {
score += (posz*level);
hit++;
fired[i] = false;
current_bullet++;
boingo_world.setObjectPosition(bullets[i],0,0,-2);
create_new_enemy = true;
// let's see... at this point, we have just hit an enemy, so we can prolly afford
// to generate the new score display on-the-fly...
renderfs wireframe = new renderfs();
boingo_world.deleteObject(score_id);
text3d score_display = new text3d(""+score, arial, 0.3,0.01,0.2,-0.7,0.65,8);
score_display.setColour(0,255,255);
score_id = boingo_world.addObject(score_display, wireframe);
text3d hit_display = new text3d("Hit!", arial, 0.2, 0.02, 0.1,0,0.3,2);
hit_display.setColour(255,0,255);
hit_id = boingo_world.addObject(hit_display, wireframe);
boingo_world.prepNewObjects();
animate_hit = true;
} else {
if (boingo_world.getObjectCenter(bullets[i]).getZ() > 16) {
fired[i] = false;
current_bullet++;
boingo_world.setObjectPosition(bullets[i],0,0,-2);
} else {
boingo_world.translateObjectWorld(bullets[i],xvec[i],yvec[i],bullet_speed);
}
}
}
}
if (total > 10) {
level++;
speed += 0.05;
enemy_step++;
bullet_speed += 0.05;
boingo_world.scaleObject(enemy_id,0.8,0.8,0.8);
boingo_world.setObjectPosition(enemy_id,0,0,-2);
// move to a new level!
if (level == 6) {
// Game completed!!!
game_over = true;
game_completed = true;
}
if (hit == (total-1)) {
// perfect!
displaylevelbanner(level, true);
} else {
displaylevelbanner(level, false);
}
}
}
void displaylevelbanner(int id,boolean t) {
boingo_world.setObjectVisible(score_id, false);
renderfs wireframe = new renderfs();
text3d banner = new text3d("Level "+id, arial, 0.5,0.01,0.2,0,0.60,8);
banner.setColour(255,255,0);
banner_id = boingo_world.addObject(banner, wireframe);
if (t) {
text3d banner2 = new text3d("Perfect!", arial, 0.3,0.01,0.2,0,0.15,8);
banner2.setColour(0,255,0);
banner2_id = boingo_world.addObject(banner2, wireframe);
}
boingo_world.prepNewObjects();
new_level = true;
new_level_frames = 0;
create_new_enemy = true;
total = 0;
hit = 0;
current_bullet = 5;
for (int i = 0;i < 5;i++) {
fired[i] = false;
boingo_world.setObjectPosition(bullets[i],0,0,-2);
}
}
void setup_score_display() {
renderfs wireframe = new renderfs();
for (int j = 0;j < 10;j++) {
for (int i = 0;i < 10;i++) {
boingo_world.translateObjectWorld(energy[i],0.1,0,0);
}
for (int i = 0;i < 6;i++) {
boingo_world.translateObjectWorld(bullets_display[i],-0.1,0,0);
}
boingo_world.redraw();
}
for (int j=0;j < 10;j++) {
boingo_world.translateObjectWorld(base_id,0,-0.1,0);
boingo_world.redraw();
}
int fr = 0;
for (int j = 0;j < 20;j++) {
boingo_world.translateObjectWorld(score_id,0.035,-0.04,-0.2);
boingo_world.redraw();
}
text3d congrats = new text3d("Congratulations!", arial, 0.3,0.02,0.4,0,0.55,8);
int cid = boingo_world.addObject(congrats, wireframe);
text3d congrats2 = new text3d("You scored", arial, 0.35,0.02,0.4,0,0.15,8);
int cid2 = boingo_world.addObject(congrats2, wireframe);
boingo_world.prepNewObjects();
while (fr < 100) {
fr++;
boingo_world.redraw();
}
setup_title_page();
}
public boolean mouseUp(Event e, int x, int y) {
if (titlepage) {
setup_main_game();
displaylevelbanner(level, false);
} else {
if (current_bullet > 0) {
// find out which bullet we can fire next
int new_bullet = 0;
for (int i = 0;i < 5;i++) {
if ( ! fired[i]) new_bullet = i;
}
fired[new_bullet] = true;
x -= 160;
y -= 120;
double xt = x/160.0;
xt *= 1.9;
xvec[new_bullet] = xt / (16/bullet_speed);
double yt = y/120.0;
yt *= 1.4;
yvec[new_bullet] = -yt / (16/bullet_speed);
boingo_world.setObjectPosition(bullets[new_bullet],0,0,0);
current_bullet--;
}
}
return true;
}
}