2016-12-08 8 views
0

Так что, создавая мобильную игру с помощью Corona SDK, я недавно столкнулся с проблемой, которую я не мог решить, что является позиционным различием при появлении экранных объектов в петля. Я получил некоторую помощь и выяснил, что это должно быть связано с независимой от частоты кадров анимацией. Но теперь im сталкивается с этим:Lua/Corona SDK/Loop Нерест/Позиционная разность/Независимая от кадра независимость

Хотя я использую независимую от частоты кадров анимацию здесь, это также создает ту же проблему. Это подчеркивается увеличением скорости цикла, как в приведенном ниже коде. Что вы думаете об этом?

local loopSpeed = 306 
local loopTimerSpeed = 1000 
local gapTable = {} 
local gapLoopTimer 
local frameTime 
local gap 

--enterFrame for time only 

    local function frameTime(event) 

     frameTime = system.getTimer() 

    end 

--enterFrame 

    local function enterFrame(self, event) 

     local deltaTime = frameTime - self.time 
     print(deltaTime/1000) 
     self.time = frameTime 
     local speed = self.rate * deltaTime/1000 
     self:translate(speed, 0) 

    end 

--loop speed function 

local function setLoopSpeed(factor) 

    loopSpeed = loopSpeed * factor 
    loopTimerSpeed = loopTimerSpeed/factor 

end 

--set the loop speed 

    setLoopSpeed(3) 

--loop to create gaps 

local function createGap() 

    gap = display.newRect(1, 1, 308, 442) 
    gap.time = system.getTimer() 
    gap.anchorX = 1 
    gap.anchorY = 0 

    --animation 

     gap.rate = loopSpeed 
     gap.enterFrame = enterFrame 
     Runtime:addEventListener("enterFrame", gap) 

    --fill table for cleaning up 

     table.insert(gapTable, gap) 

    --cleaning up 

     for i = #gapTable, 1, -1 do 

      local thisGap = gapTable[i] 

      if thisGap.x > display.contentWidth + 500 then 

       display.remove(thisGap) 
       table.remove(gapTable, i) 
       Runtime:removeEventListener("enterFrame", thisGap) 

      end 

      thisGap = nil 

     end 

end 

Runtime:addEventListener("enterFrame", frameTime) 

gapLoopTimer = timer.performWithDelay(

    loopTimerSpeed, 
    createGap, 
    0 

) 
+0

Что вы имеете в виду, написав «позиционные различия». Вы имеете в виду промежутки между прямоугольниками? Что для вас важно? равные пробелы? – ldurniat

+0

Да, я имею в виду пробелы между прямоугольниками и то, как эти зазоры также становятся больше и меняются по размеру, когда скорость цикла увеличивается. Это можно увидеть при выполнении этого с помощью симулятора Corona ... Это проблема для меня, потому что в моем реальном приложении в этом цикле есть несколько отображаемых объектов, которые должны быть полностью выровнены. – Footurist

+0

Вы не знаете, о чем это? – Footurist

ответ

0

Если вы можете установить размер зазора между прямоугольниками попробуйте использовать код ниже

local gapTable = {} 
local gapWidth = 50 
local runtime = 0 
local speed = 20 
local gap 

local function getDeltaTime() 
    local temp = system.getTimer() -- Get current game time in ms 
    local dt = (temp-runtime)/(1000/display.fps) -- 60 fps or 30 fps as base 
    runtime = temp -- Store game time 
    return dt 
end 

local function enterFrame() 
    local dt = getDeltaTime() 

    for i=1, #gapTable do 
     gapTable[i]:translate(speed * dt, 0) 
    end  
end 

local function createGap() 
    local startX = 0 

    if #gapTable > 0 then 
     startX = gapTable[#gapTable].x - gapWidth - gapTable[#gapTable].width 
    end 

    gap = display.newRect(startX, 1, 308, 442) 
    gap.anchorX, gap.anchorY = 1, 0 

    table.insert(gapTable, gap) 

    --cleaning up 
    for i=#gapTable, 1, -1 do 
     if gapTable[i].x > display.contentWidth + 500 then 
      local rect = table.remove(gapTable, i) 

      if rect ~= nil then 
       display.remove(rect) 
       rect = nil 
      end  
     end 
    end 
end 

timer.performWithDelay(100, createGap, 0) 

Runtime:addEventListener("enterFrame", enterFrame) 

Надеется, что это помогает :)

+0

Эй, спасибо за ваш ответ еще раз. Между тем, я начал использовать плагин deltaTime, который вы начинаете, например, на этапе создания вашей сцены, а затем точно вычисляется время. Кажется, это работает. Но теперь я заметил, что это, может быть, другая проблема, чем я думал: эти нежелательные смещения в моем цикле, похоже, происходят из-за проблем с производительностью. Я заметил это, когда я минимизирую и максимизирую симулятор или перезагружаю приложение. Любая идея, что может вызвать это? Возможно, это ограничение симулятора? – Footurist

+0

Не знаю. Существует ли проблема на реальном устройстве? – ldurniat