タッチイベントと加速度計を組み合わせて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;}
を使うべきだと思うあなたの「GamePanelの」コンストラクタであなたの例外ログを投稿してくださいということです。 – pooyan
致命的な例外:メイン プロセス:copmpany.youtube1、PID:copmpany.youtube1.GamePanel.surfaceCreatedで29223 java.lang.NullPointerExceptionが (GamePanel.java:30) – Phill