Autor Wątek: pauza skryptu lua/inne  (Przeczytany 983 razy)

Offline gawron89

  • Użytkownik

# Wrzesień 19, 2011, 16:38:23
witam
problem przedstawię przykładem
Kod: (lua) [Zaznacz]
onStart = function()
   local time = 10;
   unit:move(x, y);  --1
   screen:fadeout(time);  --2
   unit:kill(); --3
end

1. jednostka zaczyna się poruszać ofc
2. tutaj problem, ekran zaczyna się rozjaśniać i skrypt powinien zaczekać cale 10 sec aż do pełnego rozjaśnienia, w miedzy czasie kod c++ musi być normalnie wykonywany
3. po 10 sec dead

moim założeniem jest stworzyć jak najbardziej prosty interface w skryptach, bardzo zbliżony do tego co mamy w edytorze wyzwalaczy w warcrafcie 3, chce uniknąć jakiegokolwiek liczenia klatek wewnątrz skryptów. czy jest to możliwe w lua?
project nie jest jeszcze rozpoczęty i jestem w stanie zmienić język na jakikolwiek inny, byle dało się zrobić coś równie prostego

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Dab

  • Redaktor
    • blog

# Wrzesień 19, 2011, 16:45:46
Poczytaj sobie o korutynach w Lua (coroutines). Chociaż akurat tutaj prostsze wydaje się użycie funkcji w rodzaju delay_execute z anonimowym delegatem. Ewentualnie takiego delegata można podpiąć bezpośrednio pod funkcję fade (jak w JQuery :)):

onStart = function()
   local time = 10
   unit:move(x, y)
   screen:fadeout(time, function()
     unit:kill()
   end)
end
« Ostatnia zmiana: Wrzesień 19, 2011, 16:49:02 wysłana przez Dab »

Offline gawron89

  • Użytkownik

# Wrzesień 19, 2011, 17:54:12
rozwiązanie z delegatem raczej odpada, gdy ożyjemy go w jednej funkcji kilka razy pod rzad robi się straszny syf
onStart = function()
   local time = 10
   unit:move(x, y)
   fade(time, function()
      unit:kill()
      fade(time, function()
      unit:something()
         fade(time, function()
            unit:something()
            --itd.
         end)
      end)
   end)
end

o coroutines czytałem i nie mam pojęcia jak tego użyć, myślałem o tym by zastąpić nimi wszystkie normalne callbacki, użycie fade spowoduje zapisanie funkcji do jakiejś globalnej tablicy razem z czasem, yield itd. problem będzie jeśli użyjemy fade poza coroutines, drugim problemem jest to ze coroutine można użyć tylko raz potem znowu trzeba stworzyć nowy callback z nowym adresem funkcji, nie wiem czy dobrze kombinuje
« Ostatnia zmiana: Wrzesień 19, 2011, 17:58:39 wysłana przez gawron89 »

Offline Kos

  • Użytkownik
    • kos.gd

# Wrzesień 19, 2011, 21:35:49
Cytuj
straszny syf

Boomerang code. :D

Jeżeli faktycznie masz coś takiego i nie jesteś w stanie tego ogarnąć rozbijając to na sensowne części, np. tak:

function foo() {
    blah();
    fade(time, bar);
}

function bar() {
    blah();
    fade(time, baz);
}

...to można pomyśleć o innym podejściu do kontroli, np. zrobić zwyczajną maszynę stanów.

Offline gawron89

  • Użytkownik

# Wrzesień 20, 2011, 00:32:29
zrobiłem coś takiego
Kod: (lua) [Zaznacz]
GAW_PAUSED_COROUTINES_TABLE_ = {}

function GAW_PAUSED_COROUTINES_CHECK_()
for k, v in pairs(GAW_PAUSED_COROUTINES_TABLE_) do
if(v < os.time()) then
local co=k;
GAW_PAUSED_COROUTINES_TABLE_[k]=nil;
coroutine.resume(co);
return;
end
end
end

--magiczna funkcja pauzujaca watek
function wait(t)
local co = coroutine.running();
GAW_PAUSED_COROUTINES_TABLE_[co] = os.time() + t;
coroutine.yield();
end


--przykladowy callback, normalnie tworzony z c++
co=coroutine.create(function()
wait(3);
print("fdfg")
wait(3);
print("fdfg")
wait(3);
print("fdfg")
end)
coroutine.resume(co)


while true do
--ta funkcja jest wywolywana z c++ co klatke
GAW_PAUSED_COROUTINES_CHECK_()
end
ten przykład działa z sciTE, ładnie się zintegrowało z c++, mam wątpliwości co do kolejności wznawiania wątków ale dopóki działa nie będę tego ruszał ;D
dzięki wszystkim