Atelier : Programmez un Casse briques en seulement 120 lignes de code

Retour au parcours BASES

Programmer un jeu de casse briques en 120 lignes de code

A la fin de cet atelier de formation, accessible aux débutants, vous aurez créé votre premier jeu vidéo, basé sur un principe universel imaginé par Atari en 1976 sous le nom de Breakout.  Et ceci en 120 lignes de code seulement et en partant de zéro.

Voici les fonctionnalités que vous allez mettre en place :

  • Une raquette qui se déplace avec les mouvements de votre souris
  • Une balle que l’on lance en cliquant
  • Celle-ci va ensuite rebondir sur les murs, les briques, et la raquette
  • Lorsqu’une brique est touchée, elle est détruite et la balle inverse sa course

La mécanique du casse brique a été popularisée par Atari en 1976 avec le jeu Breakout, lui-même étant une évolution du célèbre Pong. Plus tard, c’est Arkanoid qui remettra le genre sur le devant de la scène. Mais également de nombreux autres clones pour ordinateurs personnels. Mon favori étant Crystal Hammer, sur Amiga.

La mécanique, à la base, est très simple et ne nécessite aucune expertise mathématique. Le code que je vais vous enseigner est volontairement le plus simple possible, afin d’éviter de vous faire aborder des concepts inutiles à ce stade de votre apprentissage.

Pour suivre cet atelier, vous devez avoir suivi l’atelier « Les bases de la programmation » en Lua avec Love2D.

Nombre de vidéos: 7
Durée totale des vidéos: 1h30
Langage(s): Lua
Framework(s) / Moteur(s): Love2D

 

82 réflexions au sujet de “Atelier : Programmez un Casse briques en seulement 120 lignes de code”

  1. Badge 3 Terminé.
    Sur cet atelier Casse Brique mon objectif était de le faire en pratiquant le code.
    A chaque vidéo, je la regarde et j’essaie de la reproduire, pour ensuite à la fin refaire l’atelier entièrement sans aide.
    J’y suis presque arrivé, ma seule erreur fut la variable « bx = bx + brique.largeur » que j’ai mis dans la boucle if et non dans la boucle « for c.. ».
    En faisant cette erreur cela efface les briques dans l’ordre et non la brique touchée par la balle.

    Mon erreur:
    local bx,by = 0,0
    local l,c
    for l = 1,6 do
    bx = 0
    for c = 1,15 do
    if niveau[l][c] == 1 then
    love.graphics.rectangle( « fill » , bx +1 , by +1 , brique.largeur -2 , brique.hauteur -2)
    bx = bx + brique.largeur
    end
    end
    by = by + brique.hauteur
    end

    Merci David

  2. J’ai essayé de faire une partie gauche et droite sur le pad pour influencer la direction de la balle en fonction de son point de contact avec la barre ( pad) mais ce n’est pas encore ça 😉

  3. Bonjour David, bonjour à tous
    j’ai travaillé autour de ces leçons avec un tableau sous cette forme
    niveau {{,1,1,1,1,1,1,1,…},{2,2,2,2,2,2,2,..}} avec la mise en place de briques en couleur (brique.png) , une raquette (pad.png).
    j’ai testé les rebonds sur la raquette avec des changements de direction en fonction de la position de la balle sur la raquette, mais cela est resté très aléatoire, si vous avez une solution, une idée.
    Merci, à bientôt

  4. Je suis à la fin de l’atelier, le casse brique est censé fonctionner sauf qu’il ne réagit pas avec les 1ères briques (uniquement la 1er colonne ne partant du haut) et du coup au lieu de supprimer 1 seule brique il supprime la colonne entière. j’ai vérifie et revérifié que

    if l >= 1 and l = 1 and c <= 15 then
    if niveau [l][c] == 1 then
    balle.vy = 0 – balle.vy
    niveau[l][c] = 0

    soit biens comme dans la video mais rien n'y fait il n'y a aucune collision avec la brique. Quelqu'un pourrais t'il m'éclairer;

  5. J’ai passé pas mal de temps à refaire les deux derniers ateliers . J’ai réécrit plusieurs fois les codes avec des erreurs . En fait quand tu reprends une copie blanche la vraie difficulté c’est la logique de programmation que j’ai du mal à intégrer . Bien souvent le code au début on le refait de mémoire mais ça ne suffit pas .
    En tout cas merci David , beaucoup « d’info » à digérer rien que dans ce premier parcours ça promet …
    @+

  6. Bonjour David, bonjour à toutes et à tous,

    Comme cela est dit plus haut, partir d’une feuille blanche et arriver un code sans bugs et qui fonctionne bien demande pas mal de temps et de réflexion…

    j’ai passé une bonne demi-heure sur un écran bleu de love2D qui m’affichait 128 attempt to index a nil value.
    La ligne 128 était if niveau[l][c] == 1 then : pas de mauvaise frappe dans les variables ni le chiffre 1 à la place du l.

    Mon erreur : fouiller dans un tableau qui n’a pas été construit : la fonction démarre a bien été déclarée avec la construction du tableau, mais j’ai tout simplement oublié de l’appeler dans mon code et ça se passait 56 lignes plus haut !!!

    Bon code.

    Bond51

  7. bonjour,
    j’ai un souci avec l’atelier casse brique – la balle. Malgré ‘avoir lu plusieurs fois il reste bloqué à 74% et ne se valide pas.
    Sinon j’ai constaté que la raquette rentrait dans les murs. Je vais essayer de coder une solution comme exercice

  8. bonjour,
    donc pour que la raquette ne sorte pas de motié de l’écran j’ai trouvé comme solution :
    function love.update(dt)
    — la raquette doit suivre la souris
    pad.x = love.mouse.getX()
    if pad.x == 0 then
    pad.x = pad.largeur/2
    elseif pad.x == largeur – 1 then
    pad.x = (largeur – 1) – pad.largeur/2
    end
    — le reste du code
    end
    j’ai pas mal galéré pour la largeur parce que j’ai utilisé instinctivement largeur mais en fait il faut prendre largeur – 1 : oubli d’une information trivial du système de coordonnées de l’écran

  9. Bonsoir à tous,
    Je passe un moment sur cet atelier que j’ai essayé de refaire plusieurs fois en partant d’une page vi
    C’est vrai qu’après plusieurs tentatives les concepts de la programmation me semble plus clairs mais c’est la logique qui me manque dans le process d’organiser mon code.
    Bref j’ai réussi à changer le pad et mettre un pad de couleur pris sur une spritesheet, idem pour les briques. Par contre je bloque vraiment sur les tableaux.
    Je souhaiterai par exemple pouvoir afficher 1 brique sur 2 d’une autre couleur.
    Je n’arrive pas à comprendre comment écrire ce code pour afficher cela?
    Merci par avance

  10. A ce stade c’est normal. Tu en es au tout début, tu manques de pratique, ton esprit n’est pas entrainé pour déduire de nouveaux concepts de programmation.
    Pourtant, si je te le dis, tu verras que tu as toutes les connaissances pour gérer des couleurs. C’est juste que tu manques de pratique. Je te conseille de passer aux ateliers suivants.
    Je te donne tout de même une piste : tu désignes les briques par un 1, et l’absence de brique par le 0… rien ne t’empêche de décider que 1 c’est une couleur, et 2 une autre.
    Ensuite, tu as juste à utiliser les « if » au bon endroit, notamment au moment de l’affichage pour dire « si c’est 1 alors c’est bleu, sinon si c’est 2 c’est rouge, etc. ». Mais aussi de considérer que 2 est une valeur acceptable pour détecter une collision avec la balle… etc. Mais encore une fois, tout ça est peut être un peu trop tôt pour toi.

  11. Bonjour, je suis face à un étrange problème : lors de l’étape pour faire rebondir la balle sur le pad, je n’arrive tout simplement pas à la faire. Ou plutôt : le programme n’arrive pas à le faire. J’ai décidé de copier littéralement sur le tutoriel, j’ai télécharger la version finie du programme, rien n’y fait. J’ai vérifié tout ce qui était possible dans toutes les lignes de codes, je n’ai rien trouvé. En plus, ne m’indique pas « Erreur » lorsque je le lance, il fait le programme normalement, mais sans faire rebondir la balle sur le pad. J’ai donc décide recommencer depuis le début, j’ai supprimé le programme (ce qui n’était pas une bonne idée je l’avoue) et je suis reparti de zéro. Je fait un premier test pour tester le dessin du rectangle, et sans aucun code qu’il le demande, le rectangle se met à suivre ma souris. C’est à ce demander si c’est pas mon PC qui a un problème. Pourriez vous-me guidez s’il vous plaît ?

    Merci d’avance.

  12. J’ai oublié de préciser, que Love m’indique une erreur sur « cos » à la ligne 63 qui a une valeur « nil » quand je lance clique alors que le programme est lancé que j’ai recommencé, alors qu’il ne fait qu’une quinzaine de ligne. C’est comme si ZeroBrane avait oublié que j’ai avait effacé le programme…

  13. En ce qui concerne l’erreur du nouveau programme que j’ai fait c’est réglé, j’avait tout simplement oublié de changer le Projct directory…

  14. De toute évidence tu n’as pas fixé le répertoire de travail de ZB (menu projet / répertoire de projet ».
    Pour le rebond, vu que tu ne testais sûrement pas le bon projet, j’attend que tu ai configuré correctement pour te répondre.

  15. pfiouu enfin fini,
    le cerveau a un peu chauffé

    par contre je me demandais
    dans la ligne pour en
    « `lua
    if l 0 and c >= 1 and c = 1 and c <=15 est reellement necéssaire?
    ca marche tres bien sans

  16. (probleme de frappe)
    je voulais dire dans
    if l 0 and c >= 1 and c = 1 and c <=15
    est vraiment necessaire
    (c est embettant qu on ne puisse pas modifier nos commentaire)

  17. Génial, bravo pour ta détermination l’ami.
    Je viens de finir l’atelier en le suivant pas à pas. Je vais aussi tenter de le refaire par moi-même avant de passer au suivant.

  18. Bon…
    Va clairement falloir que je passe du tout sur les boucles parce que c’est très flou pour moi. L’array je vois comment ça se passe, la double boucle de draw je m’entirai si je disai tout comprendre.

    Ok, demain on relit tout ça, on comprends et on le retape sans autre aide que le wiki.

    Merci David

  19. T’inquiette Ronan ça m’est aussi arrivé … Il n’y a rien de plus chiant que de croire que l’on travaille sur un fichier alors qu’on est sur un autre 🙂

  20. Je me demandais s’il était possible avec love de contrôler la vitesse du pad ou plutôt de pouvoir contrôler la vitesse de la souris (du déplacement du curseur dans la fenêtre de jeu) pour le coup.

    Je demande peut être un truc qui demande un niveau plus évolué en programmation pour le coup, mais je trouverais ça intéressant de pouvoir faire varier la vitesse du pad selon le niveau de difficulté ou bien selon qu’on ai ramassé un item de boost.

    Par exemple au début du jeu le pad bouge au maximum de tant de pixel par seconde mais au fur et a mesure qu’on avance dans les niveau le pad a une vitesse max moins élevée pour augmenter la difficulté

    Ou bien le pad vas a une vitesse normale de base mais grâce a un item boost qu’on peut ramasser alors on a un pad qui peux aller plus vite ou au contraire avec un item de malus on a un pad qui vas plus lentement.

  21. Comme le pad est lié au déplacement de la souris, il faudrait alors diminuer la sensibilité de la souris pour que son déplacement soit plus lent (ou plus rapide).

    Peut-être que c’est faisable en bricolant avec les fonctions de love.mouse et love.mousemoved (voir LOVE wiki pour tous les paramètres de ces fonctions).

    Sinon une autre solution, serait d’utiliser les touches « left » et « right » pour le déplacement horizontal du pad. Dans ce cas tu pourrais facilement contrôler la vitesse de ton pad.

  22. En passant la progression de la 3e vidéo « Love2D – Casse brique – La balle » bloque à 74% (même si on a visionné la totalité de la vidéo) puisque la vidéo affiche une durée de 6 min et 58 sec, mais dans les faits, elle ne dure qu’environ 5 minutes.

  23. Fini ce premier chapitre, j’ai ajouté les images du pack fourni dans la source, c’est à dire pour les briques, la raquette et les murs, j’ai donc modifié un peu le code pour intégrer l’épaisseur des murs et du « plafond » lors des rebonds de la balle … Hâte de découvrir le prochain atelier …

  24. En exercice, premièrement je me suis amusé à reproduire les bases de ce casse-brique sans regarder le code de David, jusqu’à l’étape ou on ajoute les briques. Et étonnamment j’ai réussis sans erreur ! Ce que je n’avais pas réussis a faire sur l’atelier précédent. Faut croire que la logique de la programmation commence à rentrer.

    A partir de là, je suis partis sur autre chose. J’ai créé une plate-forme qui se déplace de gauche à droite sur l’écran et qui change de direction quand elle arrive au bout de l’écran. Elle fait rebondir la balle quand cette dernière rentre en collision avec elle.

    Ensuite j’ai créé un vaisseau qui se déplace également de gauche à droite derrière la plate-forme qu’il faut réussir à toucher avec la balle. Quand le vaisseau est touché il est détruit. Enfin pas réellement, je sais juste faire en sorte qu’il disparaisse et ne s’affiche plus (comme avec les moteurs du vaisseau de l’atelier de lunar lander).

    Dans l’ensemble tout à l’air de fonctionner même si le code n’est surement pas optimisé.

  25. Bonjour à tous.
    Je viens de terminer ce 1er atelier.
    C’est vraiment passionnant d’arriver à un tel résultat avec si peu de ligne de code.
    Je vais m’exercer à le modifier poir voir ce que je peux faire avant de commencer un autre atelier.
    Merci à David et à toute l’équipe.

  26. Bonjour à tous,

    Après avoir terminé cet atelier, je me suis lancé comme défi d’ajouter toutes les pistes d’amélioration suggérées par David (voir la fin de la vidéo).
    J’ai donc ajouté les modifications suivantes:
    – Légère amélioration/optimisation du code d’origine (définition de la taille d’une brique en fonction de la taille de l’écran et du nombre de briques voulues par ligne/colonne, remplacement des chiffres dans les diverses boucles par des paramètres afin d’automatiser le code si l’on décide de changer le nombre de briques par ligne/colonne)
    – Ajouter différent type de briques (Normal, incassable, ajoutant des bonus) avec différentes couleurs
    – Ajouter des effets bonus (taille du pad augmenté, vitesse augmentée)
    – Ajouter une vie à la brique (nombre de fois à toucher avant de la faire disparaître, pouvant être unique à chaque brique)
    – Nouveau système de collision avec le pad (intégrant une gestion de l’angle de sortie)
    – Nouveau système de collision avec les briques (intégrant le même comportement qu’un vrai casse brique)

    Si jamais vous essayez de faire des modifications similaires et que vous êtes bloqué, n’hésitez pas à me poser des questions.

    Bon courage à tous pour la suite et bon code 🙂

  27. Pour la gestion du ball.vx de sortie après collision avec le pad j’ai codé ça :

    `function angle(balleX, padX)
    local vx = 800 * (balleX-padX)/pad.largeur
    return vx
    end`

    J’étais parti sur du cosinus comme suggéré mais ça se simplifiait en math.acos(math.cos(truc)) donc truc.

    Reste à ajouter plein de petites options. Ca me rappelle mes heures passées sur Alpha Bounce de Motion Twin.

  28. Bonsoir, bon Atelier terminé

    je progresse, après la première vidéo, j’ai réussi à coder et utiliser les touches de déplacement gauche / droite au lieu de la souris. Désolé, David, l’icone de la souris me perturbait, et à chaque fois que tu sors de l’écran de love tu perds le contact avec le pad. donc, retour au bon vieux système !

    J’ai des petites idées qui se bousculent pour retrouver des sensations que j’avais lorsque je jouais à ce jeu dans les années 80…

    Mais bon j’ai encore beaucoup de boulot à faire !
    Mais tes explications sont claires pour comprendre ce que l’on fait.
    Ah oui..autre chose apprise : le « l » et le « 1 »…ouais ! vachement important à ne pas confondre … j’ai bugger (Moi, pas mon PC ;-)) lorsque j’ai lancé le jeu et qu’à la place d’avoir une brique éliminée, j’ai eu une colonne complète qui a disparu… Mais j’y suis arrivé !

    Encore merci !

  29. Je n’ai pas encore finit l’atelier mais j’ai bien l’impression que la fonction love.mousepressed() n’est plus du tout d’actualitée. C’est love.mouse.isDown() maintenant, ça serait pas mal de mettre un petit mot à propos de ça au dessus de la vidéo.

  30. Heu tu confonds la fonction système love.mousepressed et l’API love.mouse.isDown().
    L’un est une fonction comme love.load / update / draw / keypressed et l’autre est une fonction de l’API qui s’appelle depuis update et renvoie un résultat.

  31. Ah my bad, love.mousepressed n’ayant jamais marché chez moi, je suis passé sur love.mouse.isDown(). Mais j’ai du faire une erreur quelque part qui empêchait le fonctionnement de mousepressed je suppose.

  32. Pour ma part, pour que la balle revienne sur le pad quand elle dépasse la hauteur j’ai juste appelé la fonction Demarre().

  33. Bonjour,

    C’est marrant comme ce qui vous parait pas évident un jour peux vous sembler plus accessible le lendemain. C’est une bonne phrase pour résumer mon sentiment sur cette atelier.
    Persévérence est mère de réussite.
    Mon but étant d’être capable de refaire l’atelier en y ajoutant quelques modifications mais sans revenir sur le cours. Objectif « presque » atteint.
    bon allez, atelier suivant.

  34. Bonjour à tous,
    Je ne suis qu’à la vidéo 2 de cet atelier, et j’ai un peu de mal à intégrer le fait que cette ligne de code place le point de départ du rectangle au centre, comme David le dit.
    love.graphics.rectangle(« fill », pad.x – (pad.largeur /2) , pad.y – (pad.hauteur /2 ), pad.largeur, pad.hauteur )

    La doc Love2D dit bien que :
    Synopsis

    love.graphics.rectangle( mode, x, y, width, height )

    Arguments

    DrawMode mode
    How to draw the rectangle.
    number x
    The position of top-left corner along the x-axis.
    number y
    The position of top-left corner along the y-axis.
    number width
    Width of the rectangle.
    number height
    Height of the rectangle.

    Donc le 2ème et 3ème nombre est bien la position de départ du rectangle.
    love.graphics.rectangle
    (« fill », 1 – (40 /2) , 200 – (20 /2 ), 40, 20 )
    (« fill », 1 – (20) , 200 – (10 ), 40, 20 )
    (« fill », -19 , 199, 40, 20 )

    Humm en fait en détaillant le calcul, j’ai compris!!
    En fait c’est une petite illusion de centrage..
    En fait je ne comprenais pas comment en déplaçant la souris, sur les bords gauches et droits, j’arrivais toujours au maximum jusqu’au centre du rectangle.
    En fait, love2D ne prend en compte les mouvements de la souris que pour une valeur comprise entre 0 et hauteurFenetre (ou largeurFenetre).
    Du coup voila tout s’explique.
    Au final, on ne dessine pas un rectangle à partir du centre de celui-ci mais on décale l’origine du rectangle pour donner l’illusion que le centre a changer.
    C’était plus un post. sur un raisonnement, je le post au cas ou ca pourrait aider d’autres.

  35. Super cet ateleir

    heheheh…notre imagination est notre seule limite

    ça y est je suis accro a gameCodeur

    Maintenant j’aborde C#

    En attendant amusez vous bien avec mon jeu inspiré des mouvements sociaux à paris

  36. Cet atelier est super,

    J’ai décidé de reprendre le casse brique tout et peut-être ajouter certaines idées. En plus cela m’a donné une idée d’un jeu que je pourrais faire.

    Merci de votre aide

  37. Bonjour à tous,

    J’ai un souci, quand je mets le « brique.x = 0 » et « brique.y = 0 » en début de code avec « local brique = {} » je suis quand même obligé de les remettre dans la fonction « love.draw » pour faire afficher les briques, pourquoi?

    Merci!

  38. Bonjour,

    J’allais poster exactement la même question que Codecodecodette. Ça me tourmente depuis hier où j’ai travaillé sur ce point de l’atelier. Je me dis que ça doit concerner la portée des variables mais pourtant on arrive quand même a accéder à pad.x, etc …. sans les déclarer de nouveaux dans le draw.

    Codement,
    Killian

  39. Bonjour à tous

    Concernant l’exercice.

    J’essaie de faire bouger ma raquette ( image png ) avec la souris et «  » img = love.mouse.getX() » » mais cela ne fonctionne pas. Dans la function love.draw(), love se lance avec love.graphics.rectangle mais cela fonctionne mais pas avec love.graphics.draw(img etc…)du coup je ne peut pas faire bouger mon image !

    Pourriez vous m’aidez ?

    Merci par avance de votre aide.. ça fait 4 h que je suis dessus !

    Voici mon petit code de débutant :

    io.stdout:setvbuf(‘no’)

    local img
    img = love.graphics.newImage(« images/barre.png »)

    if arg[#arg] == « -debug » then require(« mobdebug »).start() end

    function love.load()

    local largeur = love.graphics.getWidth()
    local hauteur = love.graphics.getHeight()

    print(« Largeur = », largeur)
    print(« Hauteur = », hauteur)

    end

    function love.update(dt)

    img = love.mouse.getX() —>>> si cette ligne est présente, love crash ! —-

    end

    function love.draw()

    love.graphics.draw(img,80,20,0,1,1,0,0,0,0)

    end

  40. Revise tes fondamentaux (ateliers précédents).
    1) tu passes a draw des coordonnées fixés donc normal que rien ne bouge
    2) tu attribue une valeur numérique (getX) a ton image ce qui prouve que tu ne sais pas vraiment ce que tu fais
    Tu as commencé cet atelier sans avoir compris et pratiqué les ateliers précédents. Si tu avais correctement pratiqué l’atelier lunar lander tu saurais positionner une image a une coordonnée
    Au travail ! 🙂

  41. Tiens, je l’ai fait aussi, mais codé différemment :

    if pad.x + 40 > largeur then
    pad.x = largeur – 40
    end — (faudrait trouver une variable pour ce 0 moche)
    if pad.x – 40 < 0 then
    pad.x = 0 + 40
    end

    La largeur du pad est de 80, et son X est au milieu, donc 40, c'est la moitié de sa largeur
    Doit y avoir moyen de faire ça plus conscit avec math.abs mais je vérrai plus tard

  42. C’est ce que j’ai fais avec le Lander, j’ai pris l’atelier point par point j’ai refais, et j’ai comme ça réussi à le faire, il n’y à eut que les détails pour le faire avancer qui m’ont donné du fil à retordre.

    Bon courage pour le prochain atelier

  43. C’est ce que j’ai fais avec le Lander, j’ai pris l’atelier point par point j’ai refais, et j’ai comme ça réussi à le faire, il n’y à eut que les détails pour le faire avancer qui m’ont donné du fil à retordre.

    Bon courage pour le prochain atelier

  44. Salut,

    J’ai recodé une grande partie du jeu, en orientant la détection de collision et le déplacement de la balle en coordonnées polaires, ce qui donne plus de fiabilité au gameplay.
    J’ai une fonction de mesure d’angle balle-brique ou balle-paddle et la vitesse se donne en module de vecteur et non en vx vy, utile si plus tard on veut implémenter un bonus qui change la vitesse.
    J’ai pu ainsi implémenter le changement d’angle au rebond sur le paddle, le rebond latéral et supérieur sur les briques.
    J’ai aussi ajouté un menu succinct avec « start » « continue » et « game over ».
    Il y a aussi un mode pause.
    Je n’ai pas encore consacré de temps à l’infographie (couleurs, images, etc) car c’est assez long pour peu de résultats en terme de progression en codage.
    Je n’ai consacré environ que 10-15 heures à LUA, la progression est donc très rapide et motivante.

    La suite au prochain atelier..; 🙂

    A.C.

  45. Un Severus un peu plus expérimenté revient pour vous dire : FAITES PAS COMME CA, FAITES COMME GILLES.

    Nan nan, sérieux. Je sais que je gueule et tout, mais c’est vrai
    Parce que dans mon code si je change la taille de pad (disons 100), ben le +40, ça sera pas la moitié. Et faudra cahanger tous les « 40 » pour des « 50 »

    Alors largeur/2 ça fait bizarre, mais même si ça varie, le code restera bon.

  46. Bonjour,

    Concernant le bug de la 4e vidéo (Love2D – Casse brique – Lancé et rebond sur les murs).

    N’est-ce pas plus simple de soustraire le rayon de la balle à la condition?
    De sorte à ce que la balle ne sort pas de l’écran du tout?

    Au lieu de :

    if balle.x > largeur then
    balle.vx = 0 – balle.vx
    balle.x = largeur
    end

    J’ai mis :

    if balle.x > (largeur – balle.rayon) then
    balle.vx = 0 – balle.vx
    end

    Avec la solution proposée dans la vidéo, la balle quitte à moitié l’écran avant d’être redirigée, tandis qu’en soustrayant son rayon, elle cogne pile le bord.

    Désolé si je me trompe. 😀

  47. Quelques galères dans cet atelier que j’ai terminé récemment. Je n’ai pas organisé mon code correctement et il faudra à l’avenir que je preine des notes dans mon code (« —Une note ») afin de m’y retrouver plus facilement. Je passe donc à l’atelier suivant en me souvenant de cela !

  48. Ce que tu as eu du mal, tu devrai jeter un oeil du côté des fonctions mathématiques si jamais tu n’y est pas arrivé ^^

  49. Même si je ne suis pas très performant sur cet atelier, la technique est quasi acquise ?.
    Je vais amélioré ma version est je la soumettrai sur discord, en toute humilité ?

  50. Malin. Mais en programmation la clé n’est pas d’économiser mais de raconter une histoire.
    Math.floor + 1 raconte qu’on prend une valeur entière et que l’on se décale de 1 pour s’adapter au système d’indexation de Lua.

  51. Bonjour David :).

    Excellent atelier pour finir sur les bases LUA LOve 2D avant de passer à la suite plus poussée, bravo ! 😀

    En revanche, en petit exercice supplémentaire, tu peux recommander de faire en sorte que la raquette ne sorte pas du décor, je l’ai fait, c’est assez sympa pour se creuser les méninges et accessible :). Là si tu regardes bien, avec ton code, la raquette sort à moitié de l’écran ^^.

    C’est un bon exercice complémentaire ;).

    Merci encore pour l’atelier, les explications claires, vraiment très agréable. A bientôt ;).

    Lucowlmes

  52. J’avance doucement dans ce TP, mais j’ai un dysfonctionnement étrange ! (je précise que je suis sur Mac/ZeroBrane)
    Je dépose donc ici un extrait de code, c’est étrange qu’il y ait un changement de comportement en fonction de la case

    Error

    main.lua:24: bad argument #2 to ‘rectangle’ (number expected, got nil)
    Traceback
    [C]: in function ‘rectangle’
    main.lua:24: in function ‘draw’
    [C]: in function ‘xpcall’

    ceci ne fonctionne pas

    pad = {}
    pad.hauteur = 20
    pad.largeur = 80
    pad.x = 0
    pad.y = 0

    love.graphics.rectangle("fill", pad.X, pad.Y, pad.largeur, pad.hauteur)

    ceci fonctionne !

    pad = {}
    pad.hauteur = 20
    pad.largeur = 80
    pad.X = 0
    pad.Y = 0

    love.graphics.rectangle("fill", pad.X, pad.Y, pad.largeur, pad.hauteur)

  53. hello
    Dur, dur quand ton code ne fonctionne pas
    Mais là ou c’est bizarre c’est que j’ai le même problème avec le code source (attempt to index a nil value)

  54. bonjour a tous du coup j’ai rajouter de la couleur et du son pour finir mon casse brick sa fonctionne Nikel j’aimerai juste trouver le moyen de faire des cassade de couleur dans les briques

    [Code source supprimé – Ne pas poster le projet complet SVP]

  55. Bonjour ! est-ce que si je retire la ligne pad.y = hauteur – (pad.hauteur / 2) et que je met ma hauteur a moi dans le pad.x et pad.y ça va quand même marcher pour la suite du cours?

  56. Bonjour, j’ai terminé les ateliers 1 à 3 et validé mes badges, mais je n’ai pas accès aux vidéos de l’atelier casse-brique, à l’exception de la vidéo de présentation.

    À la place, je vois « Adhérer aujourd’hui à GameCodeur » et le bouton « Obtenir votre accès ». Je voulais vous le signaler.
    En attendant de pouvoir faire le casse-brique, je passe à l’atelier suivant.

    Merci pour ces vidéos de qualité et bonne journée.

  57. Hello

    j’ai meme inconvenient de mon cote je viens de finir le pong mais cette parti « Casse Brique » pas disponible par contre la parti suivant c’est bon.

  58. Bonjour, j’ai un soucis bon déjà j’ai un peu de mal avec les boucle for, mais ça va le faire à un moment. mon soucis j’ai rajouter le mur qui est dans le pack source et j’ai réussi à décaler les brique de manière à ce qu’elles rentre dans le niveau sans déborder sur le mur.

    Cependant j’ai un bug de collision, c’est à dire que la balle traverse la 6eme ligne et tape après la 5eme pour au final c’est la brique de la 6ème ligne qui depop. Et je n’arrive pas à savoir où changer ça :/

    En tout cas les cours sont top, c’est un plaisir à regarder et apprendre

    Merci

  59. Bonsoir à tous, j’ai un petit soucis en suivant exactement ce qui est dit dans la vidéo n°2, j’ai cette erreur alors que je ne fais qu’appliqué ce qui est dit. Avez vous eu ce soucis? Merci d’avance

  60. @Oliverio :

    Comme te l’indique le message d’erreur : ta variable « hauteur » est nulle (elle n’existe pas).

    A toi donc de remonter à la source de l’erreur et de voir où et comment tu déclares et initialises la variable hauteur. A priori elle n’est pas déclarée ou avec une faute de frappe, ou elle n’est pas accessible.

  61. Bonjour David, super tuto !

    En testant différentes choses, je pense que la formule dans la vidéo 5/7 ne fonctionne pas car j’avais comme résultat que la balle rebondissait avant la barre. En effet, vu qu’on prend la valeur absolue de la distance, si la balle est avant mais tout de même a une distance comprise dans la longueur de la barre, alors elle rebondit mais depuis le sol. en tous cas c’est le bug que j’avais.

     

    Pour pallier ce problème, j’ai fait cette vérification (désolé j’utilise une syntaxe un peu différente, déformation professionnelle):

    if ball.y > posCollisionPad then

    print( » bballe X:  » .. ball.x .. « pad.x =  » .. pad.x ..   » ball.r =  » ..  ball.r)

    if (ball.x + ball.r) >= pad.x and (ball.x – ball.r) <= (pad.x + pad.width) then

    ball.vy = -ball.vy

    ball.y = posCollisionPad

    end

    end

    N’hésite pas à me dire si tu vois une erreur.

    Merci encore pour les tutos super bien ficelés

     

Laisser un commentaire

Dialoguez avec les autres membres de la gamecodeur school.

Accédez maintenant à notre serveur Discord privé : Entraide, Game Jams, Partage de projets, etc.

Vous devez être membre de la Gamecodeur School Premium pour être autorisé à accéder au serveur.