Ceci est une ancienne révision du document !
Daphné Chamot-Rooke (contact : daphne.chamot-rooke@etu.upmc.fr)
Himany Seri (contact : himany.seri@etu.upmc.fr)
Début : Février 2019
Fin : mai 2019
Objectif : créer un dispositif qui modifie la perception d'autrui
Matériel :
De nos jours l’étude des mouvements de foule permet de simuler la mécanique des foule : ses mouvements semblables à la physique des fluides et sa psychologie sociale. Dans de nombreuses situations nous avons affaire à des mouvements de foule, que ce soit dans des concerts, des conventions, des manifestations, et même sur les réseaux sociaux.
Comment l’individu influence-t-il la foule et comment celle-ci influence telle l’individu ? Comment initie-t-on un mouvement de foule ?
Nous avons décidé d'orienter notre projet sur comment percevoir la foule et comment *se* percevoir dans la foule. Les mécanismes de l'individu à la foule sont en effet des allers-retours, comme lors d'un croisement de regard.
Nous avions d'abord pensé à travailler sur les émotions, les émotions dans la foule. Nous avions eu l'idée d'un bracelet retranscrivant l'émotion globale de la foule. Puis nous nous sommes orientées vers des applications, car cela nous semblait plus réalisable pour travailler avec de nombreuses personnes. Nous avons choisi de créer un programme pour ordinateur, un jeu multijoueur qui permettrait de retranscrire des mouvements de foule.
Notre jeu se compose d'un avatar représentant soi-même à la 3e personne, vu du dessus. Un “monstre” invisible “mange” les avatars lorsqu'il croise leur chemin. Il faut donc faire attention à son entourage, suivre les autres.
Nous voulons faire plusieurs “salles” avec plusieurs consignes, peut-être en faire une où l'on se voit à la première personne, et une autre avec des consignes différentes pour chaque individu afin de créer un tout avec l'action de chaque individu.
Code Java (Processing) :
//déclaration de variables Blob blob; //personnage Monster monstre; //monstre boolean jeu = false; //bool pour le jeu boolean intro = true; //bool pour l'intro String temps, score; //string pour stocker le temps et le temps final Timer timer; //timer void setup() { fullScreen(); //s'affiche en plein écran timer = new Timer(); //nouveaux blob, monstre et timer blob = new Blob(); monstre = new Monster(); } void draw() { background(0); //fond noir, taille du texte 30 et écrit en blanc textSize(30); fill(255); temps = timer.minute() + ":" + timer.second(); //on stocke les secondes et les minutes dans un string if (jeu) { timer.stop(); //démarre le timer blob.show(); //dessine le blob blob.update(); monstre.show(); //dessine le monstre monstre.deflect(); //empêche que le monstre sorte des bords monstre.move(); //le monstre bouge monstre.manger(blob); //mange le blob si ils se rencontrent text(temps, width/2 - 50, 50); //affiche le temps en haut de l'écran score = temps; } else { timer.start(); fill(255); stroke(255); textSize(50); if (intro) { text("Foule", width/2 - 170, height/2 - 100); //si c'est l'intro : titre du jeu et démarrer text("Cliquer pour jouer", width/2 - 300, height/2); } else { text("Game Over", width/2 - 170, height/2 - 100); //si c'est la fin du jeu : Game Over et le temps final s'affichent text("Temps : " + score, width/2 - 180, height/2); } } } void reset() { //quand c'est la fin du jeu, permet de redémarrer une partie juste en clickant jeu=true; blob.pos.x = random(width); //réinitialise les positions du blob et du monstre aléatoirement blob.pos.y = random(height); monstre.x = random(width); monstre.y = random(height); blob.c = color((int) (Math.random() * 266), (int) (Math.random() * 266), (int) (Math.random() * 266), 170); //réinitialise la couleur aléatoire timer.stop(); //redémarre le timer à 0 } void mousePressed() { //on passe l'intro et la fin du jeu en cliquant intro=false; if (jeu==false) { reset(); } } class Blob { //classe du blob PVector pos, vel, acc; //avec une position, une vitesse et une accélaration color c; //couleur du blob float topspeed; //valeur limite de la vitesse Blob() { pos = new PVector(width/2, height/2); vel = new PVector(0, 0); topspeed = 5; c = color((int) (Math.random() * 266), (int) (Math.random() * 266), (int) (Math.random() * 266), 170); } void update() { PVector mouse = new PVector(mouseX, mouseY); //position en fonction du curseur PVector acc = PVector.sub(mouse, pos); //on définit le vecteur accélération acc.setMag(0.2); //magnitude de l'accélération à 0.2 vel.add(acc); //on ajoute l'accélération au vecteur vitesse mouse.sub(this.pos); // mouse.setMag(7); //magnitude à 7, c'est le retour entre le curseur et le blob à cause de l'accélération (petite par rapport à 0.2) this.pos.add(mouse); vel.limit(topspeed); //valeur limite à la vitesse pos.add(vel); //on ajoute la vitesse au vecteur position } void show() { //dessine le blob fill(c); stroke(c); circle(this.pos.x, this.pos.y, 20); } } class Monster { //classe du monstre float x, y; float xVel, yVel; int radius; Monster() { xVel = random(2, 4); yVel = random(2, 4); if (int(random(0, 2)) == 1) { xVel *= -1; } if (int(random(0, 2)) == 1) { yVel *= -1; } x = random(radius, width-radius); y = random(radius, height-radius); radius = 30; } void move() { //permet au monstre de bouger x += xVel; y += yVel; } void manger(Blob blob) { //le monstre "mange" le blob si ils se rencontrent et le jeu est fini if (blob.pos.x <= this.x + radius && blob.pos.x >= this.x - radius && blob.pos.y <= this.y + radius && blob.pos.y >= this.y - radius) { jeu = false; } } void show() { //dessine le monstre strokeWeight(1); noFill(); ellipse(this.x, this.y, this.radius*2, this.radius*2); } void deflect() { //permet au monstre de ne pas sortir des bords, il "rebondit" if (x + radius > width || x - radius < 0) { xVel *= -1; } if (y + radius > height || y - radius < 0) { yVel *= -1; } } } class Timer { //classe du timer int startTime = 0, stopTime = 0; boolean running = false; void start() { startTime = millis(); running = true; } void stop() { stopTime = millis(); running = false; } int getElapsedTime() { int elapsed; if (running) { elapsed = (millis() - startTime); } else { elapsed = (stopTime - startTime); } return elapsed; } int second() { return (getElapsedTime() / 1000) % 60; } int minute() { return (getElapsedTime() / (1000*60)) % 60; } }