2 votes

Table.insert table argument reconnu comme une chaîne de caractères

bulletsPlayer1 = { 
   Pistol = {},
   Shotgun = {}
}

bulletsPlayer2 = { 
   Pistol = {},
   Shotgun = {}
}

J'ai ces tableaux, et j'ai cette fonction pour créer des balles :

function createBullet(x, y, angle, speed, weapon, player)
   local directionx = speed * math.cos(angle)
   local directiony = speed * math.sin(angle)

   table.insert(
      "bulletsPlayer"..player.."."..weapon,
      {
         positionx = x,
         positiony = y,
         directionx = directionx,
         directiony= directiony,
         speed = speed
      }
   )
end

Par exemple, si j'appelle cette fonction comme ceci

createBullet(100,100,0,300,'Shotgun',1)

Je reçois cette erreur :

shooting.lua:77: mauvais argument #1 pour 'insert' (table attendue, obtenu une chaîne de caractères)

Comment puis-je faire en sorte que mon code reconnaisse le premier argument de table.insert() comme mes tableaux et non des chaînes de caractères ?

1voto

DarkWiiPlayer Points 1396

Comment puis-je faire en sorte que mon code reconnaisse le premier argument du table.insert() comme mes tables et non comme des chaînes de caractères?

Ce n'est pas comme ça que Lua fonctionne. Une chaîne de caractères est une chaîne de caractères, une table est une table. Si vous voulez indexer vos joueurs par numéro, stockez-les dans une table:

local bulletsPlayer = {
   {
      Pistol = {},
      Shotgun = {}
   };
   {
      Pistol = {},
      Shotgun = {}
   };
}

Ensuite, vous pouvez l'indexer avec un numéro comme ceci

bulletsPlayer[1]["shotgun"]

0voto

Piglet Points 7662

"bulletsPlayer"..player.."." ..weapon est une chaîne de caractères. Donc le message d'erreur est exactement ce à quoi vous devriez vous attendre.

Vous ne pouvez pas simplement construire des noms de variables à partir de chaînes et espérer que Lua saura quoi faire.

Comme bulletsPlayer1 est une valeur de tableau globale, vous pouvez y accéder via l'environnement global.

_ENV["bulletsPlayer"..player][weapon]

Reportez-vous à https://www.lua.org/manual/5.3/manual.html#2.2

Mais en général, vous utilisez simplement des clés de tableau pour obtenir ce dont vous avez besoin. Vous ne construisez pas de noms globaux à partir de chaînes.

Ensuite, vous devriez avoir quelque chose comme :

local players{[1] = {bullets = {shotgun = 20, pistol = 9}}}

Mais si vous suivez cette voie, vous voudrez peut-être lire quelque chose sur la POO en Lua. Si les balles sont une propriété de votre joueur, pourquoi ne pas stocker ces informations dans un objet joueur. De plus, les métatables peuvent vous simplifier la vie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X