import ddf.minim.spi.*; import ddf.minim.signals.*; import ddf.minim.*; import ddf.minim.analysis.*; import ddf.minim.ugens.*; import ddf.minim.effects.*; float virtualscreenwidth; float virtualscreenleft; float virtualscreenright; ArrayList chasers; player p; int planeslost; String grade; void killplayer() { p = new player(); planeslost++; playerdelay = (int)frameRate; if ( planeslost >= 1 && planeslost <= 2) { grade = "AAA"; } if ( planeslost >= 3&& planeslost <= 4) { grade = "AA"; } if ( planeslost >= 5 && planeslost <= 7) { grade = "A"; } if ( planeslost >= 8 && planeslost <= 9) { grade = "B"; } if ( planeslost >= 10 && planeslost <= 11) { grade = "C"; } if ( planeslost >= 12 && planeslost <= 14) { grade = "D"; } if ( planeslost >= 15) { grade = "F"; } } AudioSnippet boom; void goboom() { boom.rewind(); boom.play(); } Minim m; void setup() { size(500, 500); m = new Minim(this); boom = m.loadSnippet("BOOM2.WAV"); frameRate(30); ellipseMode(CENTER); textFont(loadFont("Arial-BoldMT-20.vlw")); virtualscreenwidth = width+50; virtualscreenleft = (width - virtualscreenwidth)/2; virtualscreenright = width - virtualscreenleft; gamemode = BEFORE; gamediff = DIFFNORMAL; startgame(); } void stop() { boom.close(); m.stop(); super.stop(); } int gamemode; int gamediff; int BEFORE = 1; int DURING = 2; int AFTER = 3; int DIFFNORMAL =1; int DIFFHARD = 2; void keyPressed() { if (key=='n' || key == 'N') { gamediff = DIFFNORMAL; gamemode = DURING; startgame(); } if (key=='d' || key == 'D') { gamediff = DIFFHARD; gamemode = DURING; startgame(); } if (key=='q' || key=='Q') { //chasers.removeAll(); chasers = new ArrayList(); gamemode = AFTER; } } int launchdelay; void startgame() { p = new player(); chasers = new ArrayList(); for (int i = 0; i < 10; i++) { chaser c = new chaser(100+(i*35), gamediff); chasers.add(c); } explosions = new ArrayList(); launchdelay = (int)frameRate ; planeslost = 0; grade="S"; } ArrayList explosions; int playerdelay; float groundheight = 100; void draw() { background(200, 200, 255); if (playerdelay < 0) { launchdelay--; if (launchdelay == 0) { launch(); // launchdelay = (int)frameRate ; } } else { playerdelay--; } noStroke(); fill(128, 255, 128); rect(0, height-groundheight, width, groundheight); if (gamemode != BEFORE && playerdelay < 0) { if (keyPressed == true) { if (key == 'a' || key == 'A') { p.turn(-1.0); } if (key == 'z' || key == 'Z') { p.turn(1.0); } } } p.move(); p.draw(); ArrayList tokill = new ArrayList(); for (chaser c : chasers) { c.move(); c.draw(); //p.hit(c); for (chaser d : chasers) { if (c != d && c.hit(d)) { tokill.add(c); tokill.add(d); } } if (c.hitground()) { tokill.add(c); } if (c.hit(p)) { tokill.add(c); killplayer(); } } for (chaser c : tokill) { if (chasers.contains(c)) { chasers.remove(c); if (chasers.size() == 0) { gamemode = AFTER; } explosions.add(new explosion(c.x, c.y)); goboom(); } if (c.active) { launchdelay =(int)frameRate; } } ArrayList doneExplosions = new ArrayList(); for (explosion e : explosions) { e.draw(); if (e.done()) { doneExplosions.add(e); } } explosions.removeAll(doneExplosions); if (p.hitground()) { explosions.add(new explosion(p.x, p.y)); goboom(); killplayer(); } if (gamemode != DURING) { drawText(); } } float red = 0; void drawText() { red -= 20; if (red < 0) red = 250; fill(red, 0, 0); text("H E A T S E E K E R", 40, 80); if (gamemode == AFTER) { text("RANK:"+grade, 360, 190); } fill(0); text("(based on a game by jeff wolverton in", 140, 100); text(" compute!'s gazette, march 1985)", 140, 120); if (gamemode == BEFORE) { text("welcome to the proving grounds", 40, 160); } else { text("10 missiles destroyed. "+planeslost+" planes lost", 40, 160); } text("A climbs, Z descends", 140, 220); text("press:", 200, 300); text("N for normal", 200, 330); text("D for difficult", 200, 360); } void launch() { boolean launched = false; for(chaser c : chasers){ if ((! launched) && (! c.killed) && (! c.active)) { c.active = true; launched = true; } } } class chaser extends rotater{ float mysize=20; float turnspeed; chaser(float pos, int diff){ x = pos; y = height - groundheight - (mysize/2.0); if(diff == DIFFNORMAL){ speed = 8; turnspeed = .09; } else { speed = 9; turnspeed = .1; } angle = -PI/2; calcangles(); ima="chaser"; } void draw(){ stroke(0); // noFill(); // ellipse(x,y,20,20); pushMatrix(); translate(x,y); rotate(angle); fill(128,0,0); triangle(10,0,-8,-2,-8,2); popMatrix(); } boolean killed = false; boolean active = false; void move(){ if(active && (!killed)){ float mentalchaserx = x; float mentalplanex = p.x; /* if(mentalchaserx < 0) mentalchaserx += virtualscreenwidth; if(mentalplanex < 0) mentalplanex += virtualscreenwidth; if(mentalchaserx > width) mentalchaserx -= virtualscreenwidth; if(mentalplanex > width) mentalplanex -= virtualscreenwidth; */ float dx = (mentalplanex -mentalchaserx); if(abs(dx) > width/2){ dx *= -1.0; } float dy = ( p.y - y); float wantangle = atan2(dy, dx); float anglediff = (angle - wantangle); anglediff /= PI; //this next bit catches the "runaround" if(anglediff > 1){ anglediff -= 2; } if(anglediff < -1){ anglediff += 2; } //print("wantangle:"+(wantangle/PI)+" angle "+(angle/PI)+" diff: "+ (anglediff)+" "); if(anglediff > 0){ // println(" <-\\"); angle -= turnspeed; } else { // println(" /->"); angle += turnspeed; } //stroke(255,0,0); //line(250,250,250+(cos(wantangle) * 30), 250+(sin(wantangle)*30)); // line(250,250,245,245); // line(250,250,255,255); //angle += turnspeed; calcangles(); super.move(); } } } class explosion{ float x,y,power; explosion(float px, float py){ x = px; y = py; power = 255; } void draw(){ fill(255,230,200,power); noStroke(); ellipse(x,y,20,20); power -= 20; } boolean done(){ if(power < 0){ return true; } return false; } } class player extends rotater{ player(){ x = width/20; y = height/2; speed = 8; calcangles(); ima="player"; } void draw(){ // noFill(); stroke(0); // ellipse(x,y,20,20); pushMatrix(); translate(x,y); rotate(angle); fill(128); triangle(-5,-8,-8,2,13,2); triangle(4,0,-4,0,-4,8); popMatrix(); } void move(){ if( playerdelay < 0){ super.move(); } } /* void move(){ x = mouseX; y = mouseY; } */ } class rotater { String ima; void turn(float dir){ angle += (.15 * dir); calcangles(); } void calcangles(){ angcos= cos(angle); angsin = sin(angle); } float x,y,angle,angcos,angsin, speed; boolean hit(rotater r){ float dist = sqrt(pow(x-r.x,2) + pow(y-r.y,2)); if(dist < 20){ return true; } return false; } boolean hitground(){ if(y > (height - groundheight - 10)) { return true; } return false; } void move(){ x += angcos* speed; y += angsin * speed; if(x < virtualscreenleft){ x += virtualscreenwidth; } if(x > virtualscreenright){ x -= virtualscreenwidth; } } }