//Title: boingo2.java //Version: //Copyright: Copyright (c) 2001 //Author: SyGem Software import java.awt.*; import java.applet.*; import com.sygem.jazz3d3.*; import com.sygem.jazz3d3.primitive.*; public class boingo2 extends Applet implements Runnable { Thread m_ce; World boingoWorld; 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 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 boingo2() { } //Initialize the applet public void init() { resize(320,240); boingoWorld = new World(this); setLayout(new BorderLayout()); add("Center", boingoWorld); 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); } Light temp_light = new Light(0,0,1); Light temp_light2 = new Light(0,-1,0); light1 = boingoWorld.addLight(temp_light); light1 = boingoWorld.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() { boingoWorld.prep(); boingoWorld.prepareCanvas(); boingoWorld.drawImage(); Graphics g = boingoWorld.getCanvas(); g.setColor(new Color(255,0,0)); g.drawString("Initializing game...",20,80); boingoWorld.finishCanvas(); arial = new Font3d("fonts/20thCenturyFont.f3d"); setup_title_page(); while (true) { if (game_over) { setup_score_display(); } if (titlepage) { title_page_animate(); } if (main_game && ! game_over) { main_game_loop(); } boingoWorld.redraw(); } } void setup_title_page() { boingoWorld.suspend(); titlepage = true; main_game = false; game_over = false; RenderSolid rsolid = new RenderSolid(); rsolid.setDrawingMode(Render.GOURAUD); boingoWorld.deleteAllObjects(); Text3d title_page = new Text3d("Boingo2!", arial, 0.5, 0.1, 0.1, -0.2, 0.55, 8); title_page.rotateLocal(0,0,13); title_page.setColour(255,0,0); title_page.setRenderer(rsolid); pid = boingoWorld.addObject(title_page); 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); title_boing.setRenderer(rsolid); pid2 = boingoWorld.addObject(title_boing); 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); title_boing2.setRenderer(rsolid); pid3 = boingoWorld.addObject(title_boing2); 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); title_boing3.setRenderer(rsolid); pid4 = boingoWorld.addObject(title_boing3); boingoWorld.prep(); boingoWorld.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; boingoWorld.getObject(pid).rotateLocal(0,4,0); boingoWorld.getObject(pid2).rotateLocal(1.1,3.5,2.05); boingoWorld.getObject(pid2).setPosition(0.4,bounce[step]-0.6,7.5); boingoWorld.getObject(pid3).rotateLocal(0.1,3,0.05); boingoWorld.getObject(pid3).setPosition(0,(bounce[step2]*0.9)-0.6,8); boingoWorld.getObject(pid4).rotateLocal(5.03,1.8,2.95); boingoWorld.getObject(pid4).setPosition(-0.5,(bounce[step3]*0.8)-0.6,8.5); } void setup_main_game() { boingoWorld.suspend(); posx = posy = posz = 0; boingoWorld.deleteAllObjects(); Checkerboard3d base = new Checkerboard3d(5,20,0,-0.1,11); base.scaleObject(0.5,20,1); base.rotateLocal(90,0,0); RenderSolid rsolid = new RenderSolid(); rsolid.setDrawingMode(Render.GOURAUD); base.setRenderer(rsolid); base_id = boingoWorld.addObject(base); Sphere3d enemy = new Sphere3d(10,10,0,0,0); enemy.scaleObject(0.1,0.1,0.1); enemy.setColour(255,0,255); enemy.setRenderer(rsolid); enemy_id = boingoWorld.addObject(enemy); 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); new_sphere.setRenderer(rsolid); bullets[i] = boingoWorld.addObject(new_sphere); } 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); new_cube.setRenderer(rsolid); energy[i] = boingoWorld.addObject(new_cube); } Text3d zero = new Text3d("0", arial, 0.5, 0.1, 0.1, -0.8, 0.35, 8); zero.setRenderer(rsolid); Text3d one = new Text3d("1", arial, 0.5, 0.1, 0.1, -0.8, 0.35, 8); one.setRenderer(rsolid); Text3d two = new Text3d("2", arial, 0.5, 0.1, 0.1, -0.8, 0.35, 8); two.setRenderer(rsolid); Text3d three = new Text3d("3", arial, 0.5, 0.1, 0.1, -0.8, 0.35, 8); three.setRenderer(rsolid); Text3d four = new Text3d("4", arial, 0.5, 0.1, 0.1, -0.8, 0.35, 8); four.setRenderer(rsolid); Text3d five = new Text3d("5", arial, 0.5, 0.1, 0.1, -0.8, 0.35, 8); five.setRenderer(rsolid); bullets_display[0] = boingoWorld.addObject(zero); bullets_display[1] = boingoWorld.addObject(one); bullets_display[2] = boingoWorld.addObject(two); bullets_display[3] = boingoWorld.addObject(three); bullets_display[4] = boingoWorld.addObject(four); bullets_display[5] = boingoWorld.addObject(five); for (int i = 0;i < 5;i++) { boingoWorld.getObject(bullets_display[i]).setVisible(false); } //enemy_id = boingoWorld.addObject(enemy,wireframe); Text3d score_display = new Text3d("0", arial, 0.3,0.01,0.2,0.6,0.6,8); score_display.setColour(0,255,255); score_display.setRenderer(rsolid); score_id = boingoWorld.addObject(score_display); boingoWorld.prepNewObjects(); boingoWorld.resume(); titlepage = false; main_game = true; game_over = false; game_completed = false; } void main_game_loop() { for (int i = 0;i < 10;i++) { boingoWorld.getObject(energy[i]).rotateLocal(1,2,3); } if (new_level) { new_level_frames++; if (new_level_frames > 50) { new_level = false; boingoWorld.deleteObject(banner_id); boingoWorld.deleteObject(banner2_id); boingoWorld.getObject(score_id).setVisible(true); } return; } if (animate_hit) { boingoWorld.getObject(hit_id).translateWorld(0,0,0.3); if (boingoWorld.getObject(hit_id).getCenter().getZ() > 6) { animate_hit = false; animate_hit2 = true; } return; } if (animate_hit2) { boingoWorld.getObject(hit_id).translateWorld(0,0.3,0); if (boingoWorld.getObject(hit_id).getCenter().getY() > 2) { animate_hit = false; animate_hit2 = false; boingoWorld.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; boingoWorld.getObject(enemy_id).setPosition(posx,posy,posz); create_new_enemy = false; total++; } b_step += 2; 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 { boingoWorld.getObject(energy[energy_level]).setColour(255,0,0); } } boingoWorld.getObject(enemy_id).setPosition(posx,posy,posz); for (int i = 0;i < 10;i++) { boingoWorld.getObject(energy[i]).rotateLocal(1,2,3); } for (int i = 0;i < 6;i++) { boingoWorld.getObject(bullets_display[i]).setVisible(false); } boingoWorld.getObject(bullets_display[current_bullet]).setVisible(true); for (int i = 0;i < 5;i++) { if (fired[i]) { if (boingoWorld.testCollision(enemy_id,bullets[i])) { score += (posz*level); hit++; fired[i] = false; current_bullet++; boingoWorld.getObject(bullets[i]).setPosition(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... RenderSolid rsolid = new RenderSolid(); rsolid.setDrawingMode(Render.GOURAUD); boingoWorld.deleteObject(score_id); Text3d score_display = new Text3d(""+score, arial, 0.3,0.01,0.2,0.6,0.6,8); score_display.setColour(0,255,255); score_display.setRenderer(rsolid); score_id = boingoWorld.addObject(score_display); Text3d hit_display = new Text3d("Hit!", arial, 0.2, 0.02, 0.1,0,0.4,2); hit_display.setColour(255,0,255); hit_display.setRenderer(rsolid); hit_id = boingoWorld.addObject(hit_display); boingoWorld.prepNewObjects(); animate_hit = true; } else { if (boingoWorld.getObject(bullets[i]).getCenter().getZ() > 16) { fired[i] = false; current_bullet++; boingoWorld.getObject(bullets[i]).setPosition(0,0,-2); } else { boingoWorld.getObject(bullets[i]).translateWorld(xvec[i],yvec[i],bullet_speed); } } } } if (total > 10) { level++; speed += 0.05; bullet_speed += 0.05; boingoWorld.getObject(enemy_id).scaleObject(0.8,0.8,0.8); boingoWorld.getObject(enemy_id).setPosition(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) { boingoWorld.getObject(score_id).setVisible(false); RenderSolid rsolid = new RenderSolid(); rsolid.setDrawingMode(Render.GOURAUD); Text3d banner = new Text3d("Level "+id, arial, 0.5,0.01,0.2,0,0.65,12); banner.setColour(255,255,0); banner.setRenderer(rsolid); banner_id = boingoWorld.addObject(banner); if (t) { Text3d banner2 = new Text3d("Perfect!", arial, 0.3,0.01,0.2,0,0.25,12); banner2.setColour(0,255,0); banner2.setRenderer(rsolid); banner2_id = boingoWorld.addObject(banner2); } boingoWorld.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; boingoWorld.getObject(bullets[i]).setPosition(0,0,-2); } } void setup_score_display() { RenderSolid rsolid = new RenderSolid(); rsolid.setDrawingMode(Render.GOURAUD); for (int j = 0;j < 10;j++) { for (int i = 0;i < 10;i++) { boingoWorld.getObject(energy[i]).translateWorld(0.1,0,0); } for (int i = 0;i < 6;i++) { boingoWorld.getObject(bullets_display[i]).translateWorld(-0.1,0,0); } boingoWorld.redraw(); } for (int j=0;j<10;j++) { boingoWorld.getObject(base_id).translateWorld(0,-0.1,0); boingoWorld.redraw(); } int fr = 0; for (int j = 0;j<20;j++) { boingoWorld.getObject(score_id).translateWorld(-0.03,-0.035,-0.2); boingoWorld.redraw(); } Text3d congrats = new Text3d("Congratulations!", arial, 0.4,0.02,0.4,0,0.6,12); congrats.setRenderer(rsolid); int cid = boingoWorld.addObject(congrats); Text3d congrats2 = new Text3d("You scored", arial, 0.4,0.02,0.4,0,0.3,12); congrats2.setRenderer(rsolid); int cid2 = boingoWorld.addObject(congrats2); boingoWorld.prepNewObjects(); while (fr < 100) { fr++; boingoWorld.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); boingoWorld.getObject(bullets[new_bullet]).setPosition(0,0,0); current_bullet--; } } return true; } }