Повторение 2 фонов в Corona SDK

Вот проблема: я делаю простую физическую игру с использованием Corona SDK и очень простого модуля: http://developer.coronalabs.com/code/move-camera Итак, у меня есть объект-рыба с физическим телом и в каждом кадре (событие enterFrame) я на нем фокусирую камеру

camera.x = -fish.x + screenWidth / 2

И у меня есть два фона bg1 и bg2, которые мозаичные друг за другом (bg1, bg2, bg1, bg2 и т. Д.) Создадут приятный эффект движущегося мира, не зная, что существует только 2 фона. Проблема в том, что я не могу правильно рассчитать свои позиции, чтобы добиться такого эффекта. Я много гуглил, но не могу найти ничего, что соответствовало бы моим потребностям.

Вот бесплатное искусство, которое я использую http://www.vickiwenderlich.com/2013/02/free-game-art-flying-goldfish/ Там вы можете найти эти два фона.

Также возможно, что рыба может двигаться немного в противоположном направлении (как правило, она движется вправо, поэтому фоны с движущимся миром должны перемещаться влево), поэтому было бы хорошо, если бы это было в расчетах.

Я понял, что-то вроде этого (хотя это не работает, но, возможно, я близко):

local function updateFrame(event)

    local m
    local dfx = lfx - fish.x

    lfx = fish.x
    camera.x = -fish.x + screenWidth / 2

    --print("dfx = " .. dfx)

    bg1.x = bg1.x + dfx
    bg2.x = bg2.x + dfx

    s = s + dfx

    if mAbs(s) > screenWidth then
        m = sgn(s)

        if m ~= 0 then
            s = s - m * screenWidth
            if m < 0 then
                bg1.x = bg1.x - 2 * m * screenWidth
            else
                bg2.x = bg2.x - 2 * m * screenWidth
            end
        end
    end

end
Runtime:addEventListener( "enterFrame", updateFrame );

s = screenLeft - screenWidth

где s - сумма перемещенных пикселей, и если она превышает screenWidth, я прыгаю с одним из фонов, lfx - это местоположение последней рыбы x, dfx - это разница между последней и текущей локацией рыбы, вот и все.

Если вы можете помочь мне с моими расчетами или дать мне новые или просто дать некоторые интересные ссылки, пожалуйста, напишите их прямо здесь.

Любая помощь будет оценена, С уважением

3 ответа

Решение

Спасибо @krs и @Malar, объединяя ваши ответы, я понял, как это сделать:

local function updateFrame(event)

    local speed = fish.x - lfx
    lfx = fish.x

    camera.x = -fish.x + screenWidth / 2

    bg1.x = bg1.x - speed
    bg2.x = bg2.x - speed

    if bg1.x + bg1.width < 0 then
        bg1.x = bg1.x + screenWidth * 2
    end
    if bg2.x + bg2.width < 0 then 
        bg2.x = bg2.x + screenWidth * 2
    end

    if bg1.x - bg1.width > 0 then
        bg1.x = bg1.x - screenWidth * 2
    end
    if bg2.x - bg2.width > 0 then 
        bg2.x = bg2.x - screenWidth * 2
    end

end
Runtime:addEventListener( "enterFrame", updateFrame );

Стартовые позиции:

bg1.x = screenLeft
bg2.x = bg1.x + bg1.width

И последнее самое важное изменение: я поместил bg1, bg2 и камеру в группу, а другие объекты в группу камер:

local camera = require("camera")
group = display.newGroup()
group:insert(bg1)
group:insert(bg2)
camera:insert(fish)
camera:insert(ground)
group:insert(camera)

Таким образом, у нас есть рыба и земля, которые могут двигаться вечно, но фон только перемещается от -screenWidth к screenWidth.

Все эти вещи в сочетании работают как шарм!

local road = display.newImageRect( "Images/roadBg1.png",2247/4,559/4 )
road:setReferencePoint( display.CenterLeftReferencePoint )
road.x = 0
road.y = baseline - 20
local road2 = display.newImageRect( "Images/roadBg1.png",2247/4,559/4  )
road2:setReferencePoint( display.CenterLeftReferencePoint )
road2.x = 2247/4
road2.y = baseline - 20

local tPrevious = system.getTimer()
local function move(event)
local tDelta = event.time - tPrevious
tPrevious = event.time

local xOffset = ( 0.2 * tDelta )

road.x = road.x - xOffset
road2.x = road2.x - xOffset
if (road.x + road.contentWidth) < 0 then
    road:translate( 2247/4 * 2, 0)

end
if (road2.x + road2.contentWidth) < 0 then
    road2:translate( 2247/4 * 2, 0)

end
Runtime:addEventListener( "enterFrame", move )

или посмотрите пример кода игры сцены джунглей.

Расположение: SampleApps/Sprites/JungleScene

Попробуй это:

local bg1 = display.newImageRect( "bg_1.png" ,480 ,320)
bg1.x = display.contentWidth/2; bg1.y = display.contentHeight/2

local bg2 = display.newImageRect( "bg_2.png" ,480 ,320 )
bg2.x = bg1.x + bg1.width; bg2.y = display.contentHeight/2


local speed = 30
function move()
  bg1.x = bg1.x-speed;
  bg2.x = bg2.x-speed;
  if(bg1.x + bg1.width/2 < 0)then bg1.x = bg1.width*3/2-speed
  elseif(bg2.x + bg2.width/2 < 0)then bg2.x = bg2.width*3/2-speed end
end
Runtime:addEventListener( "enterFrame", move )

Продолжайте кодировать............:)

Другие вопросы по тегам