// OOP EXample: Robots is a visual robot that moves forward facing
// the directions dictated by its theta. When it runs into a wall
// it turns right
class Robot {
// Attributes
float x, y; // location
float sz; // size
float theta; // direction.orientation
float speed = 1;
// Constructor(s)
Robot (float s) {
float[] dir = {0, 90, 180, 270};
theta = dir[int(random(4))];
sz = s;
x = random(2*sz, width-2*sz);
y = random(2*sz, height-2*sz);
} // Robot()
void display() {
// Display the robot
push();
translate(x, y);
rotate(radians(theta));
rectMode(CENTER);
fill(255, 126, 126);
rect(0, 0, sz, sz);
fill(0);
// eyes
circle(sz/2, -sz/5, sz/10);
circle(sz/2, sz/5, sz/10);
line(0, 0, sz/2, 0); // rib
// tail
line(-sz/2, 0, -sz/2-10, -5);
line(-sz/2, 0, -sz/2-10, 5);
pop();
} // display()
void move() {
push();
translate(x, y);
rotate(radians(theta));
// Move the robot at speed in the direction it is headed, based on theta
if (theta == 90) {
y = y + speed;
}
else if (theta == 180) {
x = x - speed;
}
else if (theta == 270) {
y = y - speed;
}
else {
x = x + speed;
}
// Check which wall it is colliding against and turn right
if ((theta == 90) && (distance(x, y, x, height) < sz)) {
turnRight(90);
}
else if ((theta == 180) && (distance(x, y, 0, y) < sz)) {
turnRight(90);
}
else if ((theta == 270) && (distance(x, y, x, 0) < sz)) {
turnRight(90);
}
else if ((theta == 0) && (distance(x, y, width, y) < sz)) {
turnRight(90);
}
pop();
}
void turnLeft(float deg) {
theta = (theta - deg) % 360;
}
void turnRight(float deg) {
theta = (theta + deg)%360;
}
float distance(float x1, float y1, float x2, float y2) {
return sqrt(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2)));
} // distance()
String toString() {
return "<Robot of size " + sz + " at <"+x+","+y+"> facing "+theta+" degrees>";
} // toString()
} // class Robot