Можно ли одновременно изменить несколько значений на разные суммы? - PullRequest
1 голос
/ 25 мая 2019

Я пытаюсь изменить размер и переместить объект, изменяя значения x, y и area, все одновременно.Я могу сделать их один за другим, запустив 3 отдельных цикла for, но анимация должна быть плавной и единообразной.

Я попытался вложить еще один цикл for внутри функции, но это дает тот же результат, что 1 цикл имеетзакончить до начала следующего.Единственный способ найти его - это сделать 3 отдельных сценария и запустить все 3 одновременно.

SSxPOSA =  0.00
SSxPOSB =  -12.00
SSyPOSA =  0.00
SSyPOSB =  -6.55
SSsizeA =  1.00
SSsizeB =  0.2

function SSBox1X()
    for i = SSxPOSA, SSxPOSB, 0.1
    do
    Object1X( i );
    end;
end;
function SSBox1Y()
    for i = SSyPOSA, SSyPOSB, 0.5
    do
    Object1Y( i );
    end;
end;
function SSBox1Scale()
    for i = SSsizeA, SSsizeB, 0.8
    do
    Object1Scale( i );
    end;
end;

SSBox1X();
SSBox1Y();
SSBox1Scale();

Рад читать и изучать лучшие практики

1 Ответ

1 голос
/ 26 мая 2019

Если я правильно понял вашу проблему, что-то вроде этого должно работать:

function xys()
  local x, y, s = SSxPOSA, SSyPOSA, SSsizeA
  return coroutine.wrap(
         function()
           while x >= SSxPOSB and y >= SSyPOSB and s >= SSsizeB do
             coroutine.yield(x,y,s)
             x = x - 0.1
             y = y - 0.5
             s = s - 0.8
           end
         end)
end

SSxPOSA =  0.00
SSxPOSB =  -12.00

SSyPOSA =  0.00
SSyPOSB =  -6.55

SSsizeA =  1.00
SSsizeB =  0.2

for x,y,s in xys() do
  print(x,y,s)
  --Object1X(x)
  --Object1Y(y)
  --Object1Scale(s)
end

И, поскольку сравнение с плавающей точкой не всегда дает ожидаемый результат, вероятно, лучше преобразовать в целые числа и разделить непосредственно перед использованием. Вот так:

function xys()
  local x, y, s = SSxPOSA, SSyPOSA, SSsizeA
  return coroutine.wrap(
         function()
           while x >= SSxPOSB and y >= SSyPOSB and s >= SSsizeB do
             coroutine.yield(x/100,y/100,s/100)
             x = x - 10
             y = y - 50
             s = s - 80
           end
         end)
end

SSxPOSA =  0
SSxPOSB =  -1200

SSyPOSA =  0
SSyPOSB =  -655

SSsizeA =  100
SSsizeB =  20

for x,y,s in xys() do
  print(x,y,s)
  --Object1X(x)
  --Object1Y(y)
  --Object1Scale(s)
end

Вы также можете сделать это без сопрограмм:

function xys()
  local x, y, s = SSxPOSA, SSyPOSA, SSsizeA
  return function()
           if x < SSxPOSB or y < SSyPOSB or s < SSsizeB then return end
           local xx, yy, ss = x/100, y/100, s/100
           x = x - 10
           y = y - 50
           s = s - 80
           return xx,yy,ss
         end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...