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