Skip to content

📝 Blog

MatLab Expo 2014

Le jeudi 2 octobre se déroulait une conférence autour du logiciel Matlab : la Matlab Expo 2014.

Ayant dĂ©couvert il y a peu de temps cette application, sentant un potentiel important pour de petites expĂ©riences Ă  la maison ou avec MixTeen, j’ai dĂ©cidĂ© d’aller passer ma journĂ©e lĂ  bas pour enquĂȘter un peu.

Ceci est donc mon petit compte rendu, totalement partial et personnel.

Le commencement est forcĂ©ment un peu difficile : il faut se lever Ă  5h30 pour aller prendre un TGV. J’ai beau insister, mon cerveau refuse de croire que je suis debout et en route.

Pour une fois, ma rĂ©putation de chat noir sera usurpĂ©e et le TGV est parti et arrivĂ© Ă  la minute prĂšs. Bon, ensuite, j’avais mĂ©morisĂ© qu’il fallait prendre le RER C Ă  la gare d’Austerlitz, mais oubliĂ© de noter le nom de la station oĂč descendre. Mini drame, perte de rĂ©seau une fois Ă  la gare, petite perte de temps mais un agent souriant et aimable de la RATP m’indique ce qu’il me faut savoir. Je vous dis, cette journĂ©e est bien partie ;)

La confĂ©rence a lieu dans le Novotel proche de la tour Effeil. L’accueil est trĂšs bien gĂ©rĂ© et sympathique. J’arrive juste pour la fin de la prĂ©sentation initiale.

J’assite ensuite Ă  la premiĂšre keynote : “Behind today’s trends : the technologies driving change” par Loren Shure. C’est plutĂŽt interressant, bien tournĂ©, belle analyse des tendances technologiques et challenges associĂ©s. Bien sĂ»r, de nombreuses rĂ©fĂ©rences aux fonctionnalitĂ©s Matlab, quelques petites annonces : bien ficelĂ©. Je sens bien que je ne suis pas sensible de la mĂȘme façon que la majoritĂ© de l’assistance, qui travaille pour la plupart au quotidien avec Matlab. Mais c’est plutĂŽt enthousiasmant.

La keynote suivante est sur le monde automobile, par Roland Lismonde de chez Bosch : “Le model-sharing au service de l’innovation pour l’industrie automobile”. La prĂ©sentation montre de quelle maniĂšre l’électronique a profondĂ©ment changĂ© le monde automobile. Je ne suis pas super sensible Ă  l’ensemble, je quitte discrĂštement la salle.

Je me rend ensuite dans l’espace oĂč diffĂ©rents stands tenus par Mathworks ou des partenaires prĂ©sentent diffĂ©rentes facettes de Matlab. Comme la plupart des gens sont encore dans l’amphi, je suis un peu sollicitĂ©. Ce qui est trĂšs intĂ©ressant, c’est que lorsque j’explique ma dĂ©marche personnelle et les ateliers Mixteen, je suis trĂšs loin d’ĂȘtre poliment ignorĂ© comme cela peut ĂȘtre le cas dans d’autres salons professionnels. Il y a un intĂ©rĂȘt gigantesque pour tout ce qui touche au numĂ©rique et aux enfants. D’ailleurs, j’espĂšre que les associations parisiennes ne m’en voudront pas, mais j’ai balancĂ© des contacts ;)

Une fois sur le stand prĂ©sentant les capacitĂ©s de connections arduino/raspberry/mindstorms/Soc FPGA, je vais de surprise en (bonne) surprise. Je dĂ©couvre que l’intĂ©rĂȘt de Mathworks pour le monde de l’éducation est trĂšs loin d’ĂȘtre une façade marketing. Il semblerait en plus que la France soit le pays oĂč Mathworks investit le plus dans l’éducation. Je n’ai pas de chiffres, mais le fait de rencontrer des employĂ©s visiblement entiĂšrement dĂ©diĂ©s me suffirait. Si ce n’était pas le cas, les diffĂ©rents exemples prĂ©sents m’auraient convaincus. Et si j’étais vraiment bornĂ©, parler de tous les projets en cours avec elles aurait achevĂ© le tout. Ok, je suis vaincu, Mathworks fait de gros efforts dans la direction du monde Ă©ducatif. Il reste Ă  voir si en dehors des cursus purement scolaire une initiative comme Mixteen a sa place, mais comme toutes les discussions sont restĂ©es ouvertes, il y a un univers de possible.

J’ai donc observĂ© les interactions possibles entre Matlab et arduino avec un petit atelier utilisant des boutons poussoirs et un petit ventilateur. La partie Matlab permet d’aborder une machine Ă  Ă©tat simple et abordable.

Un exemple un peu plus avancĂ© montrait un suivi d’objet par une webcam pilotĂ©e par une Raspberry Pi. Deux autres exemples mettaient Ă  contribution des kits Lego Mindstorms : un suiveur de ligne et un robot en self balancing. (j’écris du franglais si je veux, na ;) )

Tout ça me donne bien envie d’essayer en rentrant (j’en parle plus bas)

La pause sera l’occasion de parler licences avec une des personnes en charge de cet aspect. LĂ  encore, ce fut un Ă©change concret et constructif avec quelqu’un Ă  l’esprit ouvert. Je n’ai pas encore vendu mon Ăąme GPL mais voilĂ  un logiciel certes propriĂ©taire mais Ă  qui j’aimerai donner une belle chance.

Je passe ensuite un bon moment au stand du dĂ©fi Rover. Et lĂ  encore, encore un passionnĂ© employĂ© par Mathworks. Le robot me parait mĂȘme surĂ©quipĂ© pour les taches qu’il a eu Ă  rĂ©aliser dans le premier dĂ©fi. A vue de nez, il y aura d’autres dĂ©fis encore plus complexes dans l’avenir :)

C’est Ă  ce moment que l’amphithĂ©atre principal se vide et que je rĂ©alise que mon estomac rĂ©clame un peu d’attention. Je sais, on ne juge pas un salon Ă  sa nourriture. Mais c’était bien bon :) Je note l’intĂ©rĂȘt des personnes prĂ©sentes pour ce qui semble destinĂ© Ă  l’éducation. Les sessions de l’aprĂšs midi vont concerner du monde.

Nouvelle session avec Loren shure, employĂ©e de longue date de Mathworks. J’ai toujours trouvĂ© que les amĂ©ricains faisaient des speakers enthousiasmant, c’est bien le cas ici. Et pourtant, certains passages furent corsĂ©s pour tous, se faire expliquer une thĂ©orie des balancier et les Ă©quations de Lagrange correspondantes aurait Ă©puisĂ© n’importe qui :) Au passage, je dĂ©couvre MuPad qui est un outil de calcul formel, utile pour Ă©crire des documents contenant des formules mathĂ©matiques avec un rendu visuel correspondant.

J’avoue que j’écris ces passages quelques jours aprĂšs et que la fatigue du virus attrapĂ© dans le TGV se fait encore sentir :)

La session suivante est celle du Dr Abdelmoumen Youssef : modĂ©lisation, simulation au service de la recherche autour de la cardiologie. Un travail remarquable qui dure depuis 13 ans pour obtenir une modĂ©lisation du coeur suffisament rĂ©elle et paramĂ©trable pour qu’une aide concrĂšte soit apportĂ©e aux Ă©quipes mĂ©dicales.

J’assiste ensuite Ă  la confĂ©rence de Yann Labit : simulateur de servo commandes Ă©lectrique avec Simulink pour le contrĂŽle de vol sur hĂ©licoptĂšre. Beaucoup d’explicartion sur les redondances des contrĂŽles sur un modĂšle créé par son labo et utilisĂ© par un industriel pour vĂ©rifier en amont les rĂ©glages prĂ©vus.

Vient ensuite Ivan Liebgott : Matlab et simulink pour l’enseignement des sciences de l’ingĂ©nieur. Cette prĂ©sentation montre quel type d’activitĂ© peut ĂȘtre prĂ©sentĂ© dans des lycĂ©es pour illustrer la modĂ©lisation, l’écart avec le rĂ©el


Pour terminer, Paul Cox : Innover en connectant Matlab et simulink Ă  votre matĂ©riel. J’aurais bien passĂ© une journĂ©e complĂšte avec Paul :) On a droit Ă  une belle dĂ©monstration de la surcharge du firmware d’un drone Parrot par un comportement issus de Matlab. Il ne sera pas avare en explications sur les possibilitĂ©s d’interaction entre Matlab et divers matĂ©riels.

Il nous faut à présent retourner en session finale, mais je vous avoue avoir saisi ce moment pour récupérer mes affaires et dire au revoir à toutes les remarquables personnes croisées ce jour.

Je profite pour ajouter une petite note issue de mes petits essais en rentrant Ă  la maison. Mes essais avec mes cartes arduino se sont plutĂŽt bien passĂ©s, je n’ai juste pas rĂ©ussi Ă  faire reconnaitre ma MicroView, mais je creuserai.

Par contre, impossible d’utiliser Matlab avec la brique NXT de Lego que j’ai : je suis sous Mac Osx et Linux. Je peux comprendre en partie, vu que le logiciel de base est uniquement fourni sous Windows.

Ce que j’ai plus de mal Ă  digĂ©rer, c’est la limitation Ă  Matlab sous Windows de la partie hardware Raspberry. C’est quand mĂȘme un comble de ne pouvoir piloter mes Pi qui sont de purs produits unix. Bon, j’ai encore mis un commentaire sur le package Raspberry Ă  ce sujet, on verra.

J’espĂšre pouvoir trĂšs vite vous reparler de Matlab, il faut encore que je rĂ©cupĂšre quelques plans et modĂšles que les Ă©quipes Ă©duc de Mathworks doivent me faire parvenir. Je suis mĂȘme prĂȘt Ă  transfĂ©rer Matlab sur une machine Windows s’il le faut temporairement :)

A bientĂŽt !

Découvrons Sqlite - 3

Lors du dernier article, nous avions vu comment effectuer quelques opérations simples depuis Python pour manipuler une base Sqlite.

Mais certains d’entre vous se posaient quelques questions.
Dans l’ensemble, la rĂ©ponse gĂ©nĂ©rale serait d’aller voir la documentation de Sqlite puis de reporter les instructions SQL dans la commande execute de la connection.

Prenons un exemple : en reprenant notre table PERSONNES, essayons de récupérer les enregistrements des personnes ayant un ùge égal à 11.

Si vous vouliez Ă©crire une requĂȘte directement dans Sqlite, vous Ă©cririez :

sqlite> SELECT * FROM PERSONNES WHERE AGE=11;
4|Nono|11
5|Tom|11

Il suffit alors de retranscrire ces instructions dans un code Python :

>>> import sqlite3
>>> conn = sqlite3.connect("tonton.db")
>>> cur = conn.cursor()
>>> cur.execute("SELECT * FROM PERSONNES WHERE AGE=11")
<sqlite3.Cursor object at 0x7f50a05586c0>
>>> cur.fetchall()
[(4, u'Nono', 11), (5, u'Tom', 11)]

Ce n’est pas si compliquĂ© finalement ! ;)

Découvrons Sqlite - 2

Comme nous l’avons vu dans le premier article, nous savons maintenant crĂ©er une table, insĂ©rer des donnĂ©es et les visualiser.

Oui, mais là, vous allez dire “Tonton, tu nous arnaques, on avait dit depuis Python”.
Ok, mais il fallait bien voir comment le faire depuis Sqlite, promis ça vous servira.

Pour interagir avec Sqlite depuis Python, il faut le module sqlite3.
Heureusement, ce module est inclus dans la distribution de Python depuis la version 2.5.
Pour vĂ©rifier la prĂ©sence du module, lancez Python en ligne de commande et faites juste un import sqlite3. Si vous avez un message d’erreur comme celui ci dessous, faites moi un email pour que je vous aide.

>>> import sqlite3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named sqlite3

Avec ce module, nous allons pouvoir nous connecter Ă  notre base :

>>> import sqlite3
>>> conn =sqlite3.connect("tonton.db")

La fonction connect prend pour paramĂštre le nom du fichier de la base.
Si vous le souhaitez, vous pouvez indiquer un chemin complet comme par exemple :

>>> import sqlite3
>>> conn =sqlite3.connect("/home/tonton/projects/tontoncodeur/tonton.db")

Ou si vous utilisez Windows :

>>> import sqlite3
>>> conn =sqlite3.connect("C:/projects/tontoncodeur/tonton.db")

Il faut ensuite crĂ©er l’objet qui nous servira Ă  effectuer nos opĂ©rations sur la base Sqlite :

>>> import sqlite3
>>> conn =sqlite3.connect("tonton.db") 
>>> cur =conn.cursor()

Nous pouvons alors vérifier le contenu de notre table.
Le principe est simple, nous demandons Ă  l’objet cursor d’exĂ©cuter notre commande SQL :

>>> import sqlite3
>>> conn =sqlite3.connect("tonton.db") 
>>> cur =conn.cursor()
>>> cur.execute("SELECT * FROM PERSONNES")
<sqlite3.Cursor object at 0x7f41dce2e6c0>
>>> data = cur.fetchone()
>>> print data
(1, u'Bob', 32)

La commande fetchone() nous a permis de récupérer le premier enregistrement de notre table.
Mais comment faire losqu’il y a plusieurs enregistrements ?

Pour le savoir, commençons par insĂ©rer d’autres enregistrements :

>>> import sqlite3
>>> conn =sqlite3.connect("tonton.db") 
>>> cur =conn.cursor()
>>> cur.execute("SELECT * FROM PERSONNES")

Nous pouvons alors vérifier le contenu de la table en utilisant une nouvelle fonction fetchall().
Elle nous retournera le tuple de tous les enregistrements.

>>> import sqlite3
>>> conn =sqlite3.connect("tonton.db") 
>>> cur =conn.cursor()
>>> cur.execute("SELECT * FROM PERSONNES")
>>> cur.fetchall()
[(1, u'Bob', 32), (2, u'Fanta', 33), (3, u'Titi', 43)]

Pourquoi ne pas profiter alors de Python pour insérer plusieurs lignes de maniÚre plus programmée ?
Allons y :

>>> import sqlite3
>>> conn =sqlite3.connect("tonton.db") 
>>> cur =conn.cursor()
>>> donnees = [(4, 'Nono', 11), (5, 'Tom', 11), (6, 'Rosa', 14)]
>>> for ligne in donnees:
...     cur.execute("INSERT INTO PERSONNES(ID, NOM, AGE) VALUES(?,?,?)", ligne)
... 
<sqlite3.Cursor object at 0x7f41dce2e6c0>
<sqlite3.Cursor object at 0x7f41dce2e6c0>
<sqlite3.Cursor object at 0x7f41dce2e6c0>
>>> conn.commit()

Nous avons donc parcouru la variable donnees et inséré dans la table PERSONNES en utilisant les caractÚres ? dans la partie VALUES de notre commande.
Ces points d’interrogation sont remplacĂ©s par les valeurs fournies par la variable ligne.
Pour finir, nous appelons la fonction commit() qui indique que nous désirons bien sauvegarder tous ces changements.

Tout ça est assez simple non ?

Par ailleurs, si programmer en Python vous intĂ©resse et que vous ĂȘtes au collĂšge, je connais un jeune padawan avec qui vous pourriez Ă©changer.

Comme toujours, n’hĂ©sitez pas Ă  me contacter pour toute question ou souci que vous auriez.

Découvrons Sqlite - 1

Coucou Ă  tous !

MĂȘme en vacances, Tonton Codeur pense Ă  vous. Remarquez qu’il est difficile de vous oublier grĂące Ă  vos gentils emails.

Il semblerait que parmi vous se cache un futur Zuckerberg. Pour rĂ©volutionner le monde des rĂ©seaux sociaux, il se pose quelques questions sur l’utilisation d’une base de donnĂ©e.

Nous allons donc tous ensemble jeter un oeil Ă  l’utilisation de la base de donnĂ©e Sqlite avec Python.

Je n’aborderai pas l’installation de Sqlite et Python pour 2 raisons : notre rĂ©volutionnaire l’a dĂ©jĂ  fait et si vous Ă©tiez sur un OS libre, vous les auriez dĂ©jĂ  ;)
Bon, OK, si vous bloquez, vous pouvez me faire un email et je vous aiderai.

Pour nos petits exercices, nous allons créer une simple petite base avec Sqlite.
Ce qu’il faut savoir, c’est que Sqlite est une base de donnĂ©e toute simple qui se contente de tout stocker dans un fichier.

Pour commencer, créez un répertoire pour nos petits exercices.
Lancez votre ligne de commande et mettez vous dans ce répertoire.
Il vous suffira alors de lancer la commande :

sqlite3

Vous obtenez donc les informations suivantes Ă  l’écran.

~/projects/tontoncodeur$ sqlite3 
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

Une fois ainsi, toutes les commandes seront des commandes de Sqlite. Une fois terminé vos opérations, vous pouvez quitter Sqlite par la commande :

.sqlite

Pour pouvoir utiliser Sqlite depuis un script Python, nous allons créer une table et quelques données, ce sera plus pratique. Pour créer une table nous utiliserons la commande Sqlite CREATE TABLE

sqlite3 tonton.db
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> CREATE TABLE PERSONNES
   ...> (ID INT PRIMARY KEY NOT NULL,
   ...> NOM TEXT,
   ...> AGE INT);

La commande sqlite3 tonton.db permet de dire qu’on va travailler avec la base tonton.db.
Si elle existe, on se connecte, si elle n’existait pas, elle la crĂ©e.
Vous aurez alors un fichier tonton.db dans votre répertoire.

La premiÚre instruction qui suit est compréhensible :
on crée une table qui se nommera PERSONNES.
Tout ce qui suit entre les parenthÚses définira les différentes colonnes de la table.

La premiÚre colonne sera un entier appelé ID qui servira de clé primaire.
Cette clé est utilisé par Sqlite pour accélérer ses recherches et vous servira à identifier vos enregistrements.
La seconde colonne sera le nom stocké dans un texte.
La derniùre sera l’ñge.

Pas mal non ?
Nous avons donc maintenant une table.
Il nous reste à insérer des données et les voir ensuite..

Pour ajouter des données, Sqlite utilise une commande appelée INSERT.
Par exemple, ajoutons une personne qui aura pour NOM Bob et agée de 32 ans :

sqlite> INSERT INTO PERSONNES(ID, NOM, AGE)
   ...> VALUES(1, "Bob", "32");

La premiĂšre partie de la commande INSERT indique les colonnes qui vont ĂȘtre utilisĂ©es.
La seconde indique les valeurs que nous allons insérer.

Pour vĂ©rifier que les donnĂ©es sont lĂ , il suffit alors d’utiliser la commande SELECT qui permet de voir le contenu d’une table.

sqlite> SELECT * FROM PERSONNES;
1|Bob|32

La commande SELECT permet de choisir les colonnes affichées, ou toutes si on utilise le caractÚre *.
Le mot FROM est utilisé pour indiquer la table qui sera consultée.

C’est tout simple non ?

Trùs vite, l’article suivant parlera de l’interaction possible entre Ptyhon et Sqlite.

Bonne vacances Ă  tous.

A La Découverte De Phaser - 5

Voici la suite de la traduction du tutoriel écrit par Alvin Ourad et Richard Davey.
Elle commence dans ce premier article
Puis se poursuit avec ce second article
Alors que le troisiĂšme article est lĂ Logiquement, il y a eu ce quatriĂšme article

Nous en étions resté au moment ou le joueur tombait en ignorant le sol que nous avions créé.

La raison est simple : nous ne testons pas encore la collision entre le sol et le joueur.
Nous avons dĂ©jĂ  indiquĂ© Ă  Phaser que notre sol et nos plateformes Ă©taient inamovibles. Si nous ne l’avions pas fait, le joueur les aurait rencontrĂ©, aurait marquĂ© un temps d’arrĂȘt, puis tous les Ă©lements se seraient dispersĂ©s.
A moins d’indiquer le contraire, le Sprite du sol est un objet physique qui peut se dĂ©placer (appellĂ© aussi corps dynamique) et quand le joueur le percute, les forces rĂ©sultantes sont appliquĂ©es au sol, et les deux objects modifient leur vĂ©locitĂ©s et le sol se met Ă  tomber lui aussi.

Donc, pour permettre au joueur d’entrer en collision et d’utiliser les propriĂ©tĂ©s physiques, nous devons ajouter un test de collision dans la fonction update :

function update() {

    game.physics.arcade.collide(player, platforms);

}

La fonction update est appelée par la boucle de jeu toutes les frames. La fonction Physics.collide est celle qui fait toute la magie. Elle utilise deux objets pour tester la collision et les sépare. Dans notre cas, nous lui passons notre Sprite de joueur et le Group de plateformes. Cette fonction est suffisament maline pour vérifier la collision avec chaque membre du Group. Cet appel va donc vérifier les collisions avec le sol et les plateformes.

Le résultat est une plateforme solide:

part6

ContrĂŽler le jouer avec le clavier

GĂ©rer les collisions, c’est bien beau, mais nous avons besoin de faire bouger le joueur. Peut ĂȘtre ĂȘtes vous tentĂ©s de plonger dans la documentation et chercher comment ajouter des event et les Ă©couter, mais ce n’est pas utile ici.
Phaser inclus un gestionnaire de clavier et un des avantages de l’utiliser est cette petite fonction bien pratique :

cursors = game.input.keyboard.createCursorKeys();

Cela va peupler l’objet cursors avec quatre propriĂ©tĂ©s : up , down , left , right (NdT : haut, bas, gauche, droite) qui sont des instances des objets Phaser.key. Tout ce qu’il nous reste Ă  faire est d’aller vĂ©rifier ces instances Ă  chaque boucle :

    //  Reset the players velocity (movement)
    player.body.velocity.x = 0;

    if (cursors.left.isDown)
    {
        //  Move to the left
        player.body.velocity.x = -150;

        player.animations.play('left');
    }
    else if (cursors.right.isDown)
    {
        //  Move to the right
        player.body.velocity.x = 150;

        player.animations.play('right');
    }
    else
    {
        //  Stand still
        player.animations.stop();

        player.frame = 4;
    }

    //  Allow the player to jump if they are touching the ground.
    if (cursors.up.isDown && player.body.touching.down)
    {
        player.body.velocity.y = -350;
    }

MĂȘme si nous venons d’ajouter pas mal de code, cela devrait rester assez lisible.
La premiÚre chose que nous faisons est de réinitialiser la vélocité horizontale du Sprite.
Nous vĂ©rifions ensuite si la flĂšche vers le bas est appuyĂ©e. Si c’est le cas, nous appliquons une vĂ©locitĂ© horizontale nĂ©gative et nous dĂ©clenchons l’animation de course Ă  gauche.
Si Ă  la place nous avons la touche flĂšche vers la droite appuyĂ©e, nous faisons exactement l’inverse.
En remettant Ă  zĂ©ro la vĂ©locitĂ© et en la modifiant de cette façon Ă  chaque frame , cela crĂ©e un mouvement de type “stoppe-repart”.

Le Sprite du joueur ne bougera que lorsqu’une touche est appuyĂ©e et s’arrĂȘte immĂ©diatement quand ce n’est plus le cas.
Phaser vous permet de crĂ©er des mouvements plus complexes, avec de l’inertie et de l’accĂ©lĂ©ration, mais nous nous satisferons de notre mouvement pour ce jeu.
La derniĂšre portion de code remet le sprite du joueur avec la frame 4 si aucune touche n’est appuyĂ©e. La frame 4 dans la feuille de Sprite est celle oĂč le joueur vous regarde, immobile.

Sautons

La derniĂšre portion de code ajoute la possibilitĂ© de sauter. La touche flĂȘche vers le haut sera la touche de saut et nous testons si elle est appuyĂ©e.
MalgrĂ© tout, nous testerons Ă©galement si le joueur touche le sol, sinon il pourait sauter alors qu’il serait dĂ©jĂ  dans les airs.
Si ces deux conditions sont respectées, nous appliquons une vélocité verticale de 350 pixel/sec.
Le joueur retombera vers le sol automatiquement grùce à la valeur de gravité que nous lui appliquons.
Essayez de jouer avec des valeurs plus ou moins grandes que 350 pour voir l’effet produit.

part7

Pluie d’étoiles

Il est grand temps de donner un but à notre petit jeu. Faisons pleuvoir des étoiles sur la scÚne et permettons au joueur de les ramasser.
Pour y parvenir, nous allons crĂ©er un Group appelĂ© ‘stars’ et nous le peuplerons. Dans notre fonction create , nous ajoutons le code suivant (qui peut ĂȘtre vu dans le fichier part8.html)

    stars = game.add.group();

    stars.enableBody = true;

    //  Here we'll create 12 of them evenly spaced apart
    for (var i = 0; i < 12; i++)
    {
        //  Create a star inside of the 'stars' group
        var star = stars.create(i * 70, 0, 'star');

        //  Let gravity do its thing
        star.body.gravity.y = 6;

        //  This just gives each star a slightly random bounce value
        star.body.bounce.y = 0.7 + Math.random() * 0.2;
    }

Le procĂ©dĂ© utilisĂ© est similaire Ă  celui que nous avons utilisĂ© pour le Group de plateformes. En utilisant l’instruction de boucle for de Javascript, nous indiquons que nous crĂ©ons 12 Ă©toiles dans notre jeu.
Elles ont une coordonnée x de i * 70 , ce qui signifie que nous les répartissons équitablement dans la scÚne tous les 70 pixels.
Comme pour le joueur, nous leur donnons une gravitĂ© pour qu’elles tombent, et une valeur de bounce (NdT : rebond) pour qu’elle rebondissent un peu quand elles touchent les plateformes.
Le rebond bounce a une valeur entre 0 (pas de rebond du tout) et 1 (rebond total). Les notres rebondiront avec une valeur entre 0,7 et 0,9. Si nous executions le code tel que, les Ă©toiles tomberaient et passeraient Ă  travers le bas du jeu. Pour arrĂȘter ce phĂ©nomĂšne, nous devons vĂ©rifier les collisions entre les Ă©toiles et les plaformes au sein de notre boucle for :

game.physics.arcade.collide(stars, platforms);

Nous en profiterons pour tester si le joueur et les Ă©toiles ne partagent pas la mĂȘme zone de jeu.

game.physics.arcade.overlap(player, stars, collectStar, null, this);

Cela indique Ă  Phaser qu’il doit vĂ©rifier les recoupements entre le joueur et chacune des Ă©toiles du Group. S’il trouve un recoupement, il passe ces Ă©lĂ©ments Ă  la fonction ‘collecStar’

function collectStar (player, star) {

    // Removes the star from the screen
    star.kill();

}

L’étoile est alors simplement Ă©liminĂ©e par l’instruction kill , ce qui a pour effet de la retirer de l’affichage. Le jeu a donc maintenant un joueur qui peut librement se ballader, sauter, bondir des plateformes et ramasser les Ă©toiles qui tombent du ciel.
Pas mal pour quelques lignes de code que l’on peut qualifier d’assez lisibles :)

part8

Touche finale

La derniĂšre petite modification que nous allons faire va consister Ă  ajouter un score.
Pour cela, nous allons utiliser un objet Phaser.Text.
Nous crĂ©erons deux nouvelles variables, une qui contiendra le score actuel et l’autre l’objet texte lui mĂȘme :

var score = 0;
var scoreText;

Le scoreText est paramétré dans la fonction create :

scoreText = game.add.text(16, 16, 'score: 0', { fontSize: '32px', fill: '#000' });

Les deux premiers paramĂštres 16,16 reprĂ©sentent les coordonnĂ©es d’affichage du texte. ‘score: 0’ est la chaĂźne par dĂ©faut qui sera affichĂ©e et l’objet qui suit contient la taille de la fonte et sa couleur de remplissage. En ne prĂ©cisant pas la fonte, nous allons en fait utiliser celle que le navigateur choisira par dĂ©faut, ce qui correspond Ă  Arial sous Windows par exemple.

Nous allons devoir ensuite modifier la fonction collectStar pour que lorsque le joueur attrape une étoile son score augmente et le texte est mis à jour pour refléter ce changement :

function collectStar (player, star) {

    // Removes the star from the screen
    star.kill();

    //  Add and update the score
    score += 10;
    scoreText.text = 'Score: ' + score;

}

Donc 10 points seront ajoutés pour chaque étoile et le texte du score scoreText est mis à jour avec le nouveau total.
Si vous ouvrez le fichier part9.html vous verrez le jeu au final.

part9

Conclusion

Vous avez appris comment crĂ©er un Sprite avec des propriĂ©tĂ©s physiques, Ă  contrĂŽler son dĂ©placement et le faire interagir avec d’autres objets dans un petit jeu.
Il y a beaucoup d’autres choses que vous pouvez rĂ©aliser pour l’amĂ©liorer, par exemple ajouter une fin ou un but. Pourquoi ne pas ajouter des pieux qu’il faudrait Ă©viter ? Vous pourriez crĂ©er un nouveau Group ‘spikes’ (NdT: pieux) et vĂ©rifier les collisions avec le joueur, puis vous feriez disparaitre le joueur au lieu du pieu. Ou pour un style de jeu non violent, faire du jeu une course contre la montre et simplement dĂ©fier les joueurs de ramasser les Ă©toiles le plus vite possible.
Nous avons inclus d’autres ressources graphiques dans le fichier zip de ce tutoriel pour vous inspirer.

Avec l’aide de ce que vous avez appris dans ce tutoriel et les plus de 250 exemples à votre disposition, vous devrier alors aboir de solides fondations pour un projet futur.
Mais comme toujours, si vous avez des questions, si vous avez besoin d’un conseil ou si vous souhaitez partager vos travaux, n’hĂ©sitez pas Ă  demander de l’aide dans le forum Phaser.

Conclusion de la traduction

J’ajouterai que comme toujours, je rĂ©pond avec plaisir aux commentaires et emails.
Merci de votre patience et si je vois qu’il y a des motivĂ©s pour continuer l’aventure, je prendrai un peu de temps pour rĂ©diger une suite Ă  ce tutoriel.
Qui sait, Alvin ou Richard feront alors une traduction anglaise ;)

Amusez vous, codez comme des fous, Ă  bientĂŽt.