OSC-les2
Hieronder de code uit de les van 17 februari 2022
client-sketch
deze sketch stuurt de positie van de ballen naar de server-sketch. De sketch ontvangt ook data en heeft dus eigenlijk twee functies. Maar de hoofdfunctie is client.
//maak een lijst met ballen
let ballen = [];
//maak een variabele voor de client
//en server.
let client, server;
function setup() {
createCanvas(800,600);
background(255);
//maak een nieuw client-object:
client = new Client();
//start de client, voer ip-adres
//en poort in
client.startClient("127.0.0.1",9001);
//maak een nieuw server-object
server = new Server();
//start de server, voer poort in
//dit moet het poortnummer zijn dat je
//in de andere sketch bij client hebt
//ingevuld
server.startServer(9000);
//maak een functie die aangeroepen wordt als
//de server berichten ontvangt.
server.getMessage(function(addr,msg) {
//stuur deze data door naar een aparte functie.
handleMessage(addr,msg);
})
}
function draw() {
background(255);
//loop door de lijst met ballen
//voer voor elke bal de draw(), move()
//en bounce()-functie aan.
for (let i = 0; i< ballen.length; i++) {
ballen[i].draw();
ballen[i].move();
ballen[i].bounce();
}
}
//als er data binnenkomt via osc
//wordt deze functie uitgevoerd.
function handleMessage(addr,msg) {
//als het adres `/addBall` is:
if (addr === "/addBall") {
//voeg een nieuwe bal aan de lijst toe
//de waarden worden aan de constructor
//meegegeven
ballen.push(new Ball(msg[0],msg[1]));
}
}
//functie die alle posities van alle ballen
//doorstuurt.
function sendPositions() {
for (let i = 0; i< ballen.length; i++) {
//roep de `sendPosition()`-functie aan.
ballen[i].sendPosition();
}
}
//classbeschrijving voor een bal
class Ball {
//bepaal in de constructor x, y, s
//een x- en y-speed variabelen
constructor(x,y) {
this.x = x;
this.y = y;
this.s = random(10,20);
this.xSpeed = random(-4,4);
this.ySpeed = random(-4,4);
}
//method om de bal te tekenen
draw() {
ellipse(this.x,this.y,this.s);
}
//method om de bal te laten stuiteren
bounce() {
if(this.x > width - this.s/2 || this.x < this.s/2) {
this.xSpeed *= -1;
//bij elke stuiter wordt de `sendpositions()`-
//functie aangeroepen
sendPositions();
}
if(this.y > height - this.s/2 || this.y < this.s/2) {
this.ySpeed *= -1;
sendPositions();
}
}
//method om de bal te laten bewegen
move() {
this.x += this.xSpeed;
this.y += this.ySpeed;
}
//method om de data door te sturen
//naar de andere sketch
sendPosition(){
//sendMessage stuurt naar het adres `/position`
//de andere waarden erachter worden als array
//doorgestuurd.
client.sendMessage("/position",this.x,this.y,this.s);
}
}
server-sketch
deze sketch ontvangt de data die vanuit de client verstuurd is. Door te klikken kan je wel via de client-functie in deze sketch data doorsturen naar de andere sketch.
//maak twee variabelen aan:
//1 voor de server
//1 voor de client
let server, client;
function setup() {
createCanvas(800,600);
background(255);
//maak een nieuw client-object:
client = new Client();
//start de client, voer ip-adres
//en poort in
client.startClient("127.0.0.1",9000);
//maak een nieuw server-object:
server = new Server();
//start de server, voer poortnummer in
//dit moet het poortnummer zijn dat je
//in de andere sketch bij client hebt
//ingevuld
server.startServer(9001);
//maak een functie die aangeroepen wordt als
//de server berichten ontvangt.
server.getMessage(function(addr,msg) {
//als het adres `/position` is
//teken dan een ellipse met de data uit
//de andere sketch.
if (addr === "/position") {
ellipse(msg[0],msg[1],msg[2]);
}
});
}
function draw() {
}
function mousePressed() {
//als je op de muis drukt stuur je een bericht
//aan de andere sketch.
client.sendMessage("/addBall",mouseX,mouseY);
}