Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 谁能解释一下为什么我不能从这个类中得到一个变量?_Java_Android_Class_Setter_Getter - Fatal编程技术网

Java 谁能解释一下为什么我不能从这个类中得到一个变量?

Java 谁能解释一下为什么我不能从这个类中得到一个变量?,java,android,class,setter,getter,Java,Android,Class,Setter,Getter,一段时间以来,我一直在尝试从MySurfaceView获取一个变量,以便在我的Player类中使用。我似乎不能让它工作。。。我试着从我的MainActivity课程中获取触摸信息,但它并不是我真正想要的,而且似乎也无法让它工作。感谢您的帮助 MySurfaceView.java package com.Frenchie.SurfaceView; import ... public class MySurfaceView extends SurfaceView implements Runna

一段时间以来,我一直在尝试从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;
    }

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

}
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;
    }
}
这不是建议的帖子的副本。

试试:

 MySurfaceView mySurfaceView = new MySurfaceView();

覆盖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();
        }
        ...
在您的player In构造函数中,您可以传递一个surfaceView:因此无需初始化:

MySurfaceView mySurfaceView;

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

当我用这个替换player类中的原始调用时,我得到以下错误:错误:(19,35)错误:类MySurfaceView中的构造函数MySurfaceView不能应用于给定类型;必需:上下文,找到属性集:无参数原因:实际参数列表和形式参数列表的长度不同尝试在
MySurfaceView.java
中定义空构造函数无论何时重写视图,都应该重写构造函数。在你的播放器中,你没有初始化mysurfaceview。你介意详细描述一下维克多吗?我不太明白。当我向MySurfaceView添加一个空构造函数时,我还收到了以下消息:“在‘android.view.SurfaceView’中没有可用的默认构造函数”非常感谢!你能解释一下这是怎么回事吗?标记为正确答案。@Frenchie视图本身是重写父级构造函数所必需的。如果您用xml声明了自定义视图,那么OS将调用其中一个具有两个或更多参数的构造函数。通过编程,您可以使用简单构造函数视图(上下文)创建一个视图,并使用setter设置属性。@Frenchie您的播放器类取决于您的表面视图,因此应该在播放器类中创建表面视图,或者使用构造函数注入表面视图,就像我上面所做的那样。也许最好的方法就是改变顺序,把你的逻辑告诉玩家,让SurfaceView变得简单