[Résolu] frame non détéctée lors d'une animation
Bonjour/bonsoir.
j'ai un problème sur mon code que je n'arrive pas à resoudre.
(le message d'erreur)
Error
main.lua:14: table index is nil
Traceback
main.lua:14: in main chunk
[C]: in function 'require'
[C]: in function 'xpcall'
[C]: in function 'xpcall'
-- Cette ligne permet d'afficher des traces dans la console pendant l'éxécution io.stdout:setvbuf('no') -- Empèche Love de filtrer les contours des images quand elles sont redimentionnées -- Indispensable pour du pixel art love.graphics.setDefaultFilter("nearest") -- Cette ligne permet de déboguer pas à pas dans ZeroBraneStudio if arg[#arg] == "-debug" then require("mobdebug").start() end animPanneaux = {} animPanneaux[1] = {} animPanneaux[1][frame] = 1 animPanneaux[1][image] = {} animPanneaux[2] = {} animPanneaux[2][frame] = 0 animPanneaux[2][image] = {} animPanneaux[3] = {} animPanneaux[3][frame] = 0 animPanneaux[3][image] = {} animPanneaux[4] = {} animPanneaux[4][frame] = 0 animPanneaux[4][image] = {} animPanneaux[5] = {} animPanneaux[5][frame] = 0 animPanneaux[5][image] = {} animPanneaux[6] = {} animPanneaux[6][frame] = 0 animPanneaux[6][image] = {} animPanneaux[7] = {} animPanneaux[7][frame] = 0 animPanneaux[7][image] = {} animPanneaux[8] = {} animPanneaux[8][frame] = 0 animPanneaux[8][image] = {} animPanneaux[9] = {} animPanneaux[9][frame] = 0 animPanneaux[9][image] = {} function love.load() love.window.setFullscreen(true) -- les premières images de chaque sections sont doublées pour permettre à la première frame de ne pas être passée. animPanneaux[1][image][1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux01.png) animPanneaux[1][image][2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux01.png) animPanneaux[2][image][1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux02.png) animPanneaux[2][image][2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux02.png) animPanneaux[3][image][1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux03.png) animPanneaux[3][image][2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux03.png) animPanneaux[3][image][3] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux04.png) animPanneaux[4][image][1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux05.png) animPanneaux[4][image][2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux05.png) animPanneaux[5][image][1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux06.png) animPanneaux[5][image][2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux06.png) animPanneaux[6][image][1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux07.png) animPanneaux[6][image][2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux07.png) animPanneaux[7][image][1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux08.png) animPanneaux[7][image][2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux08.png) animPanneaux[8][image][1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux09.png) animPanneaux[8][image][2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux09.png) animPanneaux[9][image][1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux10.png) animPanneaux[9][image][2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux10.png) animPanneaux[9][image][3] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux11.png) animPanneaux[9][image][4] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux12.png) end function love.update(dt) animPanneaux[1][frame] = animPanneaux[1][frame] + 0.66*dt if animPanneaux[1][frame] >= #animPanneaux[1][image] + 1 then animPanneaux[1][frame] = 0 animPanneaux[2][frame] = 1 end animPanneaux[2][frame] = animPanneaux[2][frame] + 3.33*dt if animPanneaux[2][frame] >= #animPanneaux[2][image] + 1 then animPanneaux[2][frame] = 0 animPanneaux[3][frame] = 1 end animPanneaux[3][frame] = animPanneaux[3][frame] + 13.33*dt if animPanneaux[3][frame] >= #animPanneaux[3][image] + 1 then animPanneaux[3][frame] = 0 animPanneaux[4][frame] = 1 end animPanneaux[4][frame] = animPanneaux[4][frame] + 1*dt if animPanneaux[4][frame] >= #animPanneaux[4][image] + 1 then animPanneaux[4][frame] = 0 animPanneaux[5][frame] = 1 end animPanneaux[5][frame] = animPanneaux[5][frame] + 3.33*dt if animPanneaux[5][frame] >= #animPanneaux[5][image] + 1 then animPanneaux[5][frame] = 0 animPanneaux[6][frame] = 1 end animPanneaux[6][frame] = animPanneaux[6][frame] + 13.33*dt if animPanneaux[6][frame] >= #animPanneaux[6][image] + 1 then animPanneaux[6][frame] = 0 animPanneaux[7][frame] = 1 end animPanneaux[7][frame] = animPanneaux[7][frame] + 1*dt if animPanneaux[7][frame] >= #animPanneaux[7][image] + 1 then animPanneaux[7][frame] = 0 animPanneaux[8][frame] = 1 end animPanneaux[8][frame] = animPanneaux[8][frame] + 3.33*dt if animPanneaux[8][frame] >= #animPanneaux[8][image] + 1 then animPanneaux[8][frame] = 0 animPanneaux[9][frame] = 1 end animPanneaux[9][frame] = animPanneaux[9][frame] + 13.33*dt if animPanneaux[9][frame] >= #animPanneaux[9][image] + 1 then animPanneaux[9][frame] = 0 animPanneaux[1][frame] = 1 end end function love.draw() love.graphics.scale(5,5) local frameArrondie1 = math.floor(animPanneaux[1][frame]) local frameArrondie2 = math.floor(animPanneaux[2][frame]) local frameArrondie3 = math.floor(animPanneaux[3][frame]) local frameArrondie4 = math.floor(animPanneaux[4][frame]) local frameArrondie5 = math.floor(animPanneaux[5][frame]) local frameArrondie6 = math.floor(animPanneaux[6][frame]) local frameArrondie7 = math.floor(animPanneaux[7][frame]) local frameArrondie8 = math.floor(animPanneaux[8][frame]) local frameArrondie9 = math.floor(animPanneaux[9][frame]) love.graphics.draw(animPanneaux[1][image][frameArrondie1],0,0) love.graphics.draw(animPanneaux[2][image][frameArrondie2],0,0) love.graphics.draw(animPanneaux[3][image][frameArrondie3],0,0) love.graphics.draw(animPanneaux[4][image][frameArrondie4],0,0) love.graphics.draw(animPanneaux[5][image][frameArrondie5],0,0) love.graphics.draw(animPanneaux[6][image][frameArrondie6],0,0) love.graphics.draw(animPanneaux[7][image][frameArrondie7],0,0) love.graphics.draw(animPanneaux[8][image][frameArrondie8],0,0) love.graphics.draw(animPanneaux[9][image][frameArrondie9],0,0) end
est-ce qu'une âme charitable pourrais m'aider à résoudre ce problème ou au moins, m'indiquer un des cours de David qui m'aiderai à trouver la solution.
merci.
Je précise que je tente de régler le problème avec le pdf du cours débutant sur les images avec moi.
J'ai mis le fichier des images que je souhaite animer dans le lien ci dessous (vous pouvez par ailleurs, les utiliser pour vos propres jeux, c'est une création perso. )
PS: j'avais réalisé cette animation sur libresprite. Mais lors de l'export en (.gif) les images sont de qualité très mauvaise. changements des couleurs, etc.. (je précise que j'ai tenté l'export sans changer la résolution) C'est pour cela que je tente d'animer directement dans le code, image par image.
Tout d'abord, c'est un excellent exercice pour toi pour déchiffrer les messages d'erreur :
table index is nil
Le message t'indique "l'index de la table est nil". Nil signifie que c'est une valeur non déclarée.
Lorsqu'on crée un tableau, la syntaxe est :
nomdutableau[index] = valeur
l'index est soit une valeur numérique, soit une chaine de caractères (entre guillemets), soit une variable qui contient l'un des deux.
Exemples :
tableau[1] = (ici une valeur) ou tableau["index texte"] = (ici une valeur)
A noter que l'utilisation de "table.insert" va automatiquement attribuer un index numérique chronologique à l'élément du tableau.
Dans ton cas, tu utilises frame qui est un nom sorti de nulle part, qui n'est pas une variable.
Pour le langage Lua, ce mot frame est recherché parmis les variables déjà déclarées, et ne le trouvant pas il considère que c'est une valeur nulle (nil en Lua). D'où l'erreur : index nil.
Je ne sais pas ce que tu avais en tête mais j'imagine plutôt :
animPanneaux[1].frame = 1 animPanneaux[1].image = {}
Je te propose de visionner ce DLC qui te formera à la programmation d'animations avec cette technique de tables :
Super. merci pour la réponse rapide.
en effet je n'avais pas compris le message d'erreur. Je pensais que l'erreur était au niveau de la valeur indiquée après le égal. Ce qui n'avais pas trop de sens.
Après avoir changer tables contenant du texte en ".frame" et ".image"
le problème à été résolu.
mais un nouveau viens d’apparaître.
Error
main.lua:54: attempt to perform arithmetic on global 'pong_ecran_titre' (a nil value)
Traceback
main.lua:54: in function 'load'
[C]: in function 'xpcall'
[C]: in function 'xpcall'
de ce que je comprend lua essaye de faire un calcul. je ne vois pas ou. (j'ai ecrit un print juste après cette ligne pour voir si le code continuais et que le problème de calcul se faisait après ( dans le update par exemple.) mais il n'en ai rien.
Bon, je sens que je vais avoir de nombreux bug a venir. haha.
Je vais aller regarder ton dlc. 😀
merci pour le coup de main.
Il me faut la ligne de code qui provoque l'erreur.
Mais le message te dis que tu fais sûrement un "+" sur une variable nommée pong_ecran_titre qui n'existe pas.
main.lua:54: attempt to perform arithmetic on global 'pong_ecran_titre' (a nil value)
Traceback
main.lua:54: in function 'load'
[C]: in function 'xpcall'
[C]: in function 'xpcall'
C'est la ligne 54 d'après le message d'erreur.
-- Cette ligne permet d'afficher des traces dans la console pendant l'éxécution io.stdout:setvbuf('no') -- Empèche Love de filtrer les contours des images quand elles sont redimentionnées -- Indispensable pour du pixel art love.graphics.setDefaultFilter("nearest") -- Cette ligne permet de déboguer pas à pas dans ZeroBraneStudio if arg[#arg] == "-debug" then require("mobdebug").start() end animPanneaux = {} animPanneaux[1] = {} animPanneaux[1].frame = 1 animPanneaux[1].image = {} animPanneaux[2] = {} animPanneaux[2].frame = 0 animPanneaux[2].image = {} animPanneaux[3] = {} animPanneaux[3].frame = 0 animPanneaux[3].image = {} animPanneaux[4] = {} animPanneaux[4].frame = 0 animPanneaux[4].image = {} animPanneaux[5] = {} animPanneaux[5].frame = 0 animPanneaux[5].image = {} animPanneaux[6] = {} animPanneaux[6].frame = 0 animPanneaux[6].image = {} animPanneaux[7] = {} animPanneaux[7].frame = 0 animPanneaux[7].image = {} animPanneaux[8] = {} animPanneaux[8].frame = 0 animPanneaux[8].image = {} animPanneaux[9] = {} animPanneaux[9].frame = 0 animPanneaux[9].image = {} function love.load() love.window.setFullscreen(true) animPanneaux[1].image[1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux01.png) animPanneaux[1].image[2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux01.png) animPanneaux[2].image[1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux02.png) animPanneaux[2].image[2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux02.png) animPanneaux[3].image[1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux03.png) animPanneaux[3].image[2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux03.png) animPanneaux[3].image[3] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux04.png) animPanneaux[4].image[1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux05.png) animPanneaux[4].image[2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux05.png) animPanneaux[5].image[1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux06.png) animPanneaux[5].image[2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux06.png) animPanneaux[6].image[1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux07.png) animPanneaux[6].image[2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux07.png) animPanneaux[7].image[1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux08.png) animPanneaux[7].image[2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux08.png) animPanneaux[8].image[1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux09.png) animPanneaux[8].image[2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux09.png) animPanneaux[9].image[1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux10.png) animPanneaux[9].image[2] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux10.png) animPanneaux[9].image[3] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux11.png) animPanneaux[9].image[4] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux12.png) end function love.update(dt) animPanneaux[1].frame = animPanneaux[1].frame + 0.66*dt if animPanneaux[1].frame >= #animPanneaux[1].image + 1 then animPanneaux[1].frame = 0 animPanneaux[2].frame = 1 end animPanneaux[2].frame = animPanneaux[2].frame + 3.33*dt if animPanneaux[2].frame >= #animPanneaux[2].image + 1 then animPanneaux[2].frame = 0 animPanneaux[3].frame = 1 end animPanneaux[3].frame = animPanneaux[3].frame + 13.33*dt if animPanneaux[3].frame >= #animPanneaux[3].image + 1 then animPanneaux[3].frame = 0 animPanneaux[4].frame = 1 end animPanneaux[4].frame = animPanneaux[4].frame + 1*dt if animPanneaux[4].frame >= #animPanneaux[4].image + 1 then animPanneaux[4].frame = 0 animPanneaux[5].frame = 1 end animPanneaux[5].frame = animPanneaux[5].frame + 3.33*dt if animPanneaux[5].frame >= #animPanneaux[5].image + 1 then animPanneaux[5].frame = 0 animPanneaux[6].frame = 1 end animPanneaux[6].frame = animPanneaux[6].frame + 13.33*dt if animPanneaux[6].frame >= #animPanneaux[6].image + 1 then animPanneaux[6].frame = 0 animPanneaux[7].frame = 1 end animPanneaux[7].frame = animPanneaux[7].frame + 1*dt if animPanneaux[7].frame >= #animPanneaux[7].image + 1 then animPanneaux[7].frame = 0 animPanneaux[8].frame = 1 end animPanneaux[8].frame = animPanneaux[8].frame + 3.33*dt if animPanneaux[8].frame >= #animPanneaux[8].image + 1 then animPanneaux[8].frame = 0 animPanneaux[9].frame = 1 end animPanneaux[9].frame = animPanneaux[9].frame + 13.33*dt if animPanneaux[9].frame >= #animPanneaux[9].image + 1 then animPanneaux[9].frame = 0 animPanneaux[1].frame = 1 end end function love.draw() love.graphics.scale(5,5) local frameArrondie1 = math.floor(animPanneaux[1].frame) local frameArrondie2 = math.floor(animPanneaux[2].frame) local frameArrondie3 = math.floor(animPanneaux[3].frame) local frameArrondie4 = math.floor(animPanneaux[4].frame) local frameArrondie5 = math.floor(animPanneaux[5].frame) local frameArrondie6 = math.floor(animPanneaux[6].frame) local frameArrondie7 = math.floor(animPanneaux[7].frame) local frameArrondie8 = math.floor(animPanneaux[8].frame) local frameArrondie9 = math.floor(animPanneaux[9].frame) love.graphics.draw(animPanneaux[1].image[frameArrondie1],0,0) love.graphics.draw(animPanneaux[2].image[frameArrondie2],0,0) love.graphics.draw(animPanneaux[3].image[frameArrondie3],0,0) love.graphics.draw(animPanneaux[4].image[frameArrondie4],0,0) love.graphics.draw(animPanneaux[5].image[frameArrondie5],0,0) love.graphics.draw(animPanneaux[6].image[frameArrondie6],0,0) love.graphics.draw(animPanneaux[7].image[frameArrondie7],0,0) love.graphics.draw(animPanneaux[8].image[frameArrondie8],0,0) love.graphics.draw(animPanneaux[9].image[frameArrondie9],0,0) end
ah mince. les numeros de lignes ne sont pas indiqué.
la ligne est la suivante:
animPanneaux[1].image[1] = love.graphics.newImage(pong_ecran_titre/animPanneaux/animationPanneaux01.png)
c'est juste après le love.load()
Je pense qu'il manque des guillemets pour tout ce qui est entre parenthèse ( le chemin vers ton image).
Pour moi il faudrait l'écrire ainsi :
animPanneaux[1].image[1] = love.graphics.newImage("pong_ecran_titre/animPanneaux/animationPanneaux01.png")
Ha mais oui!
Merci infiniment!
je me sens trop bête... des heures que je tourne en rond pour ça... je suis deg'!! haha.
merci à toi et bonne soirée.
Il est important de comprendre comment Lua lit ton code, et que tu puisses te substituer à lui mentalement, ça t'aidera beaucoup.
Quand Lua voit des mots sur une ligne de code, il va chercher si ce sont des noms de fonctions ou des variables. S'il ne trouve pas il va afficher une erreur. Donc quand tu écris pong_ecran_titre/animPanneaux... pour lui ce sont des variables que tu veux diviser entre elles (signe /). D'où l'erreur qui dit que tu fais une opération arithmétiques entre des valeurs nil (nil = n'existe pas). Tout a une logique et une raison.
Sans guillements, impossible à Lua de savoir que c'est un chemin de fichier. C'est pour cela que les concepteurs de langages doivent pouvoir faire la différence entre tokens (noms de variables, noms de fonctions, mots clés, valeurs) et chaines de caractères (entre guillemets).
Ha oui. je comprend mieux le message d'erreur. merci.
- 6 Forums
- 238 Sujets
- 840 Posts
- 3 En ligne
- 45.5 {numéro}K Membres