//
/* 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.setAction(k - 'A');
else if (k >= 'a' && k <= 'z')
polly2.setAction(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();
polly1 = new Polly();
polly1.setSize(.9);
polly1.setPosition(1,0);
polly1.setColor(1,0,0);
world.add(polly1);
polly2 = new Polly();
polly2.setSize(.6);
polly2.setPosition(-1,0);
polly2.setColor(1,.5,.5);
world.add(polly2);
}
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);
}
}