0

AndEngine を使用して、Android プラットフォーム用のゲームを作成しています。円形のボディが円形のスプライトに接触しているかどうかを検出する必要があります。これを行うために、両方の中心と半径を計算し、pythag を使用してそれらが実際に接触しているかどうかを判断しています。ただし、体の x 座標を取得しようとすると、nullpointerexception が発生し続けます。spriteNum は、画面に触れてスプライトが作成されるたびに増加します。理由はありますか?私のコード:

public class grow implements Runnable{
    Sprite sp;
    Body body[] = new Body[100];
    public grow(Sprite sprite){
        sp = sprite;
    }
    @Override
    public void run() {
        float radf, rads; //fill radius/stationary radius
        float[] fill; //fillx/stationaryx
        float fx=0, fy=0, sx, sy;

        while(down){
            //Log.e("Tag","Running thread. Down = "+Boolean.toString(down));
             yourSprite[spriteNum].setScale(scale += 0.1);
             fill = yourSprite[spriteNum].getSceneCenterCoordinates();
             fill[0]=fx;
             fill[1]=fy;
             radf=yourSprite[spriteNum].getHeightScaled()/2;    

             Log.e("Fill X before for",Float.toString(fx));

            if(spriteNum>0)
                for(int x=0;x<spriteNum;x++){               
                    rads=yourSprite[x].getHeightScaled()/2;
                    sx = body[x].getWorldCenter().x; //Null pointer exception
                    sy = body[x].getWorldCenter().y;

                    if(Math.sqrt(Math.pow((fx-sx),2)+Math.pow((fy-sy),2))<(radf+rads))
                            down = false;
                    Log.e("Fill x",Float.toString(fx));
                    Log.e("Stat x",Float.toString(sy));
                }
             try {
                Thread.sleep(75);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        body[spriteNum] = PhysicsFactory.createCircleBody(mPhysicsWorld, yourSprite[spriteNum], BodyType.DynamicBody, FIXTURE_DEF);
        mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(yourSprite[spriteNum], body[spriteNum], true, true));
        if(body[0]!=null)
            Log.e("Body created","not null"); //This says it's not null, but when I did the same thing just inside of my for() loop and it did say it was null
    }
4

1 に答える 1

3

Body body[] = new Body[100]これは、body配列を初期化したが、その中の個々のBody要素を初期化していないためだと思います。したがって、アクセスbody[x]するとnullが返されます。また、配列内の本体要素を初期化する必要があります。何かのようなもの:

for(int i=0; i<body.length; i++) {
   // probably some cod here..
   body[i] = new Body(..);
   // probably some cod here..
}

あなたの問題で私の頭に浮かんだもう1つの原因は、次のとおりです。

spriteNumは、画面に触れてスプライトが作成されるたびに増加します。

したがって、起動時にいくつかのボディ要素を初期化した後、スプライト数が増加してもボディ配列に新しい要素を作成しない可能性があります。したがって、試行body[0]するとnullではなく、ボディ要素が作成されていない可能性のある新しいスプライトに対して初期化するとnullになり、したがってNPEになります。

于 2012-06-21T06:05:50.407 に答える