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."