0

touchイベントとイベントを使用して、コロナでiPadスタイルの慣性スクロールを模倣しようとしていenterFrameます。つまり、iPadでのスクロールと同じように、オブジェクトをある程度ドラッグして「投げる」ことができるはずです。私はコロナにかなり慣れていませんが、以前は他の言語を使用していました。(これは私の2日目です。)

これは私がこれまでに持っているコードです:

local bg = display.newImage("cloud.jpg");
bg:setReferencePoint(bg.TopLeftReferencePoint);
bg.x = 0;
bg.y = 0;

function bg:touch (event)
    print("event", event)
    for i,v in pairs(event) do
        print("**: ",i,v)
    end

    bg.x = event.x;
    bg.y = event.y;

    bg.xStart = event.xStart;
    bg.yStart = event.yStart;

    if (event.phase == "ended")
    then
        bg.xdelta = bg.xStart + bg.x;
        bg.ydelta = bg.yStart + bg.y;
        Runtime.addEventListener("enterFrame", bg);
    end 
end

function bg:enterFrame(event)
    bg.x = bg.x + bg.xdelta;
    bg.y = bg.y + bg.ydelta;
    // TODO: Add code to decrease delta so that object gradually stops.
end

bg:addEventListener("touch");

これにより、コンパイラでエラーが発生します。私は何が間違っているのですか?enterFrame関数をテーブル関数ではなくローカル関数にしようとしましたが、同じ問題が発生しました。答えは非常に単純だと確信していますが、コロナに精通していないため、すぐに確認できません。

編集:私はいくつかの読書をしました、そして私はこれが私が望むものに近いことに気づきました:

local bg = display.newImage("cloud.jpg");
bg:setReferencePoint(bg.TopLeftReferencePoint);
bg.x = 0;
bg.y = 0;
bg.xdelta = 0;
bg.ydelta = 0;

local function onEveryFrame(event)
    bg.x = bg.x + (bg.oldx - bg.x);
    bg.y = bg.y + (bg.oldy - bg.y);
end

function bg:touch (event)
    if (event.phase == "ended")
    then
        print("ended")
        bg.oldx = bg.x;
        bg.oldy = bg.y;

        bg.x = event.x;
        bg.y = event.y;
        Runtime.addEventListener("enterFrame", onEveryFrame)
    end 

    print("event", event)
    for i,v in pairs(event) do
        print("**: ",i,v)
    end

    bg.oldx = bg.x;
    bg.oldy = bg.y;

    bg.x = event.x;
    bg.y = event.y;

    print("bg.x:", bg.x)
    print("bg.oldx:", bg.oldx)
    print("bg.y:", bg.y)
    print("bg.oldy:", bg.oldy)
end

bg:addEventListener("touch");

これはもはやエラーではありませんが、私も望ましい結果を得ていません...

4

2 に答える 2

2

コロナではこの問題を解決しようとはしませんでしたが、Director でスムーズ スクロールを実装するときに、この問題に何度も遭遇しました。

ドラッグ中に、位置の違いとタイムスタンプの違いを比較して、複数のタッチ イベントの速度を測定する速度をキャプチャします。個々の測定ポイントにテーブルまたはリンクされたリストを使用し、保存された値の速度を平均します。

次に、最後の「移動」イベントと同じ位置にある「終了」イベントは、速度をわずかに低下させ、慣性を維持します。ドラッグ イベントがない場合は、摩擦の速度から値を減算します。

于 2012-11-01T04:13:06.850 に答える
0

実際には、構文エラーがあります。

Runtime:AddEventListener です ( の代わりに : に注意してください。)

編集:

今あなたの数学について:

あなたのロジックは次のとおりです:移動されたイベント中に、bg.p(xとyの両方の位置のp)をevent.pに設定します

終了したイベント中に、bg.olp を bg.p に設定し、次に bg.p を event.p に設定し、すべてのフレームで bg.p+=(bg.oldp-bg.p) を実行しようとします。

これは、結果が次のようになるため、「移動」でolpロジックを実行した場合に機能する可能性があります。

ユーザーは指を動かします: イベント トリガーを移動し、bg.p を変更しました (したがって、動いていることがわかります)。ユーザーが指を離そうとする: これは、最後の「移動」イベントと同じ場所でトリガーされる非常に高い変化を伴う「終了」イベントをトリガーします (指を非常に、非常に、非常に速く動かして移動する必要があります)。最後の「移動」から遠く離れた「終了」をトリガーします)。これにより、bg.oldp が bg.p と同じになるため、bg.p+=(bg.olp-bg.p) を実行すると、結果は bg.p+=0 になります。

于 2012-08-22T22:37:42.057 に答える