Spécifications techniques Hellobounces

17
Dossier des spécifications techniques LISI L3 PSM – Yoann PIERRE et Aurélien BAHRI – Version 2 ion 2 Liste des fonctions Fonctions du jeu Fonction Détail de la fonction Réalisée à ce jour Commandes générales Choix du niveau L’utilisateur sélectionne le niveau de difficulté du jeu. Réalisée Charger le monde Cette fonction appelle toutes les fonctions nécessaires au fonctionnement du jeu. Une fois cette fonction terminée, le joueur n’a plus qu’à appuyer sur START pour commencer à jouer. Réalisée Démarrer le jeu Cette fonction lance le jeu quand l’utilisateur appui sur le bouton START Réalisée Création et initialisation du plateau de jeu Créer le monde Cette fonction crée un tableau vide. Elle met chaque case à l’état « neutre ». Réalisée Placement des obstacles Place les obstacles dans les cases indiquées. Réalisée Placement entrée(s)/sortie(s) Place les entrées et les sorties dans les cases du tableau en fonction du niveau de difficulté sélectionné. Réalisée Création de la feuille de dessin Cette fonction va créer la feuille ou l’utilisateur pourra dessiner dessus. On définit aussi le style de trait Réalisée

description

Spécifications techniques et explications du code du mini-jeu HelloBounces, projet réalisé en Licence 3 SLIC à Montbéliard.

Transcript of Spécifications techniques Hellobounces

Dossier des spécifications techniques LISI L3 PSM – Yoann PIERRE et Aurélien BAHRI – Version 2 ion 2

Liste des fonctions

Fonctions du jeu

Fonction Détail de la fonction Réalisée à ce jour

Commandes générales

Choix du niveau L’utilisateur sélectionne le niveau de difficulté du jeu. Réalisée

Charger le monde

Cette fonction appelle toutes les fonctions nécessaires au fonctionnement du jeu. Une fois cette fonction terminée,

le joueur n’a plus qu’à appuyer sur START pour

commencer à jouer.

Réalisée

Démarrer le jeu Cette fonction lance le jeu

quand l’utilisateur appui sur le bouton START

Réalisée

Création et initialisation du plateau de jeu

Créer le monde

Cette fonction crée un tableau vide. Elle met chaque case à l’état

« neutre ».

Réalisée

Placement des obstacles Place les obstacles dans les cases indiquées. Réalisée

Placement entrée(s)/sortie(s)

Place les entrées et les sorties dans les cases du

tableau en fonction du niveau de difficulté

sélectionné.

Réalisée

Création de la feuille de dessin

Cette fonction va créer la feuille ou l’utilisateur pourra dessiner dessus. On définit

aussi le style de trait

Réalisée

(épaisseur du trait, couleurs…etc).

Fonctions pour chaque obstacle particulier

Exemple : obstacles qui freine ou accélère l’avatar, obstacles qui disparaissent

et réapparaissent à intervalle régulier…etc.

A imaginer et créer

Affichage image de fond du monde

Affiche une image de fond en fonction du monde Réalisée

Affiche le Monde Correspond à afficher les

cases contenant un obstacle ou autres (case = ! vide_mc)

Réalisée

l’avatar

Création de l’avatar Insérer dans la scène, le movieClip de l’avatar Réalisée

Positionnement initial de l’avatar

Positionne l’avatar aux coordonnées x et y de

l’entrée Réalisée

Tuer l’avatar

Si l’avatar dépasse un certain seuil (c’est-à-dire, s’il

tombe dans le « vide »), il « meurt ». On arrête alors le jeu, puis on replace l’avatar à

l’entrée.

Réalisée

Rebond de l’avatar

Définie le comportement de l’avatar (gravité, rebond,

taille…). Son comportement peut varier en fonction du

niveau de difficulté sélectionné.

Réalisée

Déplacement de la « caméra » en fonction de

l’avatar

Déplacement de l’ensemble des éléments du jeu pour

donner l’illusion d’un déplacement de caméra.

Réalisée

contrôle de l’utilisateur

Tracer un trait

Fonction qui permet à l’utilisateur de tracer des segments qui permettront d’orienter les rebonds de

l’avatar.

Réalisée

Chemin automatique Fonction qui trace automatiquement le chemin. Réalisée

Fonction de l’éditeur de niveau

(A définir suivant le temps restant)

Fonction Détail de la fonction

Réalisée / à réaliser

Commandes générales

Fonction : Choix du niveau // Début fonction ChoixNiveau (D : niveauDifficulte, D : monde)

// Déclaration de variables

D : niveauDifficulte : entier (=1)

D : monde : entier (=1)

// On demande à l’utilisateur quel niveau il a : facile (1), moyen (2) ou difficile (3) et on l’injecte dans la variable

niveauDifficulte donnée utilisateur

// Appel de la fonction de chargement du monde

ChargerMonde (D : niveauDifficulte, D : monde)

// Fin de la fonction

Fonction : Chargement du monde // Début fonction ChargerMonde (D : niveauDifficulte, D : monde)

// Déclaration de variable

Donnée : niveauDifficulte : entier (=1)

Donnée / Résultat : monde : entier

// On lance la création du monde

CreerMonde ()

// On lance le placement d’obstacles

PlacementObstacles (D : monde)

// On lance la création de l’entrée et de la sortie

PlacementEntreeSortie (D : niveauDifficulte)

// On crée la feuille de dessin

CreerFeuille (D : feuille feuille_mc)

// On lance l’affichage du fond

AffichageFond (D : monde)

// On lance l’affichage du monde

AffichageMonde ()

// On crée l’avatar

CreerAvatar ()

// On place l’avatar

PlacerAvatar ()

// On démarre le jeu

DemarrerJeu (D : start = false, D/R : premierDeplacement, D/R : coteGMonde, D : monde, D : niveauDifficulte)

// Fin de la fonction

Fonction : Démarrer le jeu // Début fonction DemarrerJeu (D : start = false, D/R : premierDeplacement, D/R : coteGMonde)

// Déclaration de variables

D / R : start : booléan (=false)

D / R : premierDeplacement : booléan (=true)

D / R : coteGMonde : entier (=0) // coordonnée du bord gauche de la zone de jeu par rapport au Monde

D : monde

D : niveauDifficulte

start : booléan

automatique : booléan

// Si le joueur appuie sur le bouton démarrer

Si l’utilisateur clique sur le bouton démarrer alors

start égal à vrai

Fin si // le joueur n’a pas appuyé sur le bouton start

// Si le joueur appuie sur le bouton automatique

Si l’utilisateur clique sur le bouton automatique alors

automatique égal à vrai

Fin si // le joueur n’a pas appuyé sur le bouton automatique

// Si l’utilisateur à cliquer sur le bouton start

Si le bouton start est vrai alors

// Si l’avatar n’est pas sur la sortie

Si l’avatar ne touche pas sortie_mc faire

Pour chaque période faire // correspondant à l’enterFrame en Action Script

// On lance la fonction pour que l’utilisateur trace un trait

Trace ()

// On lance la fonction rebond pour l’avatar

Rebondir ()

// On lance la fonction pour le déplacement de la caméra

deplaceCamera (D/R : premierDeplacement, D/R : coteGMonde)

Fin pour

Sinon l’avatar touche la sortie_mc alors faire // l’utilisateur à fini le niveau

ChargerMonde (D : niveauDifficulte, D : (monde+1)) // on charge le monde suivant

Fin si

Sinon // Si le bouton start est faux

Si le bouton automatique est vrai

// On lance le traçage automatique des traits

chargeCheminAutomatique () ;

// On lance la fonction rebond pour l’avatar

Rebondir ()

// On lance la fonction pour le déplacement de la caméra

deplaceCamera (D/R : premierDeplacement, D/R : coteGMonde)

Fin si

Fin si

// Fin de la fonction

Création et initialisation du plateau de jeu

Fonction : Créer le monde

Categorie correspond à un movieClip dans la bibliothèque flash de différents types possibles : carre_mc, triangle_mc, arc_mc, sortie_mc, etc… ils seront des obstacles pour l’avatar !

// Déclaration de variable

TYPE colonne (c1, c2, …, c100);

TYPE ligne (l1, l2, …, l7) ;

TYPE t_categorie (vide, obst_carre, obst_triangle2, etc…) ; // tous les movieClips (obstacles, etc…)

TYPE t_image (obstacle1_img1.jpg, obstacle3_img2.jpg, etc…) ; // toutes les images pour les éléments

TYPE t_sons (obstacle_sons1.mp3, obstacle_sons2.mp3, etc…) ; // tous les sons pour les éléments

TYPE P_CART Case (categorie : t_categorie, coord_x : entier, coord_y : entier, image : t_image, sons : t_sons);

Monde : TABLEAU (colonne, ligne) de Case ;

// Début fonction de CreerMonde ()

// Déclaration de variables

i : entier (=0)

j : entier (=0)

x : entier (=0)

y : entier (=0)

// Boucle pour chaque ligne et pour chaque colonne

Pour tous éléments appartenant à ligne faire (i = 1 à i = 7)

Pour tous éléments appartenant à colonne faire (j = 1 à j = 100)

// On crée un produit cartésien de type P_CART Case dans chaque case

Monde [c’j’, l’i’].case : Case < ‘vide’, ‘x’, ‘y’, ‘vide.png’, ‘’ >

Incrémentation de x par 70 // pour définir les coordonnées en x de la case

Fin pour

Incrémentation de y par 70 // pour définir les coordonnées en y de chaque case

Fin pour

// Fin de la fonction

Fonction : Placement des obstacles

// Début de la fonction PlacementObstacles (D : monde)

// Déclaration de variables

Donnée : monde : entier

// Placement des obstacles à partir d’un fichier XML

Pour chaque balise <obstacle> du XML dans <monde> (envoyé en paramètre)

// Récupère la ligne et la colonne dans le XML pour monde et le movieClip pour categorie

Récupérer Monde [<colonne>, <ligne>].Case [categorie] = <categorie>

// Récupère la ligne et la colonne dans le XML pour monde et le movieClip pour image

Récupérer Monde [<colonne>, <ligne>].Case [image] = <image>

// Récupère la ligne et la colonne dans le XML pour monde et le movieClip pour sons

Récupérer Monde [<colonne>, <ligne>].Case [sons] = <sons>

Fin pour

// Fin de la fonction

Fonction : Placement entrée / sortie

niveauDifficulte =1

niveauDifficulte =2

niveauDifficulte =3

Positionnement de l’entrée en fonction du niveau de difficulté

Plus le niveau de difficulté sera élevé plus l’entrée sera positionnée en bas du tableau.

Plus le niveau de difficulté sera élevé plus la sortie sera positionnée en haut du tableau.

Positionnement de la sortie en fonction du niveau de difficulté

niveauDifficulte =2

niveauDifficulte =1

niveauDifficulte =3

// Début de la fonction PlacementEntreeSortie (D : niveauDifficulte)

Donnée : niveauDifficulte : entier

// Déclaration de variables

ligneAleatoire : entier

// Si le niveau est facile

Si niveauDifficulte = 1 alors faire

// On place l’entrée dans la première colonne et sur la ligne 1 ou 2 définie par une variable aléatoire

ligneAleatoire = valeur aléatoire comprise entre 1 et 2

Monde [c1, l(ligneAleatoire)].Case [categorie] = entree

// On place la sortie dans la dernière colonne et sur la ligne 5 ou 6. Ceci est également défini par la variable aléatoire

ligneAleatoire = valeur aléatoire comprise entre 5 et 6

Monde [c700,l(ligneAleatoire)].Case [categorie] = sortie

// Si le niveau est moyen et qu’il n’est pas facile

Sinon si niveauDifficulte = 2 alors faire

// On place l’entrée dans la première colonne et sur la ligne 3 ou 4 définie par une variable aléatoire

ligneAleatoire = valeur aléatoire comprise entre 3 et 4

Monde [c1, l(ligneAleatoire)].Case [categorie] = entree

// On place la sortie dans la dernière colonne et sur la ligne 3 ou 4. Ceci est également défini par la variable aléatoire

Le joueur sélectionne le niveau de difficulté avant de lancer une partie. Le niveau influence le placement de l’entrée et de la sortie. Plus le niveau sera élevée plus l’entrée et les sorties seront difficiles d’accès.

ligneAleatoire = valeur aléatoire comprise entre 3 et 4

Monde [c700,l(ligneAleatoire)].Case [categorie] = sortie

// Si le niveau est difficile et qu’il n’est ni facile ni moyen

Sinon niveauDifficulte = 3 alors faire

// On place l’entrée dans la première colonne et sur la ligne 5 ou 6 définie par une variable aléatoire

ligneAleatoire = valeur aléatoire comprise entre 5 et 6

Monde [c1, l(ligneAleatoire)].Case [categorie] = entree

// On place la sortie dans la dernière colonne et sur la ligne 1 ou 2. Ceci est également défini par la variable aléatoire

ligneAleatoire = valeur aléatoire comprise entre 1 et 2

Monde [c700,l(ligneAleatoire)].Case [categorie] = sortie

Fin si

// Fin fonction

Fonction : Création de la feuille de dessin

// Début fonction CreerFeuille ()

// Création du movieClip dans le movieClip monde_mc

Création du movieClip vide : feuille_mc, dans monde_mc

// Définir le style du trait qui sera tracé

Dans Feuille_mc définir trait tracé comme épais de 10 pixel et de couleur noir

// Fin fonction

Fonction : Affichage de l’image de fond

// Début fonction AffichageFond (D : monde)

// Déclaration de variables

Donnée : monde : entier

// Création du movieClip

Création du movieClip vide : fond_mc, dans la scène

Coordonnées x et y du movieClip fond_mc égal à 0

// Placement de l’image de fond à partir d’un fichier XML

Chercher la balise <monde> dans le XML où elle est égale à la variable monde

Récupérer la balise <fondMonde> contenant un nom d’image dans la balise <monde> correspondant

Mettre dans fond_mc

// Fin fonction

Fonction : Affiche le Monde

// Début fonction AffichageMonde ()

// Déclaration de variables (locales)

i, j, k : entier (=0)

// Création d’un nouveau movieClip contenant les images des cases

Création du movieClip vide : fondCases_mc, dans la scène

// On parcourt chaque case du tableau Monde en regardant si la case est vide ou si il y a un obstacle

// Boucle pour chaque ligne et pour chaque colonne

Pour tous éléments appartenant à ligne faire (i = 1 à i = 7)

Pour tous éléments appartenant à colonne faire (j = 1 à j = 100)

Si Monde [c’j’, l’i’].case [categorie] différent de vide // si la case contient un obstacle ou autres

// Création d’une occurrence de la categorie spécifiée, incrémentée de k pour ne pas avoir de doublon

Création de l’occurrence Monde [c’j’, l’i’].case [categorie] : Monde [c’j’, l’i’].case [categorie]k_mc

// Affectation des coordonnées

Coordonnées x du movieClip Monde [c’j’, l’i’].case [categorie]k_mc égal à Monde [c’j’, l’i’].case [coord_x]

Coordonnées y du movieClip Monde [c’j’, l’i’].case [categorie]k_mc égal à Monde [c’j’, l’i’].case [coord_y]

// Ajout et placement de l’image dans le movieClip fondCases_mc

Mettre dans fondCases_mc l’image Monde [c’j’, l’i’].case [image] à la position Monde [c’j’, l’i’].case [coord_x] et Monde [c’j’, l’i’].case [coord_y]

// Ajout du son dans le movieClip propre à la case

Mettre dans Monde [c’j’, l’i’].case [categorie]k_mc le son Monde [c’j’, l’i’].case [son]

// Incrémentation de k

k k + 1

Fin si // Sinon la catégorie de la case est vide

Fin pour

Fin pour

// Fin fonction

L’avatar

Fonction : Création de l’avatar L’avatar est un movieClip existant dans la bibliothèque…

// Début de la fonction CreerAvatar ()

// Création d’une occurrence de l’avatar

Création de l’occurrence de avatar : avatar_mc

// Fin fonction

Fonction : Positionnement initial de l’avatar

// Début de la fonction PlacerAvatar ()

// Placement de l’avatar au centre de la case par rapport aux coordonnées x et y de l’entrée

// lire les coordonnées en x de entree_mc et les affecter à l’avatar

x de avatar = x de entree plus 35 // largeur de la case divisée par deux

// lire les coordonnées en y de entree_mc et les affecter à l’avatar

y de avatar = y de entree moins 35 // hauteur de la case divisée par deux

// Fin fonction

Fonction : Tuer l’avatar

// Début de la fonction TuerAvatar ()

// Si l’avatar est trop bas: plus bas que la zone de jeu…

Si la coordonnée en y de avatar_mc est supérieur à 500 px alors

placerAvatar ()

DemarrerJeu (D : start = false)

// Fin fonction

Fonction : l’avatar rebondi

// Début de la fonction rebondir (fonction rédigée à partir d’un exemple !)

// Déclaration des variables

D/R : avatar_yspeed : entier (=0) // vitesse de déplacement en y de l’avatar

D/R : avatar_xspeed : entier (=0) // vitesse de déplacement en x de l’avatar

D/R : gravite : entier (=0.2) // représente la gravité, c’est un coefficient

D/R : radius : entier (=5) // diamètre de l’avatar pris en compte

D/R : friction : entier (=0.90) // coefficient de friction

D/R : precision : entier (=360) // précision des calculs entre l’avatar et les obstacles

D/R : pause : booléan (=false) // vrai : le jeu est pause et faux : le jeu est arrêté

collisions : entier (=0) // nombre de collisions compté lors des tests

i : entier (=0) // pour incrémenter une boucle

marge_x : entier (=0) // marge de la position en x de l’avatar en fonction de la précision

marge_y : entier (=0) // marge de la position en y de l’avatar en fonction de la précision

maxPos_x : entier (=0) // position en x maximal la plus proche de l’avatar lors d’une collision

maxPos_y : entier (=0) // position en y maximal la plus proche de l’avatar lors d’une collision

avatar_dir : entier (=0) // correspond à la direction de la balle

avatar_cont_x : entier (=0) // uniquement le contour de sécurité en x

avatar_cont_y : entier (=0) // uniquement le contour de sécurité en y

avatar_ang_coll : entier (=0) // angle de collision de l’avatar

sol_rotation : entier (=0) // angle au sol

angle_rebond : entier (=0) // angle de rebond

vitesse : entier (=0) // vitesse de l’avatar

avatar_old_x : entier (=0) // ancienne valeur de x pour l’avatar

avatar_old_y : entier (=0) // ancienne valeur de y pour l’avatar

// Si le jeu n’est pas en pause faire

Si pause est égal à faux alors

Collisions égal à 0

maxPos_x égal à 0

maxPos_y égal à 0

Avatar_yspeed égal à avatar_yspeed + gravite

// suivant la precision on va affiner la marge

Pour i de 1 à precision faire i + 1

marge_x égal à avatar_x+radius*Sinus de (i*360/precision)

marge_y égal à avatar_y+radius*Sinus de (i*360/precision)

// Si il y a une collision entre le monde et l’avatar

Si monde_mc touche la marge

On incrémente collisions

// On définit les coordonnées max de l’avatar

maxPos_x égal à marge_x

maxPos_y égal à marge_y

Fin si

Fin Pour

// Si l’avatar touche un obstacle

Si collisions est supérieur à 0

// définir la direction de l’angle de l’avatar à partir de sa vitesse

Avatar_dir égal à l’arc tangente de (avatar_yspeed/(avatar_xspeed*-1))/(PI/180)

// en fonction du déplacement de l’avatar on agit sur sa direction

Si avatar_xspeed * -1 est inférieur à 0 alors

Ajouter 180 à avatar_dir

ou si avatar_xspeed * -1 est supérieur ou égal à 0 et que avatar_yspeed est inférieur à 0 alors

Ajouter 360 à avatar_dir

Fin si

Marge_x égal à maxPos_x / collisions

Marge_y égal à maxPos_y / collisions

avatar_cont_x égal à marge_x - avatar_x

avatar_cont_y égal à marge_y - avatar_y

// Déterminer l’angle de collision de l’avatar

avatar_ang_coll égal à l’arc tangente (avatar_cont_y / avatar_cont_x) / (PI / 180)

// En fonction du contour de sécurité on ajuste l’angle de collision de l’avatar

Si avatar_cont_x est inférieur à 0 alors

Ajouter 180 à avatar_ang_coll

Ou si avatar_cont_x est supérieur ou égal à 0 et que avatar_cont_y est inférieur à 0 alors

Ajouter 360 à avatar_ang_coll

Fin si

// À partir de l’angle de collision, on détermine l’angle au sol

Sol_rotation égal à avatar_ang_coll - 90

Si sol_rotation est inférieur à 0 alors

Ajouter 180 à sol_rotation

Fin si

Angle_rebond égal à 180 - avatar_dir – 2 * sol_rotation

Si angle_rebond est inférieur à 0 alors

Ajouter 360 à angle_rebond

Fin si

// On ajuste la vitesse de l’avatar

Vitesse égal à la racine carré de ((avatar_yspeed* avatar_yspeed)+( avatar_xspeed* avatar_xspeed))

Avatar_xspeed égal à speed * cosinus de (angle_rebond * PI / 180) * friction

Avatar_yspeed égal à speed * sinus de (angle_rebond * PI / 180) * -1 * friction

// On replace l’avatar sur l’ancienne coordonnées sans rebond

avatar_x égal à avatar_old_x

avatar_y égal à avatar_old_y

// Si l’avatar ne touche pas d’obstacle

Sinon collision est inférieure à 0 alors

// On donne la position de l’avatar comme position « sur » (sans rebond)

avatar_old_x égal à avatar_x

avatar_old_y égal à avatar_y

Fin si

// On donne les nouvelles coordonnées à l’avatar

avatar_x égal à avatar_x + avatar_xspeed

avatar_y égal à avatar_y + avatar_yspeed

Fin si // sinon le jeu est en pause

// Fin fonction

Fonction : déplacement de la caméra

// Début de la fonction deplaceCamera

// Déclaration de variables

D/R : premierDeplacement : booléan (=true)

D/R : coteGMonde : entier (=0) // coordonnée du bord gauche de la zone de jeu par rapport au Monde

avatar_x : entier

// Si l’avatar est un peu plus loin que le milieu de l’écran (le sens de déplacement étant de la gauche vers la droite)

Si avatar_x est supérieur ou égal au coteGMonde + 400 px alors

// Faire suivre la caméra, c’est-à-dire déplacer tout le Monde sur la gauche par rapport au déplacement effectué de l’avatar

X de Monde_mc X de Monde_mc - (Avatar_x - (coteGMonde+400))

// Nouvelle valeur du coté gauche de la zone de jeu

coteGMonde Avatar_x - (coteGMonde+400)

// premierDeplacement est mis à faux puisque l’avatar est au centre

premierDeplacement égal à faux

Fin si

// Sinon l’avatar est un peu moins loin que le milieu de l’écran

Si avatar_x est inférieur ou égal au coté gauche + 300 px alors

// Si l’avatar n’a pas été une fois au centre alors ne rien faire

Si premierDeplacement est faux alors

// Faire suivre la caméra, c’est-à-dire déplacer tout le Monde sur la droite par rapport au déplacement effectué de l’avatar

X de Monde_mc X de Monde_mc + (Avatar_x - (coteGMonde+300))

// Nouvelle valeur du coté gauche de la zone de jeu

coteGMonde Avatar_x - (coteGMonde+300)

Fin si // Sinon premierDeplacement est vrai alors rien faire

Fin si // sinon l’avatar est au centre de l’écran entre 300 et 400px par rapport à coteGMonde

// Fin fonction

Contrôle de l’utilisateur

Fonction : tracer un trait

// Début de la fonction tracer (D : feuille : chaine de caractère)

// Déclaration de variables (locales)

D : feuille // on appel la feuille ou on va dessiner

dessinEnCours : booléan (=faux)

// Dessiner si le clic gauche de la souris est enfoncé ou pas

Si le bouton de la souris est enfoncé alors

Si la variable dessinEnCours est faux alors

// Ne pas dessiner si la souris est sur l’avatar ou sur un obstacle

Si la souris ne touche pas avatar_mc ou monde_mc alors

A chaque instant, dans feuille, dessiner les mouvements de la souris à l’aide de…

…ses coordonnées x et y // un instant correspond à une frame en flash

DessinEnCours vrai

Fin si // sinon la souris touche un obstacle ou l’avatar

Fin si // Sinon la variable dessinEncours est vrai

Sinon le clic gauche de la souris est relâché alors

Arrêter de dessiner les mouvements de la souris

dessinEnCours faux

Fin si

// Fin fonction

Fonction : chemin automatique

// Début de la fonction chargeCheminAutomatique (D : monde : entier)

// Déclaration de variables

Donnée : monde : entier

// Traçage des traits à partir du fichier XML

Pour chaque balise <trait> dans <automatique> dans <monde> (envoyé en paramètre) du XML

// Se déplacer aux coordonnées x1 et y1 récupérer

Placement aux coordonnées <x1> et <y1> dans feuille_mc // utilisation de moveto en AS

// Tracer jusqu’aux coordonnées x2 et y2 récupérer

Dessiner le trait jusqu’aux coordonnées <x2> et <y2> // utilisation de lineto en AS

Fin pour

// Fin de la fonction