Communauté

frame non détéctée ...
 
Notifications
Retirer tout

[Résolu] frame non détéctée lors d'une animation

9 Posts
3 Utilisateurs
0 Likes
410 Vu
0
Début du sujet

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'

Spoiler
code
-- 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. )

images à animer

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.

 

 

Étiquettes du sujet
8 Réponses
0

@vikanim 

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 :

https://www.gamecodeur.fr/dlc-61-barbarian/

0
Début du sujet

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.

 

David de Gamecodeur 19/11/2022 7:43

@vikanim 

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.

0
Début du sujet
Spoiler
message d'erreur
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'

 

C'est la ligne 54 d'après le message d'erreur.

Spoiler
le code
-- 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
0
Début du sujet

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()

0

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")

0
Début du sujet

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.

0

@vikanim 

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).

0
Début du sujet

Ha oui. je comprend mieux le message d'erreur. merci.

Répondre
Share:

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.