需要知道碰撞何时开始和结束 box2d
Need to know when collision is begin and end box2d
public class Contact implements ContactListener {
@Override
public void beginContact(Contact contact) {
Fixture fa = contact.getFixtureA();
Fixture fb = contact.getFixtureB();
if (fa.getFilterData().categoryBits==16){
((Gamescreen)fa.getUserData()).starttouch(fa,fb);
}
@Override
public void endContact(Contact contact) {
Fixture fa = contact.getFixtureA();
Fixture fb = contact.getFixtureB();
if (fa.getFilterData().categoryBits==16)
{
((Gamescreen)fa.getUserData()).endtouch();
}
当只有一个物体要触摸时,这段代码工作正常,但有时我需要将两个物体放在一起。
就像当玩家走在彼此并排的 2 个物体上(没有跳跃)时,第二个方法 (endcontact
) 被调用但第一个方法 (begincontact
) 没有再次被调用。
如果我没理解错的话,link 可能就是您要查找的内容:
http://www.iforce2d.net/b2dtut/collision-callbacks
它是 C++,但您可以看到一对对象的碰撞回调的示例实现:
void BeginContact(b2Contact* contact) {
//check if fixture A was a ball
void* bodyUserData = contact->GetFixtureA()->GetBody()->GetUserData();
if ( bodyUserData )
static_cast<Ball*>( bodyUserData )->startContact();
//check if fixture B was a ball
bodyUserData = contact->GetFixtureB()->GetBody()->GetUserData();
if ( bodyUserData )
static_cast<Ball*>( bodyUserData )->startContact();
}
此外,如果联系人已开始,您不会保存 true/false,但联系人数量:
//new implementation for contact state change
void startContact() { m_numContacts++; }
void endContact() { m_numContacts--; }
public class Contact implements ContactListener {
@Override
public void beginContact(Contact contact) {
Fixture fa = contact.getFixtureA();
Fixture fb = contact.getFixtureB();
if (fa.getFilterData().categoryBits==16){
((Gamescreen)fa.getUserData()).starttouch(fa,fb);
}
@Override
public void endContact(Contact contact) {
Fixture fa = contact.getFixtureA();
Fixture fb = contact.getFixtureB();
if (fa.getFilterData().categoryBits==16)
{
((Gamescreen)fa.getUserData()).endtouch();
}
当只有一个物体要触摸时,这段代码工作正常,但有时我需要将两个物体放在一起。
就像当玩家走在彼此并排的 2 个物体上(没有跳跃)时,第二个方法 (endcontact
) 被调用但第一个方法 (begincontact
) 没有再次被调用。
如果我没理解错的话,link 可能就是您要查找的内容: http://www.iforce2d.net/b2dtut/collision-callbacks
它是 C++,但您可以看到一对对象的碰撞回调的示例实现:
void BeginContact(b2Contact* contact) {
//check if fixture A was a ball
void* bodyUserData = contact->GetFixtureA()->GetBody()->GetUserData();
if ( bodyUserData )
static_cast<Ball*>( bodyUserData )->startContact();
//check if fixture B was a ball
bodyUserData = contact->GetFixtureB()->GetBody()->GetUserData();
if ( bodyUserData )
static_cast<Ball*>( bodyUserData )->startContact();
}
此外,如果联系人已开始,您不会保存 true/false,但联系人数量:
//new implementation for contact state change
void startContact() { m_numContacts++; }
void endContact() { m_numContacts--; }