2016-05-29 18 views
0

タッチイベントと加速度計を組み合わせてSurfaceViewにオブジェクトを移動するのに問題があります。加速度計+ Touchで車を移動するタッチ

私は次の行にNullPointerExceptionがを取得しています:

player = new Player((SensorManager)mContext.getSystemService (Context.SENSOR_SERVICE), BitmapFactory.decodeResource(getResources(), R.drawable.helicopter), 65, 25, 3); 

そして、これは私にが並んで "itselfeに割り当てられている" ヒント与えない:

this.mContext = mContext; 

をどのI推測は問題の原因になる可能性がありますが、私は自分の問題をどのように処理するかを知りません。

これは、SurfaceViewから拡張されたクラスです。

public class GamePanel extends SurfaceView implements SurfaceHolder.Callback{ 
private MainThread thread; 
private Background bg; 
public static final int MOVESPEED = -5; 
public static final int WIDTH = 856; 
public static final int HEIGTH = 480; 
private Player player; 
Context mContext; 

public GamePanel(Context context){ 
    super(context); 
    getHolder().addCallback(this); 
    this.mContext = mContext; 
    thread = new MainThread(getHolder(), this); 
    setFocusable(true); //damit kann das ding Events handeln! WOW!! 
} 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    bg = new Background(BitmapFactory.decodeResource(getResources(), R.drawable.grassbg1)); 
    player = new Player((SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE),BitmapFactory.decodeResource(getResources(), R.drawable.helicopter), 65, 25, 3); 
    thread.setRunning(true); 
    thread.start(); 
} 
@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
} 
@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    boolean retry = true; 
    while(retry){ 
     try{thread.setRunning(false); 
      thread.join(); 
     }catch(InterruptedException e){e.printStackTrace();} 
     retry = false; 
    } 
} 
@Override 
public boolean onTouchEvent (MotionEvent event){ 
    if(event.getAction()==MotionEvent.ACTION_DOWN){ 
     if(!player.getPlaying()){ 
      player.setPlaying(true); 
     } 
     else{ 
      player.setUp(true); 
     } 
     return true; 
    } 
    if(event.getAction()==MotionEvent.ACTION_UP){ 
     player.setUp(false); 
     return true; 
    } 
    return super.onTouchEvent(event); 
} 
public void update(){ 
    if(player.getPlaying()) { 
     bg.update(); 
     player.update(); 
    } 
} 
@Override 
public void draw(Canvas canvas){ 
    final float scaleFactorX = getWidth()/(WIDTH*1.f); 
    final float scaleFactorY = getHeight()/(HEIGTH*1.f); 
    if(canvas != null){ 
     final int savedState = canvas.save(); 
     canvas.scale(scaleFactorX, scaleFactorY); 
     bg.draw(canvas); 
     player.draw(canvas); 
     canvas.restoreToCount(savedState); 
    } 
} 

これは、移動または単純な物理を行う「プレーヤー」クラスです。

public class Player extends GameObject implements SensorEventListener{ 
private Bitmap spritesheet; 
private int score; 
private float accX, accY; 
private double dya; 
private boolean up; 
private boolean playing; 
private Animation animation = new Animation(); 
private long startTime; 
private SensorManager sensorManager; 

public Player(SensorManager sensorManager, Bitmap res, int w, int h, int numFrames){ 
    x = 100; 
    y = GamePanel.HEIGTH/2; 
    dy = 0; 
    score = 0; 
    height = h; 
    width = w; 

    Bitmap[] image = new Bitmap[numFrames]; 
    spritesheet = res; 

    for(int i = 0; i < image.length; i++){ 
     image[i] = Bitmap.createBitmap(spritesheet, i*width, 0, width, height); 
    } 
    animation.setFrames(image); 
    animation.setDelay(10); 
    startTime = System.nanoTime(); 
} 
@Override 
public void onSensorChanged(SensorEvent sensorEvent) { 
    accX = (sensorEvent.values[1]); 
    accY = (sensorEvent.values[2]); 
} 
@Override 
public void onAccuracyChanged(Sensor sensor, int i){ 
    //not needed 
} 

public void setUp(boolean b){up = b;} 

public void update(){ 
    Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); 

    animation.update(); 
    if(up){ 
     dy = (int)(dya-=1.1); 
    } 
    else{ 
     dy = (int)(dya+=1.1); 
    } 
    if(dy>14)dy = 14; 
    if(dy<-14)dy = -14; // dies begrenzd die maximale geschwindigkeit 

    y += dy+(10*accY); 
    dy = 0; 
} 
public void draw(Canvas canvas){ 
    canvas.drawBitmap(animation.getImage(),x,y,null); 
} 
public int getScore(){return score;} 
public boolean getPlaying(){return playing;} 
public void setPlaying(boolean b){playing = b;} 
public void resetDYA(){dya = 0;} 
public void resetScore(){score = 0;} 
+0

を使うべきだと思うあなたの「GamePanelの」コンストラクタであなたの例外ログを投稿してくださいということです。 – pooyan

+0

致命的な例外:メイン プロセス:copmpany.youtube1、PID:copmpany.youtube1.GamePanel.surfaceCreatedで29223 java.lang.NullPointerExceptionが (GamePanel.java:30) – Phill

答えて

0

あなたの問題は、多分あなたはthis.mContext = mContext;を使用しますが、私はあなたがthis.mContext = context;

+0

それは、その作業のように見える、私は変更する必要がありますし、今いくつか試してみてください。 – Phill

+0

ようこそ。そうであれば答えとしてマークすることができます。 – pooyan

+0

OK、それをマークして、それは正常に動作します! – Phill

関連する問題