Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

why isnt my loops going at the same time when i use coros?

Asked by 9 years ago
local tweenWhite2 = coroutine.create(function()
wf:TweenPosition(UDim2.new(-1,0,0,0))
end)

local tweenBlue2 = coroutine.create(function()
bf:TweenPosition(UDim2.new(1,0,0,0))
end)

local tweenWhite = coroutine.create(function()
wf:TweenPosition(UDim2.new(0,0,0,0))
end)

local tweenBlue = coroutine.create(function()
bf:TweenPosition(UDim2.new(0.5,0,0,0))
end)

wait(2)

coroutine.resume(tweenBlue)
coroutine.resume(tweenWhite)

wait(2)

for i = 1,0,-0.1 do
    logo.ImageTransparency = i
    wait()
end

wait(5)

for i = 0,1,0.1 do
    logo.ImageTransparency = i
    wait()
end

wait(2)

coroutine.resume(tweenBlue2)
coroutine.resume(tweenWhite2)
0
How much of a difference are we talking here when you say they are not going at the same time? Bman8765 270 — 9y

1 answer

Log in to vote
1
Answered by
TaslemGuy 211 Moderation Voter
9 years ago

It's not exactly clear what you want to happen.

To be clear, coroutines are not concurrent - they run sequentially, not at the same time. However, calling wait() implicitly yields the thread, giving an "appearance" of true concurrency.

Tweens do not yield the thread. Therefore, there's no need to use coroutines with them at all. In particular, since your coroutines do not yield, and do not do any way of waiting, they could be replaced by ordinary function calls, giving us this:

local function tweenWhite2()
    wf:TweenPosition(UDim2.new(-1,0,0,0))
end

local function tweenBlue2()
    bf:TweenPosition(UDim2.new(1,0,0,0))
end

local function tweenWhite()
    wf:TweenPosition(UDim2.new(0,0,0,0))
end)

local function tweenBlue()
    bf:TweenPosition(UDim2.new(0.5,0,0,0))
end

wait(2)

tweenBlue()
tweenWhite()

wait(2)

for i = 1,0,-0.1 do
    logo.ImageTransparency = i
    wait()
end

wait(5)

for i = 0,1,0.1 do
    logo.ImageTransparency = i
    wait()
end

wait(2)

tweenBlue2()
tweenWhite2()

But since you don't actually re-use any of the functions, you might as well just inline them back into the code:

wait(2)

bf:TweenPosition(UDim2.new(0.5,0,0,0))
wf:TweenPosition(UDim2.new(0,0,0,0))

wait(2)

for i = 1,0,-0.1 do
    logo.ImageTransparency = i
    wait()
end

wait(5)

for i = 0,1,0.1 do
    logo.ImageTransparency = i
    wait()
end

wait(2)

bf:TweenPosition(UDim2.new(1,0,0,0))
wf:TweenPosition(UDim2.new(-1,0,0,0))

So, again, it's just clear what you want to happen from this. Here's what it should do, as written:

(1) Wait 2 seconds before doing anything

(2) Begin tweening the positions of bf, and wf simultaneously.

(3) 2 seconds after tweening starts (which is 1 second after tweening ends), begin to fade inlogo. This will take about 0.3 seconds.

(4) 5 seconds after the fade in is complete, fade out. This will take about 0.3 seconds again.

(5) Wait 2 seconds after the fade out is complete, then begin to tween both of the objects again.

(6) 1 second after tweening begins, it's complete

If you need further assistance, you need to explain exactly what you want it to do. Because right now it isn't obvious and you haven't described what you want at all.

Ad

Answer this question