====== Le Chaperon Rouge ======
* Porteur du projet : Elodie Lyonnais
* Date : 26/01/2015
* Contexte : MACROPROJET#2
{{:wiki:projets:chaperonrouge:lepetitchaperonrouge.pdf|}}
===== Le projet =====
**PRÉSENTATION**
Des contes de Charles Perrault, à ceux des frères Grimm en passant par les contes d’Andersen, tous ces contes ont bercé mon enfance et me fascinent encore aujourd’hui. C’est pourquoi, j’ai envisagé d’orienter mon mémoire autour du Conte.
La question cruciale que je me pose en tant que graphiste autour du conte c'est Comment, par le biais du graphisme, peut-on aménager des espaces d'expression favorisant l'imaginaire ?
Ainsi aujourd'hui sachant que nous sommes dans une époque basé sur les nouvelles technologie je me suis intéressée à la place de ces nouvelles technologie dans le conte.
Ce support permettant d'introduire une idées fondamentale : l’interactivité.
Dans ce sens j'ai choisis de créer un jeux en reprenant un conte connue: Le Petit Chaperon Rouge.
Ici je montre en quelque sorte que tout les contes peuvent être réinventer, il n'y a pas de forme fixe au conte ni de visuel fixe.
Ce jeux que j'ai mis au point est pour moi une base de travail pour la suite, ceci est une première phase dans l'élaboration de mon projet de fin d'année qui gardera cette même idée d'interactivité mais plus centré sur la question de l'imaginaire.
Rappelons que la cible principale sont les enfants.
**ENJEUX**
*Introduire de l'interactivité dans le conte
*Proposer une nouvelle forme de conte
===== Matériel =====
{{ :wiki:projets:chaperonrouge:montage.jpg?300 |}}
* 1 carte ARDUINO
* 1 breadboard
* 1 connecteur ARDUINO/USB
* 5 fils connecteurs mâle/mâle
* 1 potentiomètre
===== Montage =====
{{:wiki:projets:chaperonrouge:carte.jpg?300 |}}
{{ :wiki:projets:chaperonrouge:montagedessus.jpg?300|}}
{{:wiki:projets:chaperonrouge:montage_partiel.jpg?300 |}}
{{ :wiki:projets:chaperonrouge:montage_partiel_schema.jpg?200|}}
===== Code Arduino =====
//PARAMETRAGE DES ENTIERS, déclaration des variables
int firstSensor = 0; // Premier capteur analogique
int secondSensor = 0; // deuxième capteur analogique
int inByte = 0; // Entrée d'une série de Byte
// INSTRUCTION D'INITIALISATION DES RESSOURCES
//Définition des entrées et sorties
void setup() {
Serial.begin(9600); // Initialisation de la communication série a 9600 bps; initialisation du port begin() précision de la vitesse de transfert
while (!Serial) { // Attendre la connection du port serie
;
}
}
// INSTRUCTIONS REPETEES UNE INFINITE DE FOIS TANT QUE LA CARTE EST SOUS TENSION
void loop() {
if (Serial.available() > 0) { // si nous obtenons un Byte valide, lire les branches analogiques
inByte = Serial.read(); // lire les Bytes entrant
firstSensor = analogRead(A0)/4; // lire la premiere entree analogique, divise par quatre
delay(10); // patienter 10 ms
// envoyer les valeurs :
Serial.write(firstSensor);
Serial.write(secondSensor);
Serial.write(etatBouton);
}
}
/// PARAMETRAGES POUR ETABLIR LE CONTACT
void establishContact() {
while (Serial.available() <= 0) { //instructions à exécuter dans la boucle tant que la condition finale n'est pas atteinte
Serial.print('A'); // envoyer la lettre A
delay(300); //patienter 300ms
}
}
===== Code Processing =====
/// Declaration des entiers
// Initialisation du lien entre processing et arduino
import processing.serial.*; // importer de la librairie
Serial myPort; // Le port serie
int[] serialInArray = new int[3]; // tableau d'entree de 3 éléments
int serialCount = 0;
boolean firstContact = false;
int value = 0;
int xpos;
// Librairies son
import ddf.minim.*; // Importer de la librairie
// Variable son
Minim minim;
// Declaration de la chanson
AudioSnippet jeu;
// Chargement des variable images pour les différentes images du jeu
PImage bg;
PImage loup;
// X et Y position du loup, coordonnées du loup
float X_loup = 350;
float Y_loup = 20;
boolean loup_mort = false; // Variable boolean (vraie ou fausse) pour le loup mort
float etat_de_mort = 0;
int deplacement_auto = 0; // 0 = rien, 1 = droite, 2 = gauche
final float vitesse_loup = 5.0; // Vitesse de déplacement du loup
// x and y position du vaisseau, coordonnées du vaisseau
float x = 380;
float y = 580;
// x and y postion de tir, coordonnées du tir
float tir_x = 380;
float tir_y = 580;
final float vitesse_balle = 16; // Vitesse de la balle
// Taille du tir
int taille_tir_x = 12;
int taille_tir_y = 12;
/// Le contenue de cette fonction est appelé une foi au démarrage du programme
void setup() {
size (1000,750); // Taille de la fenetre
bg = loadImage("fondarbre.png"); // Chargement du fond d'écran
rectMode(CENTER); // Emplacement au centre
smooth(); // Contours régulier
xpos = width/2; // Position x, valeur de x = width/2
// Chargement de l'audio
minim = new Minim(this);
jeu = minim.loadSnippet("petitchaperonrouge.mp3");
//Chargement du loup
loup = loadImage("loup-okay.png");
println("loup.height = " + loup.height); // Dimension du loup
// Liste les ports series
printArray(Serial.list());
println("portname");
String portName = Serial.list()[0];
myPort = new Serial(this, portName, 9600);
}
/// Le contenue de cette fonction est appelé en boucle
void draw() {
background (bg); // Fond d'écran
noStroke(); // Pas de contours
fill(255); // Couleur du fond
// Essai tir
tir_y = tir_y - vitesse_balle;
// Vaiseau
String name;
float pos = map(xpos, 245, 12, 0, 1000); // Parametrages pour le déplacement du vaiseau via le potentiometre compris entre 12 et 245, valeurs de pos
smooth(); // Contours régulier
fill(255,0,0); // Couleur du vaisseau
ellipse(pos,y,100,100); // Taille du vaiseau
// Dessiner le tir
fill(255); // Couleur du tir
rect(pos, tir_y, taille_tir_x, taille_tir_y ); // Dimension du tir
// Déclaration des différents programmes crée
loup();
musique();
}
// Comportement du loup
void loup() {
float pos = map(xpos, 245, 12, 0, 1000); // Parametrages pour le déplacement du vaiseau compris entre 12 et 245, valeurs de pos
// Colision loup balle, si la balle atteint le format du loup il disparait
if ( tir_y - taille_tir_y / 2 < Y_loup + loup.height
&& tir_y + taille_tir_y / 2 > Y_loup
&& pos + taille_tir_x / 2 > X_loup
&& pos - taille_tir_x / 2 < X_loup + loup.width) {
loup_mort = true;
}
// Affichage loup
if (!loup_mort) {
tint(255); // Couleur du loup quand il meurt
image(loup, X_loup, Y_loup); // Taille de l'image loup
}
else if (etat_de_mort < 4) {
float p = 180 * sin(etat_de_mort) + 50;
tint(p, 0, 0, p); // Vitesse du loup
image(loup, X_loup, Y_loup); // Taille de l'image loup
etat_de_mort += 0.1;
}
// Déplacement aléatoire du loup
int hasard = (int) random(300); // Genere un nombre entre 0 et 300
if (hasard < 4)
deplacement_auto = 2;
else if (hasard < 8)
deplacement_auto = 1;
hasard = (int) random(6); // Genere un nombre entre 0 et 6
if (deplacement_auto == 0 && hasard > 4)
deplacement_auto = (int) random(1, 3); // Genere un nombre netre 1 et 3
boolean bloque = true;
if (deplacement_auto == 1 && X_loup + vitesse_loup < width - loup.width) {
X_loup += min(vitesse_loup, width - (X_loup + loup.width));
bloque = false;
}
if (deplacement_auto == 2 && X_loup - vitesse_loup > 0) {
X_loup -= min(vitesse_loup, X_loup);
bloque = false;
}
if (bloque)
deplacement_auto = 2 - deplacement_auto + 1;
}
/// Cette fonction est utilisé pour tout action sur le clavier
void keyPressed() {
// Tirer = Espace
if (key == ' ') {// si j'appuie sur la touche espace lancement du tir
if (!loup_mort) {
tir_y = y;
tir_x = xpos;
}
else {
X_loup = random(50, width - loup.width - 50);
loup_mort = false;
etat_de_mort = 0;
}
}
}
/// Parametre de la musique
void musique(){
//Pour que le son continue à jouer
if ( jeu.isPlaying()== false ){
jeu.rewind();
jeu.play();}
}
/// Parametrages de la connection à arduino
void serialEvent(Serial myPort) {
int inByte = myPort.read(); // Lire les bytes entrant
if (firstContact == false) { // Parametre entrés pour verifier le bon fonctiionnement du programme
println("debut first contact");
if (inByte == 'A') { // Si le premier Byte reçu est un "A"
myPort.clear(); // Vider la memoire tampn serie
firstContact = true; // Noter que le premier contact du microcontroleur s'est effectué
println("ecriture sur le port serie de la lettre A");
myPort.write('A');
println("fin first contact");
}
}
// Sinon ajouter le Byte entrant au tableau
else {
serialInArray[serialCount] = inByte;
serialCount++;
if (serialCount > 2 ) { // Si on a 3 Bytes, que serialCount est superieur a 2
xpos = serialInArray[0]; // Envoyer la valeur xpos au premier serialInArray
myPort.write('A'); // Envoyer un "A" pour demander de nouvelles captures du lecteur
serialCount = 0; // Remettre a zero le serialCount
}
}
}
===== Remarques =====
Espace d'échange concernant ce sujet. Cliquez sur modifier et commentez!
TR: images?