簡體   English   中英

ApplyLinearForce應用於動態實體會導致NullPointerException / Libgdx box2d

[英]ApplyLinearForce to dynamic body causes NullPointerException/ Libgdx box2d

我正在使用Eclipse中的libgdx box2d庫開發一個Android游戲。 在游戲中,有一個球在觸摸開始按鈕后掉落了。 但是當球接觸動態物體時,我得到了nullpointerexception。

接觸時,我想將LinearForce應用於該動態主體。 但是我在球和動態物體的接觸上一直得到nullpointerexception。

ContactHandler類:

公共類ContactHandler實現了ContactListener {

InputHandler input;

@Override
public void beginContact(Contact contact) {
    if(contact.getFixtureA().getBody().getUserData() == "do1" && contact.getFixtureB().getBody().getUserData() == "ball"){
        System.out.println("beginContact");
        input = new InputHandler();
        input.getBody1().applyLinearImpulse(10, 0, 0, 0, true);
    }
}

InputHandler類:

公共類InputHandler實現InputProcessor {

private OrthographicCamera camera;
private Ball ball;
private DragObject dragObject;

private boolean start = false;
private Vector3 touch = new Vector3();
private Vector3 dragTo = new Vector3();

public InputHandler(){

}

public InputHandler(OrthographicCamera camera, Ball ball,
        DragObject dragObject) {
    this.camera = camera;
    this.ball = ball;
    this.dragObject = dragObject;

}

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
    if (!start) {
        for (Body body : dragObject.getBody()) {
            if (touch.x > body.getPosition().x - dragObject.getWidth() - 1
                    && touch.x < body.getPosition().x
                            + dragObject.getWidth() + 1) {
                if (touch.y > body.getPosition().y - dragObject.getHeight()
                        - 1
                        && touch.y < body.getPosition().y
                                + dragObject.getHeight() + 1) {
                    dragTo.set(screenX, screenY, 0);
                    camera.unproject(dragTo);
                    body.setTransform(dragTo.x, dragTo.y, 0);
                    touch.set(screenX, screenY, 0);
                    camera.unproject(touch);
                }
            }
        }
    }
    return false;
}
public Body getBody1(){
    return dragObject.getBody().get(0);
}

DragObject類:

public static Array<Body> bodies = new Array<Body>();
public static int count = 0;

public DragObject(){

}

public DragObject(World world, float x, float y, float width, float height) {
    this.world = world;
    this.width = width;
    this.height = height;

    initialize();

    body1 = world.createBody(bodyDef1);
    body1.createFixture(fixtureDef);
    body1.setUserData("do1");
    bodies.add(body1);

}

public Array<Body> getBody() {
    return bodies;
}

您的輸入處理程序的構造函數錯誤,這些行應刪除:

public InputHandler(){

}

因為當您在此處調用此構造函數時:

public void beginContact(Contact contact) {
    if(contact.getFixtureA().getBody().getUserData() == "do1" && contact.getFixtureB().getBody().getUserData() == "ball"){
        System.out.println("beginContact");

        //You are using the wrong contructor, therefore body1 or dragObject is never initialised
        input = new InputHandler();
        //The null pointer exception is here, no body1 has been initialised yet
        input.getBody1().applyLinearImpulse(10, 0, 0, 0, true);
    }

您需要使構造函數匹配並在InputHandler類中創建一個新的DragObject,並且要注意的是,每次身體碰撞時,初始化類的效率都不高。我敢肯定,您可以想到一種更好的方式來組織它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM