Повторение 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 )
Продолжайте кодировать............:)