### Lesson Notes 31

— golan @ 2:51 pm

While{} blocK:

```int a = 0;
int b = 1;
int sum = a+b;

while (sum < 10000) { // some boolean test!
println(sum);
a = b;
b = sum;
sum = a+b;
}
```

Trigger an event periodically:

```int poopPeriod = 3000;
int lastPoopTime = 0;

void setup(){
}

void draw(){
if ((millis() - lastPoopTime) >= poopPeriod) {
poop();
}
}

void poop(){
// only printed output for now; visuals are up to you
println("At " + millis() + ", I pooped");
lastPoopTime = millis();
}
```

Function that returns a value:

```void setup(){
float f = cos(4.0);
println("My Sum = " + mySum);
}

int addThreeInts (int a, int b, int c){
int sum = a + b + c;
return sum;
}
```

Interpolation (Blurred Integrator / "Zeno's Interpolation") to the Mouse

```float px = 0;
float py = 0;

void setup(){
size(400,400);
}

void draw(){
background(127);

float A = 0.95;
float B = 1.0-A;
px = A*px + B*mouseX;
py = A*py + B*mouseY;
ellipse (px,py, 30,30);
}
```

Damping a variable down to zero / Triggering an event sequence

```float py, px;
float vy, vx;
void setup(){
size(400,400);
initiateMovementSequence();
}

void draw(){
float grayColor = map(px, 0,width, 0,255);
background(grayColor);
py += vy;
px += vx;
vy *= 0.96;
vx *= 0.96;
ellipse(px,py, 30,30);
}

void mousePressed(){
// clicking resets the action
initiateMovementSequence();
}

void initiateMovementSequence(){
px = width/2;
py = height/2;
vx = random(-5,5);
vy = random(-5,5);
}
```

Simple Pong

```float px, py;
float vx, vy;
float diam = 80;

void setup(){
size(400,350);
px = width/2;
py = height/2;
vx = random(-10,10);
vy = random(-10,10);
}

void draw(){
background(127);
px += vx;
py += vy;
if ((px < (diam/2)) || (px > (width - diam/2))){
vx = -vx;
}
if ((py < (diam/2)) || (py > (height - diam/2))){
vy = -vy;
}

ellipse(px,py, 80,80);
}

void mousePressed(){
// clicking the mouse randomizes direction
vx = random(-10,10);
vy = random(-10,10);
}
```

Bounce-triggered Speech Synthesizer (just for yuks):

```import guru.ttslib.*; // gotta download and install that; don't forget.

float px, py;
float vx, vy;
float diam = 40;
int myLetterCount = 0;

void setup() {
size(400,400);
px = width/2;
py = height/2;
vx = random(-2,2);
vy = random(-2,2);
}

void exit(){
}

void draw(){
background(127);
px += vx;
py += vy;

boolean didBounce = false;
if ((px < (diam/2)) || (px > (width - diam/2))){
vx = -vx;
didBounce = true;
}
if ((py < (diam/2)) || (py > (height - diam/2))){
vy = -vy;
didBounce = true;
}

if (didBounce){
char myChar = (char)(myLetterCount + 'a');
String myString = "" + myChar;
myLetterCount = (myLetterCount + 1)%26; // 0..25
}

ellipse(px,py, diam,diam);
}

//========================================================================

// From Dan Shiffman's Tutorial.
private boolean running;             // Is the thread running?  Yes or no?
private int toWait;                // How many milliseconds should we wait in between executions?
private String id;                 // Thread name
private int count;                 // counter
TTS tts;
String sayString =  "";
boolean freshMeat;

// Constructor, create the thread. It is not running by default
toWait = 3;
running = false;
freshMeat = false;
count = 0;
tts = new TTS();
}

public void speak(String toSay){
sayString = toSay;
freshMeat = true;
}

public void start () {
running = true;
println ("Starting");
super.start();
}

public void run () {
while (running){
count++;
if (freshMeat){
tts.speak(sayString);
freshMeat = false;
}
try {
sleep((long)(toWait));
}
catch (Exception e) {
}
}
println(id + " thread is done!");  // The thread is done when we get to the end of run()
}

public void quit(){
running = false;  // Setting running to false ends the loop in run()
interrupt(); // in case the thread is waiting. . .
}
}
```