3

Love2d フレームワークの単純なゲームでオブジェクトと衝突を管理するための基本アーキテクチャを作成しようとしています。すべてのオブジェクトがテーブル ( ) に格納され、関数objects:activeObjects内のループがすべてのオブジェクトを反復処理します。objects:calculateCollisions()反復ごとに、ネストされた別のループが、そのオブジェクトが同じテーブル内の他のオブジェクトと重複しているかどうかを確認します。の最後にobjects:calculateCollisions()、各オブジェクトには、現時点で重複しているすべてのオブジェクトへの参照を含むテーブルが理想的です。ただし、オブジェクトには常に空の衝突​​テーブルがあります。

現在、2 つのテスト オブジェクトがあります。1 つはマウスで移動し、もう 1 つは常に右上隅に留まります。ユーザーには、2 つのオブジェクトが重なると同時に消えるはずですが、前述のように、collidingObjectsテーブルは常に空です。3つ

のソース ファイルあります
main.lua。テスト オブジェクトが定義されています):

objects.lua

customObjects.lua

function objects:newCollidingObject(x, y)
    local result = self:newActiveObject(x, y, 50, 50)
    result.id = "collidingObject"
    function result:collide(other)
        if other.id == "collidingObject" then self.remove = true end
    end
    return result
end
function objects:newMovingObject(x, y)
    local result = self:newCollidingObject(x, y)
    function result:act()
        self.x = love.mouse.getX()
        self.y = love.mouse.getY()
    end
    return result
end

2 つ以上のハイパーリンクを投稿できませんでした。

編集:さらにデバッグした後、問題を機能に絞り込みましたcollidesWith(obj)。常にfalseを返すようです。
コードは次のとおりです。

function result:collidesWith(obj)
    if self.bottom < obj.top then return false end
    if self.top > obj.bottom then return false end
    if self.right < obj.left then return false end
    if self.left > obj.right then return false end
    return true
end
4

1 に答える 1

2

いくつかの異なるテスト入力を使用して、紙のロジックを調べてトレースします。ロジックが無意味であることがすぐにわかります。テストの半分が欠落している、比較の一部が「間違った方向を指している」などです。したがって、次のようになります。

function result:collidesWith(obj)
    if self.bottom <= obj.top and self.bottom >= obj.bottom then return true end
    if self.top >= obj.bottom and self.top <= obj.top then return  true end
    if self.right >= obj.left and self.right <= obj.right then return false end
    if self.left <= obj.right and self.left >= obj.left then return false end
    return false
end

トリックを行う必要があります。

于 2013-01-13T14:11:25.813 に答える