Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

Hi there for some reason the maskbit of my b2FixtureDef is being maxxed out and im not sure why

Here is the declaration of the items that are used in the game

enum PhysicBits {
    PB_NONE = 0x0000,
    PB_PLAYER = 0x0001,
    PB_PLATFORM = 0x0002
};

Basically what i want is the player to run along a surface is not slow down (i set platform & player friction to 0.0f)

I then setup my Contact Listener to print out the connections (currently only have 1 platform and 1 player)

Player Fixture Def

b2FixtureDef fixtureDef;
fixtureDef.shape = &groundBox;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.0f;
fixtureDef.filter.categoryBits = PB_PLAYER;
fixtureDef.filter.maskBits = PB_PLATFORM;

Platform Fixture Def

b2FixtureDef fixtureDef;
fixtureDef.shape = &groundBox;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.0f;
fixtureDef.filter.categoryBits = PB_PLATFORM;
fixtureDef.filter.maskBits = PB_PLAYER;

Now correct me if im wrong but these are saying the following:

  • Player Collides with Platform
  • Platform Collides with Player

Here is the printout of the fixtures colliding with each other

********    <-- Indicates new Contact
Platform
ContactA: 2
MaskA: 1
------
Player
ContactB: 1
MaskB: 2
********    <-- Indicates new Contact
Platform
ContactA: 2
MaskA: 1
------
Player
ContactB: 1
MaskB: 65535
********    <-- Indicates new Contact
Platform
ContactA: 1
MaskA: 65535
------
Player
ContactB: 1
MaskB: 65535

Here is where i am confused. On the second & third contact the player maskBit is set to 65535 when it should be 2 and there are 3 contacts when i am sure at most there should only be 2.

I've been trying to figure this out for hours and i can't understand why it is doing this. I would be very grateful is someone could shine some light on this for me

UPDATE: **I printed out the class of the contacting objects. For some reason it seems to do the following:

First Contact: Correct Result.

Second Contact: Player b2Fixture Obtains a new maskBit.

Third Contact: Platform b2Fixture appears to be set to the same as the Player b2Fixture. It would seem I have a memory race condition i think**

share|improve this question
    
Are you sure you're not getting some other collision in there? Is there really only a platform and a player in your world? –  bummzack Jul 16 '12 at 9:27
    
yep i only add the two items into my world –  CStreel Jul 16 '12 at 9:29
    
also if it helps im using cocos2d+box2d –  CStreel Jul 16 '12 at 9:29
add comment

1 Answer

up vote 0 down vote accepted

Ok so it seems I've figured it out.

Firstly, the multiple BeginContact Calls:

From what i can gather this is from the fact that i was checking against two Edges Colliding, and during the velocity steps of Box2d (which i had set to 8) it kept pushing the Edges apart which would cause them to overlap again and fire off another BeginContact.

It resolved my multiple BeginContact calls by switching the player & platform to Boxes (with out custom edges, using setAsBox).

Secondly, the change maskBits:

I don't know if it is a Cocos2d+Box2d related issue, but i was checking the wrong filterData.

What i was doing:

contact->GetFixtureA()->GetFilterData();

What i am now doing:

contact->GetFixtureA()->GetBody()->GetFixtureList()->GetFilterData();

Now i don't know why the filterData is stored twice in the b2Fixture object, but it seems a little redundant to me. Or if i am even supposed to use the b2Body filterData.

But my collision detection works perfectly now

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.