Page 1 of 1

How to access information of the parent object of a Fixture

Posted: Sun Jan 05, 2025 4:54 pm
by casual_dodo
So this in theory should be a relatively straight-forward thing, but I'm getting stuck quite hard here.

If I have an object being initialized, that contains a physics body like so:

Code: Select all

local size = math.random(50) + 30
local x = math.random(maxWidth - 200)
local y = math.random(maxHeight - 200)
local box = { size = size, color = { math.random(), math.random(), math.random(), 1 } }

box.body = love.physics.newBody(world, x, y, "dynamic")
box.shape = love.physics.newRectangleShape(size, size)
box.fixture = love.physics.newFixture(box.body, box.shape, 1)
How can I access the object's information when a collision happens between two boxes? I'm using "world:getContacts()" which returns me a list of "Contacts", which in turns gives me access to the fixtures. However, how could I access the parent to change the color of the box, for example?

Am I approaching this the wrong way, should I set the data inside the fixture, instead of outside it?

Thank you!

Re: How to access information of the parent object of a Fixture

Posted: Sun Jan 05, 2025 7:12 pm
by dusoft
e.g.:

Code: Select all

fixture:getBody():getWorldPoints(fixture:getShape():getPoints())
or using custom user data:

Code: Select all

function world.collision_start(fixture_a, fixture_b, contact)
    local types = {fixture_a:getUserData().type, fixture_b:getUserData().type}
    interface.type_a = types[1]
    interface.type_b = types[2]
    if world.checkCollision(types, 'player', 'edge') then
        world.state.collision = true
...
getting contact:

Code: Select all

world.state.latest_contact = {contact:getPositions()}
using contact to draw something (crash location...):

Code: Select all

local x1, y1, x2, y2 = unpack(world.state.latest_contact)
        if x1 and y1 then
            love.graphics.setColor(love.math.colorFromBytes(255, 255, 255))
            love.graphics.circle('line', x1, y1, 5)
        end
        if x2 and y2 then
            love.graphics.line(x1, y1, x2, y2)
        end
All snippets are mine, so thread carefully.

Re: How to access information of the parent object of a Fixture

Posted: Wed Jan 08, 2025 10:07 am
by casual_dodo
Hey there @dusoft! Apologies for the late reply, but unfortunately that doesn't really answer my question. What I want is to see if I can infer the parent object just using a collision. What you showed was how to get more information from the fixture, but not a path to get its parent.

I'm trying to use 'fixture:setUserData()' to see if I can store that value in a table to compare when checking for collisions, but this seems overly complicated, not to mention not performant. Still, I can't even get that working, because the 'fixture:getUserData()' function returns nil.

Are there any other options I'm missing?

Re: How to access information of the parent object of a Fixture

Posted: Thu Jan 09, 2025 12:27 am
by RNavega
I think you were on the right track with "set the data inside the fixture" as you said.
Like from dusoft's example, you can store any Lua value inside them:

Code: Select all

box.body = love.physics.newBody(world, x, y, "dynamic")
box.shape = love.physics.newRectangleShape(size, size)
box.fixture = love.physics.newFixture(box.body, box.shape, 1)
box.fixture:setUserData(box)

Code: Select all

function my_begin_contact(fixture_a, fixture_b, contact)
    local box_a = fixture_a:getUserData()
    box_a.color[0] = 1.0
    local box_b = fixture_b:getUserData()
    box_b.color[2] = 0.0
end
From the Box2D docs: "There is no particular ordering of the A and B fixtures, so you will often need to have user data set in the fixtures or their bodies so you can tell what object the fixtures belong to."