//pretty colour crackdown int RESET_TIME = 30 * 30; int framesTilFree = 0; HashSet invaders = new HashSet(); HashSet deadvaders = new HashSet(); HashSet bullets = new HashSet(); void setup(){ size(500,500); frameRate(30); resetgame(); } void resetgame(){ for(int i = 0;i < 500; i++){ invaders.add(new Invader(random(width),random(height), color(random(255),random(255),random(255)),random(width/100,width/33),random(width/500,width/125),random(.05,.1))); } } void keyPressed(){ if(key == ' '){ for(int i = 0;i < 100; i++){ invaders.add(new Invader(random(width),random(height), color(random(255),random(255),random(255)),random(width/100,width/33),random(width/500,width/125),random(.05,.1))); } } } void draw(){ background(50); framesTilFree++; if(frameCount % 3 == 0){ if(mousePressed){bullets.add(new Bullet());} } Iterator it = invaders.iterator(); while(it.hasNext()){ Invader i = (Invader)it.next(); i.move(); i.draw(); } Iterator bi = bullets.iterator(); while(bi.hasNext()){ Bullet b = (Bullet)bi.next(); boolean killb = false; it = invaders.iterator(); while(it.hasNext()){ Invader i = (Invader)it.next(); if( sqrt( pow(i.x -b.x,2) + pow(i.y -b.y,2) ) < (b.SIZE+i.SIZE)/2){ it.remove(); i.hit(b); deadvaders.add(i); killb = true; } } if(b.move()) killb = true; b.draw(); if(killb) bi.remove(); } Iterator di = deadvaders.iterator(); while(di.hasNext()){ Invader d = (Invader)di.next(); if(d.fall()) di.remove(); d.draw(); } } void mouseMoved(){ Iterator it = invaders.iterator(); while(it.hasNext()){ Invader i = (Invader)it.next(); i.tx = mouseX; i.ty = mouseY; } framesTilFree = 0; } class Bullet{ float x,y; float SIZE = width/25; float SPEED = width/50; Bullet() { x = mouseX; y = height + SIZE; } boolean move(){ y -= SPEED; if(y < -SIZE*2){ return true; } return false; } void draw(){ fill(random(255)); pushMatrix(); translate(x,y); rect(-SIZE/4,-SIZE/4,SIZE/2,SIZE/2); popMatrix(); } } class Invader{ float x,y; float angle; float SIZE = 20; float tx,ty; float SPEED = 2; float TURNSPEED = .1; float startx,starty; float xs,ys; color c = color(0,250,0); Invader(float x,float y, color c, float SIZE,float SPEED,float TURNSPEED){ this.x = x; this.y = y; this.tx = x; this.ty = y; this.c = c; this.SIZE = SIZE; this.SPEED = SPEED; this.TURNSPEED = TURNSPEED; this.startx = x; this.starty = y; } boolean dead = false; boolean fall(){ ys += .1; y += ys; x += xs; if(y > height + SIZE){ return true; } return false; } void hit(Bullet b){ xs = SPEED*cos(angle) ; ys = sin(angle) - 1; dead = true; } void draw(){ noStroke(); if(dead) fill (100); else fill(c); pushMatrix(); translate(x,y); rotate(angle); // rotate(PI); //rotate(PI/2); rect(-SIZE/2,-SIZE/2,SIZE,SIZE); //fill(0,0,255); pushMatrix(); rotate(-PI/4); translate(0,SIZE/4); rect(-SIZE/8,-SIZE/4,SIZE/4,SIZE); popMatrix(); pushMatrix(); rotate(-PI*3/4); translate(0,SIZE/4); rect(-SIZE/8,-SIZE/4,SIZE/4,SIZE); popMatrix(); //eyes if(! dead){ fill(0); pushMatrix(); translate(-SIZE/8,-SIZE/4); rect(-SIZE/8,-SIZE/8,SIZE/4,SIZE/4); popMatrix(); pushMatrix(); translate(-SIZE/8,SIZE/4); rect(-SIZE/8,-SIZE/8,SIZE/4,SIZE/4); popMatrix(); } else { fill(0); stroke(0); strokeWeight(2); pushMatrix(); translate(-SIZE/8,-SIZE/4); line(-SIZE/6,-SIZE/6,SIZE/6,SIZE/6); line(-SIZE/6,SIZE/6,SIZE/6,-SIZE/6); popMatrix(); pushMatrix(); translate(-SIZE/8,SIZE/4); line(-SIZE/6,-SIZE/6,SIZE/6,SIZE/6); line(-SIZE/6,SIZE/6,SIZE/6,-SIZE/6); popMatrix(); } popMatrix(); } //float anglespeed = 0; void move(){ if( framesTilFree > RESET_TIME){ tx = startx; ty = starty; } float dx = (tx -x); float dy = ( ty - 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; } if(anglediff > 0){ // println(" <-\\"); angle -= TURNSPEED; } else { // println(" /->"); angle += TURNSPEED; } float angcos= cos(angle); float angsin = sin(angle); x += angcos* SPEED; y += angsin * SPEED; } }