简体   繁体   English

Andengine Box2D如何知道汽车在飞行?

[英]Andengine Box2D How to know a car is flying?

How can we know if a box2d car is flying? 我们如何知道box2d汽车是否在飞行? This is how I do with sensors, which doesn't work perfect: 这是我对传感器的处理方式,但效果并不理想:

public void endContact(Contact contact) {
            // TODO Auto-generated method stub
            final Fixture x1 = contact.getFixtureA();
            final Fixture x2 = contact.getFixtureB();

            if (x1.getBody().getUserData() != null
                    && x2.getBody().getUserData() != null) {
                if ((x1.getBody().getUserData().equals("ground") && x2
                        .getBody().getUserData().equals("wheelSensor1"))
                        || (x1.getBody().getUserData().equals("wheelSensor1") && x2
                                .getBody().getUserData().equals("ground"))) {
                    r1 = true;
                }
                if ((x1.getBody().getUserData().equals("ground") && x2
                        .getBody().getUserData().equals("wheelSensor2"))
                        || (x1.getBody().getUserData().equals("wheelSensor2") && x2
                                .getBody().getUserData().equals("ground"))) {
                    r2 = true;
                }
                if (r1 && r2){
                    car.isFlying = true;
                }
            }
        }

        @Override
        public void beginContact(Contact contact) {
            // TODO Auto-generated method stub
            final Fixture x1 = contact.getFixtureA();
            final Fixture x2 = contact.getFixtureB();

            if (x1.getBody().getUserData() != null
                    && x2.getBody().getUserData() != null) {
                if (x1.getBody().getUserData().equals("ground")
                        && x2.getBody().getUserData().equals("wheelSensor1")) {
                    car.isFlying = false;
                    r1 = false;
                } else if (x1.getBody().getUserData().equals("wheelSensor1")
                        && x2.getBody().getUserData().equals("ground")) {
                    car.isFlying=false;
                    r1 = false;
                } else if (x1.getBody().getUserData().equals("ground")
                        && x2.getBody().getUserData().equals("wheelSensor2")) {
                    car.isFlying=false;
                    r2 = false;
                } else if (x1.getBody().getUserData().equals("wheelSensor2")
                        && x2.getBody().getUserData().equals("ground")) {
                    car.isFlying = false;
                    r2 = false;
                }
            }
        }

My sensor bodies are bigger than wheels to get better result. 我的传感器主体比轮子大,以获得更好的结果。 wheelSensorPicture But contact listener gives me endContact between sensors and ground many times even if sensors are buried in ground like in the picture. wheelSensorPicture但是接触式监听器却给我end传感器与地面之间的多次接触,即使传感器被埋在地面中(如图所示)。 I've tried same process with just wheel bodies, the result was same. 我只是用轮体尝试了相同的过程,结果是一样的。 So what is my mistake here, or what is the better way? 那么我在这里的错误是什么,或者更好的方法是什么? Thanks for any help. 谢谢你的帮助。

Try this: 尝试这个:

bool isWheelTouching(b2Body* wheel)
{
    bool wheelOnEarth = false;
    for (b2ContactEdge* edge = wheel->GetContactList(); edge != null; edge = edge->next)
    {
        if (edge->contact->IsTouching())
        {
            wheelOnEarth = true;
            break;
        }
    }
    return wheelOnEarth;
}

Call it every time step for each wheel to determine, if car on the earth or not. 每个车轮的每个时间步调用它,以确定汽车是否在地面上。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM