I am trying to write a code that does paralax scrolling. All the sprites in the "pieces" table need to shoot up into the air, then have their position reset to y=200 and x=randomnumber. Later on, I'm going to make them smaller or bigger depending on how fast they're moving for a true 3D effect.
Here's a naive attempt:
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
If i print "v" inside the ipairs i get the desired output (sprite, sprite1, sprite, etc), so I thought that what I have above would work. It doesn't. Any help?
-
1Well, you wanted to loop it - it loops ok, printing v shows it. You'll have to explain what you want and what you get. "It doesn't work" is not an explanation. If it doesn't alter 'speed' - it's because you're declaring local variable 'speed' inside of 'if p.y>800' branch, so new random value is not used outside if that branch. If it doesn't work in some other way, you'll have to explain.Vlad– Vlad11/20/2016 11:32:27Commented Nov 20, 2016 at 11:32
-
You're right. I forgot to put that the specific problem is that p = go.get_position(v) gives an error message. I believe I am not correctly referencing the object.josh– josh11/20/2016 12:30:42Commented Nov 20, 2016 at 12:30
-
What's that 'go'? I assume it's a collection of game_objects, indexed by names you have in 'pieces' array. But where it is in your sample? Does it have functions get_position()/set_position()? How those defined?Vlad– Vlad11/20/2016 12:41:51Commented Nov 20, 2016 at 12:41
-
go stands for game objects (in Defold). go.get_position(a) gets the position of the object called "a". If I put go.get_position(".") the code works fine (but it moves the object that the script is attached to, because "." = self). the problem is definitely in the way that go.get_position(v) references v. I think it's getting the word "sprite" instead of the instance "sprite" (or something similar), but I don't know how to reference the object rather than the word. Thanks for your help so far.josh– josh11/20/2016 13:07:40Commented Nov 20, 2016 at 13:07
-
Defold manual say you can pass a string as object's id when calling to get_position, so at least here it's correct. Do you have all those objects created already? Do you run script within Defold, or testing outside of it? What's exact error message?Vlad– Vlad11/20/2016 13:17:48Commented Nov 20, 2016 at 13:17
1 Answer 1
Here's the correct code which I figured out. If anyone sees this and needs it explaining, let me know.
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
-
Tip: instead of storing strings in the pieces table you can store the id:s of the objects:
pieces = { go.get_id("go1"), go.get_id("go2"), go.get_id("go3") }
. For cases where you do a lot of iterations this saves lookup from string to id (hash) that the engine otherwise has to do each time.Mikael Säker– Mikael Säker11/22/2016 09:13:10Commented Nov 22, 2016 at 9:13