//
/* There are walls, and Polly can't go through them */ import render.*; import java.awt.*; public class PollyWalls extends RenderApplet { Polly polly1, polly2; public boolean keyUp(Event e, int k) { // SET ACTIONS VIA KEYBOARD if (! super.keyUp(e, k)) key(k); return true; } public void key(int k) { if (k >= 'A' && k <= 'Z') polly1.action(k - 'A'); else if (k >= 'a' && k <= 'z') polly2.action(k - 'a'); } double w[][] = { // WALL DATA {5,3, -4,3, -2,-3, 2,-3, 3,0, 4,0, 5,3}, //{-1.5,1.5, -1.3,1}, //{1,.7, .7,-.3}, }; public void initialize() { // INITIALIZE EVERYTHING addLight(1,1,1, 1,1,1); // LIGHTS addLight(0,-1,0, 1,1,1); setBgColor(.2,.2,.8); // BACKGROUND COLOR setFL(12); // CAMERA FOCAL LENGTH push(); translate(-.5,0,0); rotateX(Math.PI/6); transform(world); // INITIAL VIEW ANGLE pop(); world.add().setMaterial( (new Material()).setColor(0,1,0).setTransparency(.5)); world.child[0].mesh(10, 10).setDoubleSided(true); push(); // MAKE THE TRANSPARENT FLOOR scale(6,1,4); rotateX(-Math.PI/2); transform(world.child[0]); pop(); Geometry walls = world.add().setMaterial( (new Material()).setColor(1,1,1).setTransparency(.5)); walls.setDoubleSided(true); Polly.clearWalls(); for (int i = 0 ; i < w.length ; i++) { Polly.addWall(w[i]); makeWall(walls, w[i]); } Polly.clearPollys(); world.add(polly1 = new Polly().setSize(.9).setPosition(1,0).setColor(1,0,0)); world.add(polly2 = new Polly().setSize(.6).setPosition(-1,0).setColor(1,.5,.5)); } void makeWall(Geometry g, double w[]) { for (int j = 0 ; j < w.length/2 - 1 ; j++) { double ax = w[2*j ], az = w[2*j+1], bx = w[2*j+2], bz = w[2*j+3]; push(); double dx = (bx-ax)/2, dz = (bz-az)/2; Geometry wall = g.add(); wall.mesh((int)Math.sqrt(dx*dx+dz*dz)+2, 2); translate((ax+bx)/2, .5, (az+bz)/2); rotateY(Math.atan2(-dz, dx)); scale(Math.sqrt(dx*dx + dz*dz), .5, 1); transform(wall); pop(); } } public void animate(double time) { // ANIMATE ONE FRAME polly1.animate(time); polly2.animate(time); } }