0

ここに問題があります: 私はコロナ SDK と非常に単純なモジュールを使用して単純な物理ゲームを作成しています: http://developer.coronalabs.com/code/move-cameraだから私は物理ボディと各フレーム ( enterFrame イベント) カメラを中心に置いています

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

そして、私は2つの背景bg1とbg2を持っています.2つの背景(bg1 bg2 bg1 bg2など)は、背景が2つしかないことをユーザーが知らなくても、素敵な動く世界の効果を生み出します。問題は、そのような効果を得るために位置を正しく計算できないことです。私はたくさんグーグルで検索しましたが、私のニーズに合ったものが見つかりません。

これは、私が使用しているフリー アートです。http://www.vickiwenderlich.com/2013/02/free-game-art-flying-goldfish/では、これら 2 つの背景を見つけることができます。

また、魚がわずかに反対方向に移動する可能性もあります (通常、魚は右に移動するため、世界を動かす効果を作成するには背景を左に移動する必要があります)。

私はこのようなことを考え出しました(しかし、それはうまくいきませんが、私は近いかもしれません):

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 を超えている場合は背景の 1 つを使用してジャンプします。lfx は最後の魚の x 位置、dfx は最後と現在の魚の位置の差です。それだけです。

私の計算を手伝ってくれたり、新しい計算を教えてくれたり、興味深いリンクをいくつか教えてくれたりしたら、ここに書き込んでください。

よろしくお願いします。

4

3 に答える 3

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

于 2013-10-22T07:34:29.710 に答える
0

@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 にしか移動しません。

これらすべてを組み合わせると、魅力のように機能します。

于 2013-10-22T17:40:48.597 に答える