在Corona SDK中重复两个背景

问题是这样的:我正在使用Corona SDK和非常简单的模块制作一个简单的物理游戏:http://developer.coronalabs.com/code/move-camera

所以我有一个有物理属性的鱼对象,在每个帧(enterFrame事件)中,我将相机居中于它:

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

我有两个背景bg1和bg2,它们相互瓦片(bg1 bg2 bg1 bg2等),可以产生良好的移动世界效果,使用户无法知道只有两个背景。问题是我无法得到正确的位置计算来产生这种效果。我搜索了很多,但找不到适合我的需求的东西。

这里有一个免费的艺术品,我正在使用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是上次和当前鱼的位置之间的差异,就是这样。

如果您可以帮助我进行计算或提供新的计算或只是提供一些有趣的链接,请在此处写下它们。

感激不尽,谢谢!

点赞
用户2469861
用户2469861
-- 创建和设置背景道路图像1和2
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

    -- 移动背景道路图像1和2
    road.x = road.x - xOffset
    road2.x = road2.x - xOffset

    -- 如果背景道路图像1已经完全移出屏幕,则将其移动到屏幕最右侧
    if (road.x + road.contentWidth) < 0 then
        road:translate(2247/4 * 2, 0)
    end

    -- 如果背景道路图像2已经完全移出屏幕,则将其移动到屏幕最右侧
    if (road2.x + road2.contentWidth) < 0 then
        road2:translate(2247/4 * 2, 0)
    end
end

-- 每帧调用一次 move 函数,实现背景道路图像的滚动效果
Runtime:addEventListener( "enterFrame", move )

或者查看 Jungle Scene 游戏的示例代码,路径为 SampleApps/Sprites/JungleScene

2013-10-22 07:34:29
用户1979583
用户1979583
local bg1 = display.newImageRect( "bg_1.png" ,480 ,320)  -- 创建图片对象 bg1,大小为480*320
bg1.x = display.contentWidth/2; bg1.y = display.contentHeight/2  -- 设置图片对象 bg1 的位置

local bg2 = display.newImageRect( "bg_2.png" ,480 ,320 )  -- 创建图片对象 bg2,大小为480*320
bg2.x = bg1.x + bg1.width; bg2.y = display.contentHeight/2  -- 设置图片对象 bg2 的位置

local speed = 30  -- 设置背景移动的速度

function move()
  bg1.x = bg1.x-speed;  -- 使 bg1 向左移动
  bg2.x = bg2.x-speed;  -- 使 bg2 向左移动
  if(bg1.x + bg1.width/2 < 0)then bg1.x = bg1.width*3/2-speed  -- 如果 bg1 移动到屏幕外,就将其重新设置在 bg2 后面
  elseif(bg2.x + bg2.width/2 < 0)then bg2.x = bg2.width*3/2-speed end  -- 如果 bg2 移动到屏幕外,就将其重新设置在 bg1 后面
end

Runtime:addEventListener( "enterFrame", move )  -- 每一帧都执行 move 函数

继续 coding ......:)

2013-10-22 10:21:44
用户1264375
用户1264375

感谢 @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 和 camera 放入一个 group 中,并把其他对象放入 camera group 中:

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

因此,我们有了可以永远移动的地面和鱼,但是背景只能从 -screenWidth 移动到 screenWidth。

所有这些组合起来就像一个魅力!

2013-10-22 17:40:48