【问题标题】:Repeating 2 backgrounds in Corona SDK在 Corona SDK 中重复 2 个背景
【发布时间】:2013-10-22 05:32:22
【问题描述】:

这里有一个问题:我正在使用 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 是最后一条和当前鱼位置之间的差异,仅此而已。

如果你能帮我计算或给我新的或只是给一些有趣的链接,请写在这里。

任何帮助将不胜感激, 问候

【问题讨论】:

    标签: background lua coronasdk tiles


    【解决方案1】:
    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

    【讨论】:

      【解决方案2】:

      试试这个:

      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 )
      

      继续编码............ :)

      【讨论】:

        【解决方案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。

        所有这些东西结合起来就像一个魅力!

        【讨论】:

          猜你喜欢
          • 2014-06-16
          • 2016-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-03
          相关资源
          最近更新 更多