2016-11-20 3 views
0

J'essaye d'écrire un code qui défile en paralaxe. Tous les sprites de la table des "morceaux" doivent se lever dans les airs, puis réinitialiser leur position à y = 200 et x = nombre aléatoire. Plus tard, je vais les rendre plus petits ou plus gros en fonction de la vitesse à laquelle ils se déplacent pour un véritable effet 3D.Comment faire un itération du code sur des objets d'une table dans lua?

Voici une tentative naïve:

local speed = math.random(250,1000) 
pieces = { "sprite", "sprite1", "sprite2", "sprite3", "sprite4", 
"sprite5", "sprite6", "sprite7", "sprite8", "sprite9", "sprite10", 
"sprite11", "sprite12", "sprite13", "sprite14", "sprite15" } 

function update(self, dt) 
    for i, v in ipairs(pieces) do 
     p = go.get_position(v) 
     p.y = p.y + speed * dt 
     print(v) 
      if p.y > 800 then 
      p.y = -200 
      p.x = math.random(1,25) * math.random(10,35)*2 
      local speed = math.random(250,1000) 
     end 
     go.set_position(v) 
    end 
end 

Si j'imprimer "v" à l'intérieur des ipairs i obtenir la sortie désirée (sprite, sprite1, lutin, etc), donc je pensais que ce que je serait surtout travailler . Ce n'est pas le cas. De l'aide?

+1

Eh bien, vous vouliez le boucler - il boucle bien, l'impression v le montre. Vous devrez expliquer ce que vous voulez et ce que vous obtenez. "Ça ne marche pas" n'est pas une explication. Si cela ne modifie pas la 'vitesse', c'est parce que vous déclarez la variable locale 'speed' dans la branche 'si p.y> 800', donc une nouvelle valeur aléatoire n'est pas utilisée à l'extérieur si cette branche. Si cela ne fonctionne pas d'une autre manière, vous devrez expliquer. – Vlad

+0

Vous avez raison. J'ai oublié de dire que le problème spécifique est que p = go.get_position (v) donne un message d'erreur. Je crois que je ne fais pas correctement référence à l'objet. – josh

+0

Qu'est-ce que c'est? Je suppose que c'est une collection de game_objects, indexée par les noms que vous avez dans le tableau 'pieces'. Mais où est-il dans votre échantillon? At-il des fonctions get_position()/set_position()? Comment ceux-ci définis? – Vlad

Répondre

1

Voici le code correct que j'ai trouvé. Si quelqu'un voit cela et a besoin d'explications, faites le moi savoir.

local speed = math.random(250,1000) 
--pieces = { "sprite1", "sprite2", "sprite3", "sprite4", "sprite5", "sprite6", "sprite7", "sprite8", "sprite9", "sprite10", "sprite11", "sprite12", "sprite13", "sprite14", "sprite15" } 
pieces = { "go1", "go2", "go3" } 

function update(self, dt) 
    for i, v in ipairs(pieces) do 
     p = go.get_position(v) 
     p.y = p.y + speed * dt 
     if p.y > 800 then 
      p.y = math.random(200,800)/-1 
      p.x = math.random(1,25) * math.random(10,35) * 2 
      local speed = math.random(250,1000) 
      go.set_position(p, v) 
      else 
      go.set_position(p, v) 
     end 
    end 
    end 
+0

Astuce: au lieu de stocker des chaînes dans la table pieces, vous pouvez stocker les id: s des objets: 'pieces = {go.get_id (" go1 "), go.get_id (" go2 "), go.get_id (" go3 ")}'. Dans les cas où vous effectuez un grand nombre d'itérations, cela économise la recherche de la chaîne à l'id (hash) que le moteur doit faire à chaque fois. –