Android java矩形数组不起作用

时间:2016-03-04 13:32:15

标签: java android arrays rect

我正在尝试制作一个小迷宫游戏。为此,我现在有4个球可以击球。所有都是ImageViews。我使用Rect.intersect方法。

要从墙上获取矩形,我会使用ImageView.getHitRect。然后将矩形存储在矩形阵列中。这一切似乎都失败了。当我使用方法getHitRect在此数组中使用矩形时,我收到以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Rect.set(int, int, int, int)' on a null object reference

这是我的代码

private ImageView ball;
private ImageView wall[] = new ImageView[4];
private TextView text;
private SensorManager sManager;
private int a=300;     //x position
private int b=300;     //y position
int x=0;
int y=0;


Rect rect[] = new Rect[4];
Rect ballrect = new Rect();

float show = 1;



boolean allowedMovement[]={true,true,true,true};

int maxX=0;
int maxY=0;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ball = (ImageView) findViewById(R.id.ball);
    text = (TextView) findViewById(R.id.info);
    wall[0] = (ImageView) findViewById(R.id.wall1);
    wall[1] = (ImageView) findViewById(R.id.wall2);
    wall[2] = (ImageView) findViewById(R.id.wall3);
    wall[3] = (ImageView) findViewById(R.id.wall4);
    sManager = (SensorManager) getSystemService(SENSOR_SERVICE);


}

//when this Activity starts
@Override
protected void onResume()
{
    super.onResume();
    /*register the sensor listener to listen to the gyroscope sensor, use the
    callbacks defined in this class, and gather the sensor information as quick
    as possible*/
    sManager.registerListener(this, sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST);
}

//When this Activity isn't visible anymore
@Override
protected void onStop()
{
    //unregister the sensor listener
    sManager.unregisterListener(this);
    super.onStop();
}

@Override
public void onAccuracyChanged(Sensor arg0, int arg1)
{
    //Do nothing.
}

public void move(int x, int y) {
    RelativeLayout.LayoutParams alp = (RelativeLayout.LayoutParams) ball.getLayoutParams();
    int maxMovementX=Math.abs(x);
    int maxMovenentY=Math.abs(y);
    int stepsTakenX=0;
    int stepsTakenY=0;

    while(maxMovementX>stepsTakenX || maxMovenentY>stepsTakenY) {
        hitCheck();
        //up 0, down 1, right 2, left 3
        if (stepsTakenX < maxMovementX) {
            stepsTakenX=stepsTakenX+1;
            if (x > 0 && allowedMovement[2] == true) {//right
                a = a - 1;
            }
            if (x < 0 && allowedMovement[3] == true) {//left
                a = a + 1;
            }
        }

        if (stepsTakenY < maxMovenentY) {
            stepsTakenY=stepsTakenY+1;
            if (y > 0 && allowedMovement[1] == true) {//down
                b = b - 1;
            }
            if (y < 0 && allowedMovement[0] == true) {//up
                b = b + 1;
            }
        }
        alp.leftMargin = a;
        alp.topMargin = b;
        ball.setLayoutParams(alp);
    }
}

public void hitCheck(){
    //up 0, down 1, right 2, left 3
    for(int i=0;i<4;i++){
        allowedMovement[i]=true;
    }
    ball.getHitRect(ballrect);

    for(int i=0;i<4;i++) {
        wall[i].getHitRect(rect[i]);

        if (Rect.intersects(rect[i], ballrect)) {
            wall[i].setAlpha(show);
            float wy = (ballrect.width() + rect[i].width()) * (ballrect.centerY() - rect[i].centerY());
            float hx = (ballrect.height() + rect[i].height()) * (ballrect.centerX() - rect[i].centerX());

            if (wy > hx) {
                if (wy > -hx) {//top
                    allowedMovement[1] = false;
                } else {//left
                    allowedMovement[2] = false;
                }
            } else {
                if (wy > -hx) {//right
                    allowedMovement[3] = false;
                } else {//bottom
                    allowedMovement[0] = false;
                }
            }
        }

    }
}

它没有问题,但是数组中的实体

1 个答案:

答案 0 :(得分:0)

Rect rect[] = new Rect[4];仅分配存储对象引用的位置,而不分配实际对象。

尝试在rect[i] = new Rect();

之前插入wall[i].getHitRect(rect[i]);
相关问题