PImage b; Object world[][] = new Object[30][30]; class Wall{ } Wall wall = new Wall(); class Empty{ } Empty empty = new Empty();; Player p; HashSet monsters = new HashSet(); HashSet bullets = new HashSet(); void setup(){ size(480,480); for(int x = 0; x < 30; x++){ for(int y = 0; y < 30; y++){ world[x][y] = empty; } } p = new Player(); loadguys(); for(int i = 0; i < 20; i++){ monsters.add(new Monster()); } } void draw(){ frameRate(60); background(0); noStroke(); Iterator i = bullets.iterator(); while(i.hasNext()){ Bullet b = (Bullet) i.next(); if(b.hit()){ i.remove(); } b.move(); b.draw(); } if(frameCount % 10 == 0){ p.move(); } p.draw(); i = monsters.iterator(); while(i.hasNext()){ Monster m = (Monster) i.next(); m.wait--; if(m.wait <= 0){ m.wait = monsters.size(); m.move(); } m.draw(); } } HashMap guyart = new HashMap(); void loadguys(){ loadguy("L"); loadguy("R"); loadguy("U"); loadguy("D"); } class Bullet{ int x,y; String dir; Bullet(int px,int py,String pdir){ x = px; y = py; dir = pdir; } void draw(){ stroke(255); strokeWeight(1); if(dir.equals("U") || dir.equals("D")){ line(16*x +4,16*y,16*x +4,16*(y+1)); line(16*x +5,16*y,16*x +5,16*(y+1)); } else { line(16*x ,16*y+4,16*(x+1) ,16*y+4); line(16*x ,16*y+5,16*(x+1) ,16*y+5); } } void move(){ moveTo(newXFromDir(x,y,dir),newYFromDir(x,y,dir)); } void moveTo(int newx, int newy){ x = newx; y = newy; } boolean hit(){ Object what = whatsInWorld(x,y); if(what == wall){ return true; } if(what instanceof Monster){ monsters.remove(what); world[x][y] = empty; return true; } return false; } } class Guy{ int x, y; String dir = "R"; String frame; String type; void randomizeDir(){ int r = int(random(4)); switch(r){ case 0: dir = "R"; break; case 3: dir = "L"; break; case 2: dir = "D"; break; case 1: dir = "U"; break; } } Guy(){ if(random(1)< .5){ frame = "1"; } else { frame = "2"; } randomizeDir(); x = int(random(0,30)); y = int(random(0,30)); while(!(empty.equals(world[x][y]))){ print("got "+world[x][y]); x = int(random(0,30)); y = int(random(0,30)); } } color c ; void draw(){ fill(c);noStroke(); drawguy(x,y,dir,frame); } void advanceFrame(){ if("1".equals(frame)){ frame = "2"; return; } if("2".equals(frame)) { frame = "1"; return; } } void animate(){ int newX = newXFromDir(x,y,dir); int newY = newYFromDir(x,y,dir); if(empty.equals(whatsInWorld(newX,newY))){ world[x][y] = empty; x = newX; y = newY; world[x][y] = this; } } } int newXFromDir(int x, int y, String dir){ if("L".equals(dir)){ return x-1; } if("R".equals(dir)){ return x+1; } return x; } int newYFromDir(int x, int y, String dir){ if("U".equals(dir)){ return y-1; } if("D".equals(dir)){ return y+1; } return y; } Object whatsInWorld(int x,int y){ if(x < 0 || x >= 30 || y < 0 || y >= 30){ return wall; } return world[x][y]; } class Monster extends Guy{ String type; int wait; Monster(){ super(); wait = monsters.size(); int r = int(random(3)); if(r == 0) { type="R"; c = color(255,0,0); } if(r == 1) {type="G";c = color(0,255,0); } if(r == 2) {type="B";c = color(0,0,255); } world[x][y] = type; } void move(){ if(random(10) < 3){ randomizeDir(); } advanceFrame(); animate(); } } class Player extends Guy{ Player(){ super(); type = "P"; c = color(150) ; world[x][y] = "P"; } void move(){ boolean ismoving = false; if(isKeyDown(32)){ Bullet b = new Bullet (newXFromDir(x,y,dir),newYFromDir(x,y,dir),dir); bullets.add(b); // println("bang"); } if(isKeyDown(37)){ dir="L"; ismoving = true; } if(isKeyDown(38)){ dir="U"; ismoving = true; } if(isKeyDown(39)){ dir="R"; ismoving = true; } if(isKeyDown(40)){ dir="D"; ismoving = true; } if(ismoving){ advanceFrame(); animate(); } } } void loadguy(String dir){ loadguy_helper(dir,"1"); loadguy_helper(dir,"2"); } void loadguy_helper(String dir, String frame){ PImage i = loadImage("red_"+dir+"_"+frame+".png"); guyart.put(dir+frame,i); } void drawguy(int x, int y, String dir, String frame){ rect(16*x,16*y,16,16); image((PImage)guyart.get(dir+frame),16*x,16*y); } HashSet keysDown = new HashSet(); void keyPressed(){ // println(this.keyEvent.getKeyCode()); this.keysDown.add(this.keyEvent.getKeyCode()); } void keyReleased(){ this.keysDown.remove(this.keyEvent.getKeyCode()); } boolean isKeyDown(int keyCode){ if(keysDown.contains(keyCode)) return true; return false; }