Développement d’un langage spécifique pour des animations graphiques simples
- Exercice 1 : Prise en main de la couche graphique
- Exercice 2 : Première version d'un interpréteur de script
- Exercice 3 : Introduction des commandes
- Exercice 4 : Selection et execution des commandes
Cet exercice consistait à prendre en main la couche graphique.
L'objet était de :
- Déplacer robi jusqu'au bord droit
- Déplacement jusqu'au bord bas
- Déplacement jusqu'au bord gauche
- Déplacement jusqu'au bord haut
- Changement de couleur avec une couleur aléatoire
Résultat avec redimmensionnement
Aucune difficulté n'a été rencontré lors de cet exercice.
Dans le programme, un script est représenté come une expression parenthésée appelée S-expression.
Aucune difficulté n'a été rencontré lors de cet exercice.
Le script que l'on utilisera ici sera :
- (script (space color black) (robi color yellow) )
Resultat de l'execution du script
Le script que l'on utilisera ici sera :
- (script (space color white)(robi color red)(robi translate 10 0)(space sleep 100)(robi translate 0 10)(space sleep 100)(robi (translate -10 0)(space sleep 100)(robi translate 0 -10) )
Resultat de l'execution du script
Dans cet exercice il a fallut mettre en place les classes qui mettent en œuvre l'interface Command.
Aucune difficulté n'a été rencontré lors de cet exercice.
Quatres classes on donc été ajouté :
- RobiChangeColor
- RobiTranslate
- SpaceChangeColor
- SpaceSleep
Classe RobiChangeColor
public class RobiChangeColor implements Command{
Color newColor;
GRect robi;
public RobiChangeColor(Color c, GRect r)
{
this.newColor = c;
this.robi = r;
}
@Override
public void run()
{
/*Changer la couleur de robi*/
robi.setColor(newColor);
}
}
Classe RobiTranslate
public class RobiTranslate implements Command{
int x;
int y;
GRect robi;
public RobiTranslate(int x, int y, GRect r)
{
this.x = x;
this.y = y;
this.robi = r;
}
@Override
public void run()
{
/*Faire bouger robi */
robi.translate(new Point(x,y));
}
}
Classe SpaceChangeColor
public class SpaceChangeColor implements Command{
Color newColor;
GSpace space;
public SpaceChangeColor(Color newColor, GSpace s) {
this.newColor = newColor;
this.space = s;
}
@Override
public void run() {
/*Changer la couleur du fond */
space.setColor(newColor);
}
}
Classe SpaceSleep
public class SpaceSleep implements Command{
int temps;
public SpaceSleep(int temps)
{
this.temps = temps;
}
@Override
public void run() {
/*Faire un temps de pause*/
Tools.sleep(temps);
}
}
Script à executer
-(script (space sleep 10000)(space color blue) (robi color green) (robi translate 10 0) (space sleep 100) (robi translate 0 10) (space sleep 100) (robi translate -10 0) (space sleep 100) (robi translate 0 -10) )
Resultat de l'execution du script
Ajout d'un interpreteur pour faciliter l'utilisation du programme
Aucune difficulté n'a été rencontré lors de cet exercice, mis a part un petit blocage lors ddu 4.4, cependant il à été reussi.
Ajout des classes References et Environment, avec les differentes methodes.
- Reference
- getCommandByName
- addCommand
- Expr run
- Environment
- addReference
- delReference
- getReferenceByName
Methode Run de Reference
Permet de referencer l'objet graphique à un ensemble de commande
public Expr run(ExprList e) {
String selector = e.get(1).getValue();
Command c = this.getCommandByName(selector);
if (c == null) return null;
return c.run(this, e);
}
Pour cette partie il a fallu créer plusieurs classes :
- AddElement
- DelElement
- NewImage
- NewString
- NewElement
Execution d'un script et resultat
-(space add robi (rect.class new)) (robi translate 130 50)(robi setColor yellow)(space add momo (oval.class new))(momo setColor red)(momo translate 80 80)(space add pif (image.class new alien.gif))(pif translate 100 0)(space add hello (label.class new "Hello world"))(hello translate 10 10)(hello setColor black)
Modification pour que nos GContainer puissent contenir des éléements. Il suffit d'autoriser les GContainer à contenir des éléments.
Resultat lors de l'execution du script
Dans cette partie il fallait pouvoir créer et enregistrer des scripts afin de pouvoir les ré-utiliser quand on le souhaite.
J'ai rencontré des difficultés pour l'execution des scripts.
Pour gerer les scripts, le choix à été porter sur la classe Environment plutot que Reference car cela simplifie le code et l'interpreteur ne subit pas trop de modification.
Pour cela il a fallut ajouter plusieurs classes :
- AddScript
- DelScript
Ainsi qu'apporter des modifications dans la classe :
- Environment