2016-03-08 109 views
0

我正在测试我的系统的hitboxes为我正在制作的游戏。问题是我在我的球类中出现以下错误: java.lang.NullPointerException:尝试在空对象引用ImageView未初始化

上调用虚拟方法'android.view.View android.view.Window.findViewById(int)'

它发生在球类的构造函数方法的第一行。 有谁知道我是否做错了什么?

主类:

package xander.mazetestapp; 

import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity implements SensorEventListener { 
    private TextView text; 
    private SensorManager sManager; 
    private int a = 300;  //x position 
    private int b = 300;  //y position 
    int x = 0; 
    int y = 0; 
    ball playingBall; 
    wall mazeWall; 
    float show = 1; 
    float hide = 0; 
    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); 

    text = (TextView) findViewById(R.id.info); 
    sManager = (SensorManager) getSystemService(SENSOR_SERVICE); 

    playingBall = new ball(); 
    mazeWall = new wall(hide, R.id.wall1); 

} 

//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 limitMovement(ball ball, wall wall) { 
    float wy = (ball.getWidth() + wall.getWidth()) * (ball.getCenterY() - wall.getCenterY()); 
    float hx = (ball.getHeight() + wall.getHeight()) * (ball.getCenterX() - wall.getCenterX()); 

    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; 
     } 
    } 
} 

public boolean intersect(ball ball, wall wall) { 
    //top left corner of the ball 
    if (ball.getTopLeftX() >= wall.getTopLeftX() && ball.getTopLeftX() <= wall.getTopRightX()) { 
     if (ball.getTopLeftY() >= wall.getTopLeftY() && ball.getTopLeftY() <= wall.getBottomLeftY()) { 
      limitMovement(ball, wall); 
      return true; 
     } 
    } 

    //top rigth corner of the ball 
    if (ball.getTopRightX() >= wall.getTopLeftX() && ball.getTopRightX() <= wall.getTopRightX()) { 
     if (ball.getTopRightY() >= wall.getTopLeftY() && ball.getTopRightY() <= wall.getBottomLeftY()) { 
      limitMovement(ball, wall); 
      return true; 
     } 
    } 

    //bottom left corner of the ball 
    if (ball.getBottomLeftX() >= wall.getBottomLeftX() && ball.getBottomLeftX() <= wall.getBottomRightX()) { 
     if (ball.getBottomLeftY() >= wall.getTopLeftY() && ball.getBottomLeftY() <= wall.getBottomLeftY()) { 
      limitMovement(ball, wall); 
      return true; 
     } 
    } 

    //bottom rigth corner of the ball 
    if (ball.getBottomRightX() >= wall.getBottomLeftX() && ball.getBottomRightX() <= wall.getBottomRightX()) { 
     if (ball.getBottomRightY() >= wall.getTopLeftY() && ball.getBottomRightY() <= wall.getBottomLeftY()) { 
      limitMovement(ball, wall); 
      return true; 
     } 
    } 


    return false; 

} 


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

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

     if (stepsTakenY < maxMovenentY) { 
      stepsTakenY = stepsTakenY + 1; 
      if (y > 0 && allowedMovement[1] == true) {//down 
       playingBall.setCenterY(playingBall.getCenterY() - 1); 
       b = b - 1; 
      } 
      if (y < 0 && allowedMovement[0] == true) {//up 
       playingBall.setCenterY(playingBall.getCenterY() + 1); 
       b = b + 1; 
      } 
     } 

    } 

    alp.leftMargin = a; 
    alp.topMargin = b; 
    playingBall.setLayoutParams(alp); 
} 


@Override 
public void onSensorChanged(SensorEvent event) { 

    //if sensor is unreliable, return void 
    if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) { 
     return; 
    } 

    //else it will output the Roll, Pitch and Yawn values 
    x = Math.round(event.values[2])/3; 
    y = Math.round(event.values[1])/3; 

    if (x > 15) { 
     x = 15; 
    } 
    if (x < -15) { 
     x = -15; 
    } 
    if (y > 15) { 
     y = 15; 
    } 
    if (y < -15) { 
     y = -15; 
    } 


    //kleinere x is naar links 
    //kleinere y is naar boven 
    //balk1 is boven 
    //balk2 is onder 
    //balk3 is links 
    //balk 4 is rechts 


    move(x, y); 


    text.setText("Width: " + playingBall.getWidth() + 
        " Height: " + playingBall.getHeight() + 
        " B x: " + playingBall.getCenterX() + 
        " B y: " + playingBall.getCenterY() + 
        " W x: " + mazeWall.getCenterX() + 
        " W y: " + mazeWall.getCenterY() + 
        " wall LB x: " + mazeWall.getTopLeftX() + 
        " wall LB y: " + mazeWall.getTopLeftY() + 
        "Width: " + mazeWall.getWidth() + 
        " Height: " + mazeWall.getHeight() 


    ); 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

}

球类:

package xander.mazetestapp; 


import android.app.Activity; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 



public class ball extends AppCompatActivity { 

private int centerX; 
private int centerY; 
private int topLeftX; 
private int topRightX; 
private int bottomLeftX; 
private int bottomRightX; 
private int topLeftY; 
private int topRightY; 
private int bottomLeftY; 
private int bottomRightY; 
private int width; 
private int height; 
public ImageView ballImage; 


public ball(){ 
    ballImage = (ImageView) findViewById(R.id.ball); 

    centerX =(int) ballImage.getX(); 
    centerY = (int) ballImage.getY(); 
    width = ballImage.getWidth(); 
    height = ballImage.getHeight(); 

    setCorners(); 
} 

private void setCorners() { 
    topLeftX=(centerX-(width/2)); 
    topLeftY=(centerY-(height/2)); 

    topRightX=(centerX+(width/2)); 
    topRightY=(centerY-(height/2)); 

    bottomRightX=(centerX+(width/2)); 
    bottomRightY=(centerY+(height/2)); 

    bottomLeftX=(centerX-(width/2)); 
    bottomLeftY=(centerY+(height/2)); 
} 

public int getWidth(){ 
    return width; 
} 

public int getHeight(){ 
    return height; 
} 

public int getCenterX(){ 
    return centerX; 
} 

public int getCenterY(){ 
    return centerY; 
} 

public int getTopLeftX(){ 
    return topLeftX; 
} 

public int getTopRightX(){ 
    return topRightX; 
} 

public int getBottomLeftX(){ 
    return bottomLeftX; 
} 

public int getBottomRightX(){return bottomRightX;} 

public int getTopLeftY(){ 
    return topLeftY; 
} 

public int getTopRightY(){ 
    return topRightY; 
} 

public int getBottomLeftY(){ 
    return bottomLeftY; 
} 

public int getBottomRightY(){ 
    return bottomRightY; 
} 

public void setCenterX(int x){ 
    centerX=x; 
} 

public void setCenterY(int y){ 
    centerY=y; 
} 









public RelativeLayout.LayoutParams getLayoutParams(){ 
    return (RelativeLayout.LayoutParams) ballImage.getLayoutParams(); 

} 

public void setLayoutParams(RelativeLayout.LayoutParams alp){ 
    ballImage.setLayoutParams(alp); 
} 
+1

球类活性,因此在初始化onCreate方法的ImageView –

回答

1

我猜Hardik是右路拿球类是因为你已经使用的活动来延长appCompatActivity。所以你必须在onCreate方法中初始化图像视图。

0

任何活动初始化发生的onCreate(后),你需要获得在OnCreate(在ImageView的参考),并确保你的setContentView()设置布局,然后得到ImageView的参考

0

你的球类实际上并不是一项活动。这是一个简单的课程。您不需要扩展AppCompatActivity。只需使用参数作为上下文来创建ball类的构造函数,然后使用该上下文就可以获得imageview。

变化ball.java低于:

删除 “延伸AppCompatActivity” 并使其简单类。在main.java

public ball(Context context){ 
    ballImage = (ImageView) context.findViewById(R.id.ball); 
    centerX =(int) ballImage.getX(); 
    centerY = (int) ballImage.getY(); 
    width = ballImage.getWidth(); 
    height = ballImage.getHeight(); 
    setCorners(); 
} 

变化如下:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    text = (TextView) findViewById(R.id.info); 
    sManager = (SensorManager) getSystemService(SENSOR_SERVICE); 

    playingBall = new ball(this); // Here we pass the context of the current activity 

    mazeWall = new wall(hide, R.id.wall1); 

}