任何人都可以解释为什么我不能从这个类获得变量?

时间:2017-11-29 12:25:48

标签: java android class setter getter

我已经尝试了一段时间从MySurfaceView获取变量以在我的Player类中使用。我似乎无法使它工作......我尝试从我的MainActivity类获取触摸信息,但它不是我想要它的地方,也似乎无法使它工作。任何帮助表示赞赏!

MySurfaceView.java

package com.Frenchie.SurfaceView;

import ...

public class MySurfaceView extends SurfaceView implements Runnable {

    Bitmap bitmap;
    SurfaceHolder surfaceHolder;
    int LastTouchx;

    Player player;

    public MySurfaceView(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);

        player = new Player(context);

        surfaceHolder = getHolder();

        //Starts the run()
        Thread TestThread = new Thread(this);
        TestThread.start();
    }


    @Override
    public void run() {
        //TODO movement here when display is working
        while (true){
            Update();
            DrawPlayer();
        }
    }

    public void Update(){
        player.Update();
    }

    public void DrawPlayer(){

        Canvas canvas = surfaceHolder.lockCanvas();

        if (surfaceHolder.getSurface().isValid()) {

            canvas.drawColor(Color.BLUE);
            canvas.drawBitmap(player.getBitmap(), player.getX(), player.getY(), null);
            surfaceHolder.unlockCanvasAndPost(canvas);
        }
        else{

            Log.d("DrawPlayer", "Surface Not Valid");
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        LastTouchx = (int)event.getX();
        //LastTouchy= (int)event.getY();
        Log.d("Touch Value ",LastTouchx+"");
        return false;
    }

    public int getLastTouchx() {
        return LastTouchx;
    }

}

Player.java

package com.Frenchie.SurfaceView;

import ...

public class Player {
    //Bitmap to get character from image
    private Bitmap bitmap;

    //coordinates
    private int x;
    private int y;

    //motion speed of the character
    private int speed = 0;

    MySurfaceView mySurfaceView;

    //constructor
    public Player(Context context) {
        x = 75;
        y = 500;

        //Getting bitmap from drawable resource
        bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.player);
    }

    //Method to update coordinate of character
    public void Update(){

        //updating x coordinate

        if (x > mySurfaceView.getLastTouchx()){
            x++;
        }
        else if (x < mySurfaceView.getLastTouchx()){
            x--;
        }
        else{

            Log.d("Update","Else triggered");
        }

    }

    public Bitmap getBitmap() {
        return bitmap;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

讯息

E/AndroidRuntime: FATAL EXCEPTION: Thread-4
    Process: com.Frenchie.SurfaceView, PID: 26348
    java.lang.NullPointerException: Attempt to invoke virtual method 'int com.Frenchie.SurfaceView.MySurfaceView.getLastTouchx()' on a null object reference
        at com.Frenchie.SurfaceView.Player.Update(Player.java:36)
        at com.Frenchie.SurfaceView.MySurfaceView.Update(MySurfaceView.java:68)
        at com.Frenchie.SurfaceView.MySurfaceView.run(MySurfaceView.java:62)
        at java.lang.Thread.run(Thread.java:762)

这与建议的帖子不重复。

2 个答案:

答案 0 :(得分:1)

覆盖MySurfaceView中的另一个构造函数:

    public class MySurfaceView extends SurfaceView
    ...
    public MySurfaceView(Context context) {
        this(context, (AttributeSet)null)
    }

    public MySurfaceView(Context context, AttributeSet attributeSet) {
            super(context, attributeSet);
            player = new Player(context, this);
            bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.player);
            surfaceHolder = getHolder();
            //Starts the run()
            Thread TestThread = new Thread(this);
            TestThread.start();
        }
        ...

在构造函数的播放器中,您可以传递一个surfaceView:所以不需要初始化:

MySurfaceView mySurfaceView;

    //constructor
    public Player(Context context, MySurfaceView surfaceView) {
        this.mySurfaceView = surfaceView;
        x = 75;
        ...

答案 1 :(得分:0)

尝试:

lumOff