2b: OSC client & server


Hieronder de code uit de tweede les van 15 februari:

client

//client

//maak variabelen aan voor client en server
let client, server;

//maak array aan voor objecten
let explosions = [];

function setup() {
  createCanvas(800,600);
  background(255);

  //start de client, verstuur naar poort 9000
  client = new Client();
  client.startClient("127.0.0.1",9000);

  //start de server, luister op poort 9001
  server = new Server();
  server.startServer(9001);

  //als er data binnenkomt, stuur door naar de oscHandler-functie
  //adres (bijv /synth1) en waardes (bijv 40) gescheiden
  server.getMessage(function(addr,val){
    oscHandler(addr,val);
  });
}

function draw() {
  background(0);
  //voer functies uit class uit.
  for (let i = 0; i < explosions.length; i++) {
    explosions[i].explode();
    explosions[i].draw();
  }
}

function mousePressed() {
  //voeg explosie toe na muisklik
  //geef muispositie + indexnummer uit array mee.
  explosions.push(new Explosion(mouseX,mouseY,explosions.length));
}

//functie die binnenkomende osc-data verwerkt
function oscHandler(addr,val) {
  if (addr === "/water") {
    //als er data binnenkomt, voer de blus-functie uit
    //van het object met het indexnummer dat in 
    //val[2] wordt opgeslagen.
    explosions[val[2]].blus();
  }
}

class Explosion {
  constructor(x,y,i) {
    console.log(i);
    this.x = x; //x-positie
    this.y = y; //y-positie
    this.s = 0; //grootte
    this.c = 'orange'; //kleur
    this.sent = false; //bericht verzonden?
    this.explosionSpeed = random(2); //snelheid
    this.exploded = false; //geΓ«xplodeerd?
    this.dontdraw = false; //mag tekenen?
    this.i = i; //indexnummer in array;
  }
  explode() {
    //voeg snelheid toe aan grootte
    this.s+=this.explosionSpeed;

    //als groter dan 100 & nog niet verzonden:
    if (this.s > 100 && this.sent === false) {
      //verzend bericht naar server in andere sketch
      client.sendMessage("/boem",this.x,this.y,this.i);
      //zet variabele om zodat het niet nog eens gebeurt.
      this.sent = true;
    }
    //als groter dan 500 & nog niet gekrompen
    if (this.s > 500 && this.exploded === false) {
      //pas speed aan
      this.explosionSpeed = -10;
      //zet variabele om zodat het niet nog eens gebeurt
      this.exploded = true;
    }

    //als kleiner dan 0 en geexplodeerd is
    if (this.s < 0 && this.exploded === true) {
      //zet teken-variabele (zie draw-method in deze class) om
      this.dontdraw = true;
    }
  }
  draw() {
    //als dontdraw false is, dan mag er getekend worden
    if (this.dontdraw === false) {
      fill(this.c);
      ellipse(this.x,this.y,this.s);  
    }
  }
  blus() {
    //maak de kleur blauw
    this.c = 'blue';
  }
}

server

//server

//maak variabelen aan voor server en client
let server, client;

function setup() {
  createCanvas(800,600);
  background(255);

  //start de server luister naar poort 9000
  server = new Server();
  server.startServer(9000);

  //als er data binnenkomt, stuur door naar oscHandler
  //adres (bijv /synth1) en waardes (bijv 40) gescheiden
  server.getMessage(function(addr,val){
    oscHandler(addr,val);
  });

  //start de client, verstuur naar poort 9001
  client = new Client();
  client.startClient("127.0.0.1",9001);

}

function draw() {
  //hier gebeurt niets.  
}

//functie die binnenkomende osc-data verwerkt
function oscHandler(addr,val) {
  //als het adres gelijk is aan /boem
  if (addr === "/boem") {
    //plaats de tekst 'help' op de locatie
    //van de explosie uit de andere sketch
    text("help!",val[0],val[1]);

    //stuur een bericht terug naar de client
    client.sendMessage("/water",val);
  }
}