L'exercice concerne le langage ActionScript3
, associé au player Flash
.
On considère un tout petit sous-ensemble, relatif aux animations 2D.
Sprite
représente des objets contenant leurs coordonnées x
, y
.
Ces coordonnées sont relatives à l'objet de rattachement,
qui peut être un Sprite parent, ou bien la scène (stage en anglais).Sprite
avec du code specifique:
L'idée est de donner un aperçu des possibilités et questions pour générer un code Java réalisant une animation équivalente (Java a des possibilités d'animation moins optimisées, mais permet des applications polyvalentes puissantes).
La traduction d'un code en langage X
dans un autre
langage Y
est un problème complexe. Après
la reconnaissance, il y a des questions "sémantiques" plus ou
moins difficiles : identifier dans Y
les constructions
pouvant donner un résultat équivalent. Il existe
cependant des traducteurs (Python2 vers Python3, Processing vers Java,
Flex [celui de Adobe] vers ActionScript
, ... etc)
On se limite ici:
Mettre au point un analyseur lexA1.flex
reconnaissant toutes
les unités lexicales de Examples/aScript.txt.
package class function public private var Number void this if else
Exemples: SimpleBallBouncer ENTER_FRAME ...
ActionScript
(il faudra donc reconnaître comme symboles ceux de sa bibliothèque : onEnterFrame
, random
... et ceux du code applicatif : ball
, vx
...): voir la liste des mots-clés ci-dessus
< > <= >= ==
+ - / *
=
et l'opérateur de concaténation .
(point){ } ( ) : ; ,
Mettre au point un analyseur lexA2.flex, gramA2.bison,
prin.c
passant les unités lexicales à l'analyseur
syntaxique, qui les reçoit une à une, sans faire aucun
regroupement en "forme syntaxique":
<Num>: 10
").{
ou :
peuvent
être passés directement. Leur valeur sert aussi à
coder la catégorie.
\n
et
espace
\n
et
espace
, aucune impression ne sera faite au niveau lexicalleft
yytext
sans conversion (c'est-à-dire yylval
de type char *
lexBxx.flex gramBxx.bison prin.c
suivants.
Indications
bisonUtils.c
, bisonUtils.h
(alors penser
à modifier le Makefile
)
Mettre au point l'analyseur lexB1.flex, gramB1.bison,
prin.c
reconnaissant un nom composé c'est-à-dire un symbole, ou bien le mot-clé "this", éventuellement suivis
d'autres symboles, chaque nom ajouté étant
précédé de '.'
Fichier exemple : Examples/B1.dat
lexB2.flex, gramB2.bison,
prin.c
reconnaissant:
ArgList
, c'est-à-dire une liste d'arguments fournis
à l'appel d'une fonction: une liste de noms
potentiellement composés, ou de valeurs numériques
separés par des ','. Voici un exemple de liste d'arguments:
Event.ENTER_FRAME, onEnterFrame, 2, 1.2Remarque: on suppose qu'une
ArgList
ne contient pas d'appel de fonction.
FuncCall
c'est-à-dire les appels de
fonction, de la forme:
nom_compose '(' liste d'arguments éventuelle ')'
NUM
et NomCompose
n'apparaissent plus que dans Arg
.lexB3.flex, gramB3.bison,
prin.c
reconnaissant les expressions
arithmétiques. Un opérande peut être une valeur
numérique ou un nom composé ou un appel de fonction.
Fichier exemple : Examples/B3.dat
IndicationsNUM
et NomCompose
n'apparaissent plus que dans Arg
.lexB4.flex, gramB4.bison,
prin.c
reconnaissant des définitions de variables
VarDef
.
Fichier exemple : Examples/B4.dat
Une définition de variables avec leurs typesVarDef
peut être de la forme suivante:
private var ball:Ball private var vx:Number
private
est facultatifvar
est obligatoireTypedName
, c'est-à-dire la succession d'un nom simple, suivi de ':', suivi:
vx:Number
)ball:Ball
)NUMBER, PRIVATE, VAR
.lexB5.flex, gramB5.bison,
prin.c
reconnaissant une notion d'instruction simple
SimpleInst
.
Fichier exemple : Examples/B5.dat
Une instruction simple se termine par';'
. Une instruction simple pourra être:
VarDef
(en ActionScript
, une seule
définition de variable par instruction)AssignInst
: un nom composé suivi de '='
suivi d'une expression arithmétiqueNUMBER, PRIVATE, VAR
.lexB6.flex, gramB6.bison,
prin.c
reconnaissant
ExpLog
, expressions logiques composées d'un 1er terme, un opérateur de comparaison, d'un 2eme terme,
IfInst
alternatives conditionnelles
lexB7.flex, gramB7.bison,
prin.c
reconnaissant la notion de InstBlock
, formé d'une suite d'instructions SimpleInst
ou IfInst
, encadrées par '{' et '}'.
Fichier exemple: Examples/B7.dat. Ce fichier regroupe les blocs d'instructions des 2 fonctions du script exemple.
Mettre au point l'analyseur lexB8.flex, gramB8.bison,
prin.c
reconnaissant
FuncHeader
, de la forme:
modifieur "function" NomCompose '(' paramètre(s) formel(s) éventuel(s) ')' ':' typeou bien
modifieur "function" NomCompose '(' paramètre(s) formel(s) éventuel(s) ')'Remarque: le 2ème cas est celui du constructeur, même nom que la classe)
TypedName
déjà traité.1.1) Des classes Java pour realiser la meme animation sont les suivantes : + la classe SimpleBallBouncer correspond d'assez pres au code ActionScript . la fonction timeStep( ) realise les calculs pour la prochaine image . un objet SimpleBallBouncer possede un attribut instance de la classe Ball + AnimationComponent correspond plus ou moins a la classe Sprite - ressemblance : c'est un Container, pouvant contenir d'autres composants - differences : c'est un thread ; elle ne contient pas les coordonnees + AnimationFrame, ApplicationFrame fournissent des fonctionnalites correspondant a certaines fonctionnalites du player Flash + la classe UseSimpleBallBouncer sert au lancement 1.2) Utilisation + Preparation : javac UseSimpleBallBouncer.java + Lancement : java UseSimpleBallBouncer
T1) Extraire du package ActionScript la classe SimpleBallBouncer (supposee unique) T2) Avant le code de cette classe, inserer les instructions import de Java T3) Faire que cette classe herite de AnimationComponent et non de Sprite T4) Ajouter a ses fonctions la fonction de trace graphique : public void paint(Graphics g) { ball.paint(g); } T5) Transformer les declarations de variables numerique en la syntaxe Java : private var ball:Ball; ---> private Ball ball; private var vx:Number; ---> private double vx; (inutile de faire des regroupements de variables de meme type) T6) Dans chaque fonction ou Math.random() est utilise : - transformer chaque Math.random() en random.nextFloat() - inserer avant ces appels : Random random = new Random(); T7) Fonction onEnterFrame() : - changer son en-tete en "public void timeStep()" T8) References a "stage.stageWidth", "stage.stageHeight" - les remplacer par getWidth(), getHeight()