// c0.pde

//// c0.pde (copy of d9_modular)
String title= "c0.pde:  Dynamic sketch (d9_modular).";
String hint="Click to reset creature.\n 'q' to quit.";
String author="B.A.Martin";
color RED=color(255,0,0), YELLOW=color(255,255,0), 
  BLUE=color(0,0,255), SKY=color(150,200,250);

// GLOBAL DECLARATIONS //
float sunX, sunY;        // Position of sun
float fredx, fredy;      // Position & speed
float freddx, freddy;

//// SETUP:  Define screen size, set modes.
void setup() {
  size( 600, 400 );
  sunX=  width/2;         // Start sun half-way 
  sunY=  50;
  reset();
}
void reset() {
  fredx=  width/2;            // Start in center.
  fredy=  height/2;
  freddx=  random( 1,3 );     // Random speed.
  freddy=  random( -1, +1 );
}



 
//// DRAW:  sky & sun plus creature
void draw()
{
  scene();
  action();
  show();
  messages();      // (Display the messages last.)
}

//// SCENE:  sky, sun, house.
void scene() {
  background( SKY );                // Blue sky
  fill( YELLOW );
  ellipse( sunX, sunY, 30, 30 );    // Yellow sun 
  fill( RED );
  rect( 100,100, 120,50 );     // House at (100,100)
  triangle( 100,100, 220,100, 160,50 );
}




//// ACTION:  
void action() {
  if (sunX > width) {
    sunX=  0;
    sunY=  random( 20, 120 );
    background(YELLOW);
  }
  sunX=  sunX + 1;
  // Move the creature.
  fredx=  fredx + freddx;
  fredy=  fredy + freddy;
  if (fredx>width) reset();
}

//// SHOW:  creature
void show() {
  // Draw creature.
  fill( 0, 0, 200 );
  rect( fredx,fredy, 50,80 );            // Blue body
  ellipse( fredx+25,fredy-20, 40,40 );   // Head on top
  // Eyes.
  fill( 255 );
  ellipse( fredx+15, fredy-25, 12, 12 );
  ellipse( fredx+35, fredy-25, 12, 12 );
  fill( 0, 150, 0 );
  ellipse( fredx+15, fredy-25, 4, 4 );
  ellipse( fredx+35, fredy-25, 4, 4 );
} 

//// MESSAGES.
void messages() {
  fill(0);
  text( title, width/3, 10 );
  text( hint, 10, height/2 );
  text( "B.A.Martin", 10, height-10 );
}

//// EVENT HANDLERS ////
void mousePressed() {
  reset();
  // Set the position (x,y)
  fredx=  mouseX;
  fredy=  mouseY;
}
void keyPressed() {
  if (key == 'q') { exit(); }
  if (key == 'r') { reset(); }
  if (key == 's') { sunY += 50;  }
}







// c1.pde

//// c1.pde:   Object-Based revision of c0.pde
String title=  "c1.pde:  Object-Based version of c0.pde sketch";
String hint="Click to reset creature.\n 'q' to quit.";
String author="B.A.Martin";
color RED=color(255,0,0), YELLOW=color(255,255,0), 
  BLUE=color(0,0,255), SKY=color(150,220,250);

// GLOBAL DECLARATIONS (Object-Based) //	
Sun sol = new Sun();
Creature fred = new Creature();	


//// SETUP:  Define screen size, set modes.
void setup() {
  size( 600, 400 );
  sunReset();
  fredReset();
}
void sunReset() {
  sol.x = width/2;         // Start the sun half-way across the screen.
  sol.y = 50;
}
void fredReset() {
  fred.x = width/2;            // Start in center.
  fred.y = height/2;
  fred.dx = random( 1, 3 );     // Random speed.
  fred.dy = random( -1, +1 );
} 
 
//// DRAW:  sky & sun plus creature
void draw()
{
  scene();
  action();
  show();
  messages();            // (Display the messages last.)
}

//// SCENE:  sky, sun, house.
void scene() {
  background( SKY );                 // Blue sky 
  sol.show();                        // Yellow sun
  house( 100, 100 );                 // house at 100,100
}
void house( float x, float y ) {
  float w=120, h=50;                 // Size of house
  fill( RED );
  rect( x, y, w, h );                // Red house at (x,y)
  triangle( x,y, x+w,y, x+w/2,y-50 );
}

//// ACTION:  sun moves (then resets to random height)
void action() {
  sol.move();
  fred.move();
  if (fred.x>width) { fredReset(); background(0); }
}

//// SHOW:  creature 
void show() {
  fred.show();
}



//// MESSAGES.
void messages() {
  fill(0);
  text( title, width/3, 10 );
  text( hint, 10, height/2 );
  text( "B.A.Martin", 10, height-10 );
}

//// EVENT HANDLERS ////
void mousePressed() {
  // Set the position (x,y)
  fred.x=  mouseX;
  fred.y=  mouseY;
}
void keyPressed() {
  if (key == 'q') { exit(); }
  if (key == 'r') { fredReset(); sunReset(); }
  if (key == 's') { sol.y += 50; }
}



class Sun {
  float x, y;      // Position 
  float dx=1;
  // METHODS //
  void show() {
    fill( YELLOW );
    ellipse( x, y, 30, 30 );        // Yellow sun
  }
  void move() {
    x += dx;
    if (x > width) { x=random(20,120 ); background(YELLOW); }
  }
} 
class Creature {
  float x, y;              // Position & speed 
  float dx, dy;
  // Move the creature.
  void move() {
    x=  x + dx;
    y=  y + dy;
  }
  void show() {
    // Draw creature.
    fill( BLUE );
    rect( x, y, 50, 80 );                // Blue creature
    ellipse( x+25, y-20, 40, 40 );       // Head on top
    // Eyes.
    eye( x+15, y-25 );
    eye( x+35, y-25 );
  }
  void eye( float eyeX, float eyeY ) {
    fill( 255 );
    ellipse( eyeX, eyeY, 12, 12 );
    fill( 0, 150, 0 );
    ellipse( eyeX, eyeY, 4, 4 );
  }
}