How would you add moons to the planets from Example 14-8? Hint: Write a Moon class that is virtually identical to the Planet. Then, incorporate a Moon variable into the Planet class. (In Chapter 22, we will see how this could be made more efficient with advanced OOP techniques.)
// Learning Processing
// Daniel Shiffman
// http://www.learningprocessing.com
// Exercise 14-10: How would you add moons to the planets? Hint: Write a Moon class that
// is virtually identical to the Planet. Then, incorporate a Moon variable into the Planet class.
// (In Chapter 22, we will see how this could be made more efficient with advanced OOP techniques.)
// An array of 4 planet objects
Planet[] planets = new Planet[3];
void setup() {
size(200,200);
smooth();
// The planet objects are initialized using the counter variable
for (int i = 0; i < planets.length; i++ ) {
planets[i] = new Planet(30 + i*25,12);
}
}
void draw() {
background(255);
// Drawing the Sun
pushMatrix();
translate(width/2,height/2);
stroke(0);
fill(255);
ellipse(0,0,20,20);
// Drawing all Planets
for (int i = 0; i < planets.length; i++ ) {
planets[i].update();
planets[i].display();
}
popMatrix();
}
// Learning Processing
// Daniel Shiffman
// http://www.learningprocessing.com
// Example 14-18: Object-oriented solar system
class Planet {
// Each planet object keeps track of its own angle of rotation.
float theta; // Rotation around sun
float diameter; // Size of planet
float distance; // Distance from sun
float orbitspeed; // Orbit speed
// Each Planet now has a Moon!
Moon moon;
Planet(float distance_, float diameter_) {
distance = distance_;
diameter = diameter_;
theta = 0;
orbitspeed = random(0.01,0.03);
// create the Moon 10 pixels from the planet with a diameter of 5
moon = new Moon(12,5);
}
void update() {
// Increment the angle to rotate
theta += orbitspeed;
// Update the moon
moon.update();
}
void display() {
// Before rotation and translation, the state of the matrix is saved with pushMatrix().
pushMatrix();
// Rotate orbit
rotate(theta);
// translate out distance
translate(distance,0);
stroke(0);
fill(175);
ellipse(0,0,diameter,diameter);
// The planet is drawn, now draw the moon
moon.display();
// Once the planet is drawn, the matrix is restored with popMatrix() so that the next planet is not affected.
popMatrix();
}
}
// Learning Processing
// Daniel Shiffman
// http://www.learningprocessing.com
// New Moon object (this could really just be a Planet or done with Inheritance (chapter 22))
class Moon {
// Each planet object keeps track of its own angle of rotation.
float theta; // Rotation around sun
float diameter; // Size of planet
float distance; // Distance from sun
float orbitspeed; // Orbit speed
Moon(float distance_, float diameter_) {
distance = distance_;
diameter = diameter_;
theta = 0;
orbitspeed = random(-0.1,0.1);
}
void update() {
// Increment the angle to rotate
theta += orbitspeed;
}
void display() {
// Before rotation and translation, the state of the matrix is saved with pushMatrix().
pushMatrix();
// Rotate orbit
rotate(theta);
// translate out distance
translate(distance,0);
stroke(0);
fill(175);
ellipse(0,0,diameter,diameter);
// Once the planet is drawn, the matrix is restored with popMatrix() so that the next planet is not affected.
popMatrix();
}
}








