Lunar Lander - Devlog #2
Gamabunta57 Il y a 3 semaines Premium Infinity0

Une séance de dev sauvage apparaît (elle est pas très efficace) !

En fait, après la rédaction du premier devlog, j’avais un peu de temps alors je me suis dit “pourquoi pas continuer ?”. J’ai donc continué sur ce projet, avec un peu de fatigue au départ et moins de temps à consacrer par rapport à ce que je prévois.

Concrètement, “kesske” ça a donné

Pour cette session, j’avais prévu d’attaquer les conditions d’échec et de victoire et c’est chose faite. J’ai un tout petit proto qui fait que je peux réussir un alunissage (ouais dans le jeu, on est sur la Lune théoriquement) et je peux complètement me crasher.
J’ai continué sur l’aspect objet de Lua (en même temps, là ce serait plus difficile de revenir en arrière et je vois pas non plus l’intérêt de le faire). Sur l’aspect objet, j’ai rien découvert de particulier.
Je me suis tout de même pris la tête sur un bug où j’ai remis complètement en cause ma compréhension de Lua (pour rien).

Le bug qui m’a pris quasiment une demi-séance à résoudre

Je détail ce bug parce que peut-être qu’il peut aider quelques-uns à sortir la tête du guidon quand ça leur arrive. Concrètement, j’avais des choses en place qui fonctionnaient bien jusqu’à ce que Lua décide que ça marche plus.

En fait, il me renvoyait une erreur lorsque j’utilisais la fonction spacecraft:getWidth() qui fonctionne depuis la première séance et qui n’avait aucun problème. Mais là, il veut plus. J’essaye des trucs, je lance mon débugger sous VSCode, j’utilise les “watcher” pour demander d’interpréter des expressions et quand je fais un spacecraft:getWidth (sans les parenthèses), il me dit que c’est une fonction.
Mais bordel ! J’ai le code devant les yeux, j’ai fait le bon appel à la méthode (je veux dire que j’ai pas confondu encore une fois le “.” et le “:”) tout semble ok et j’ai pas changé la fonction. Je jette même un oeil dans l’IDE pour voir si le code de “getWidth” a été changé mais non.
Tout est comme avant, mais ça veut plus marcher.

Mais bon, s’il le dit, c’est que c’est vrai; c’est moi qui loupe quelque chose.

Au bout d’un moment je me dis que ça provient d’un endroit où je ne regarde pas, c’est obligé. J’utilise la recherche textuelle dans tout le projet avec “getWidth”.
Je vérifie chacune des occurrences et là … “mais quel con bordel !” (oui c’est comme ça que ça se passe dans ma tête ^^’). J’avais faits un copié-collé d’un bout de code de Spacecraft dans mon nouveau module “Platform”.
J’ai changé le code pour le calcul dans getWidth, mais j’ai oublié de renommer ma fonction !
Du coup dans mon module Platform j’avais un

function Spacecraft:getWidth()
  ...
end

Résultat, ça écrase tout simplement le précédent Spacecraft:getWidth (celui qui marche quoi).

Conclusion à propos de ce bug

Je suis pas étonné de ce comportement (écraser une fonction existante). C’est que j’imaginais étant donné que je trouve Lua très proche (dans son essence) de Javascript.
Je parierai donc qu’une fonction en Lua est un objet (ou table si vous préférez). En gros la déclaration de fonction plus haute peut s’écrire (et est complètement équivalente de ce que je pense) de la manière suivante:

Spacecraft = {
  getWidth = function()
    return 10
  end
}

Ou encore

Spacecraft.getWidth = function()
  return 10
end

Pour ceux qui ont fait du Javascript, ça peut peut-être leur parler. Mais bref, on voit là qu’une fonction reste un champ d’une table. La seule particularité c’est qu’on peut appeler cette propriété (car elle pointe sur une fonction).
Comme c’est un champ, on peut modifier sa valeur et c’est ce qui est arrivé lors de mon bug.

Conclusion globale

J’ai passé beaucoup de temps sur ce bug, pour pas grand-chose. On dit souvent que les “copiés-collés” c’est le mal, et ça, s’en est l’une des raisons. Personnellement, je suis pas aussi strict (vous l’aurez deviné).
Si c’est bien fait (pas comme ici) on peut gagner du temps sur le moment. On le gagne probablement au prix d’un “refactoring” de code plus tard mais ça reste parfois intéressant.
Faut pas en abuser non plus, si on commence à le faire 2 ou 3 fois pour le même bout de code, il faut peut-être déjà se demander si une petite fonction ferait pas mieux le boulot (faut pas abuser des bonnes choses 😀 ).
Concernant le projet lui-même, j’ai moins avancé que prévu car j’ai remis à plus tard une des tâches que j’avais à faire. J’ai débuté la session de dev tardivement et j’étais fatigué en commençant.
Ceci dit, par rapport au temps prévu (en H et non plus en journée), je suis toujours bon donc rien de bien grave.

P.S: pour ceux que ça intéresse, je film mes sessions de dev et j’en fais des time-lapse que je poste sur YouTube. Suite à une recommandation de ma femme, j’ai ajouté des sous-titres pour décrire ce que je pense durant la session.

Lien vers les sources (en l’état lors de ce devlog):
https://github.com/Gamabunta57/GC-LunarLander/tree/7c08baf5e9400ef0425f8d2f00d1089e7bb74a41
(faut que je mette à jour mon readme ..)

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.