似乎无法从Main返回到Player类的int值

时间:2017-12-14 13:21:35

标签: java android class variables return

我一直在尝试从我的MainActivity返回一个int值到我的播放器类,以确定他应该移动哪个方向以及应该使用我的sprite表中的哪一组图像。我似乎只在我的Player类中收到0。我知道我的accelorometer代码正在运行,因为我已经单独测试了这个,但是int没有从MainActivity传递给Player。所有帮助表示赞赏!谢谢。

MainActivity.java

package com.Frenchie.AnimatedSprite;

import ...

public class MainActivity extends Activity implements SensorEventListener {

    //Accelerometer
    private SensorManager senSensorManager;
    private Sensor senAccelerometer;

    private volatile int direction;

    private static int DIRECTION_STATIONARY = 0;
    private static int DIRECTION_DOWN = 1;
    private static int DIRECTION_LEFT = 2;
    private static int DIRECTION_RIGHT = 3;
    private static int DIRECTION_UP = 4;

    Player player;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        GameView gameView = new GameView(this);
        setContentView(gameView);

        //Accelerometer
        senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        senSensorManager.registerListener(this, senAccelerometer , SensorManager.SENSOR_DELAY_FASTEST);
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        Sensor mySensor = sensorEvent.sensor;

        if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            if (sensorEvent.values[0] < -1){
                direction = DIRECTION_UP;
            }
            else if (sensorEvent.values[0] > 1){
                direction = DIRECTION_DOWN;
            }
            else if (sensorEvent.values[1] < -1){
                direction = DIRECTION_LEFT;
            }
            else if (sensorEvent.values[1] > 1){
                direction = DIRECTION_RIGHT;
            }
            else{
                direction = DIRECTION_STATIONARY;
            }
            //Log.d("Player Update", "X:" +sensorEvent.values[0]+ " Y:" +sensorEvent.values[1]+ " Z:" +sensorEvent.values[2] + " Direction: " + direction);
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {

    }

    public int getDirection() {
        return direction;
    }
}

GameView.java

package com.Frenchie.AnimatedSprite;

import...

public class GameView extends SurfaceView implements Runnable {

    private Canvas canvas;
    private SurfaceHolder surfaceHolder;
    private Thread thread;

    Player player;


    public GameView(Context context) {
        super(context);

        player = new Player(context, this);

        surfaceHolder = getHolder();

        thread = new Thread(this);
        thread.start();
    }

    @Override
    public void run() {
        while (true) {
            Update();
            DrawCanvas();
        }
    }

    private void Update() {
        player.Update();
        player.UpdateAnim();
        Control();
    }

    private void DrawCanvas() {

        canvas = surfaceHolder.lockCanvas();
        if (surfaceHolder.getSurface().isValid()) {
            canvas.drawColor(Color.MAGENTA);
            canvas.drawBitmap(player.getSprite(), player.getSrc(), player.getDst(), null);
            surfaceHolder.unlockCanvasAndPost(canvas);
        } else {
            Log.d("Run", "Surface Invalid");
        }
    }

    private void Control() {
        try {
            thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Player.java

package com.Frenchie.AnimatedSprite;

import ...

public class Player {

    private Bitmap sprite;
    private int x, y, speed;

    //Animation Variables
    private static final int SPRITE_ROWS = 4;
    private static final int SPRITE_COLUMNS = 4;
    private int currentFrame, width, height, srcY, srcX, direction;
    Rect src, dst;

    //Static Directions
    private static int DIRECTION_STATIONARY = 0;
    private static int DIRECTION_DOWN = 1;
    private static int DIRECTION_LEFT = 2;
    private static int DIRECTION_RIGHT = 3;
    private static int DIRECTION_UP = 4;

    GameView gameView;
    MainActivity mainActivity;

    public Player (Context context, GameView gameView){
        this.gameView = gameView;

        mainActivity = new MainActivity();

        x = 100;
        y = 500;

        speed = 30;

        sprite = BitmapFactory.decodeResource(context.getResources(), R.drawable.player);

        width = sprite.getWidth() / SPRITE_COLUMNS;
        height = sprite.getHeight() / SPRITE_ROWS;
    }

    public void Update() {

        Log.d("Player | Update", "" + direction);
        if (mainActivity.getDirection() == DIRECTION_UP){
            y -= speed;
            direction = DIRECTION_UP;
        }

        else if (mainActivity.getDirection() == DIRECTION_DOWN){
            y += speed;
            direction = DIRECTION_DOWN;
        }
        else if (mainActivity.getDirection() == DIRECTION_RIGHT){
            x += speed;
            direction = DIRECTION_RIGHT;
        }
        else if (mainActivity.getDirection() == DIRECTION_LEFT){
            x -= speed;
            direction = DIRECTION_LEFT;
        }
    }

    public void UpdateAnim(){

        currentFrame = ++currentFrame % SPRITE_COLUMNS;
        srcX = currentFrame * width;

        if (mainActivity.getDirection() == DIRECTION_RIGHT){
            srcY = 2 * height;
        }
        else if (mainActivity.getDirection() == DIRECTION_LEFT){
            srcY = 1 * height;
        }
        if (mainActivity.getDirection() == DIRECTION_DOWN){

            srcY = 0 * height;
        }
        else if (mainActivity.getDirection() == DIRECTION_UP){
            srcY = 3 * height;
        }

        src = new Rect(srcX, srcY, srcX + width, srcY + height);
        dst = new Rect(x, y, x + width, y + height);
    }

    public Rect getSrc(){
        return src;
    }

    public Rect getDst(){
        return dst;
    }

    public Bitmap getSprite() {
        return sprite;
    }
}

1 个答案:

答案 0 :(得分:1)

  

mainActivity = new MainActivity();

您在此处创建MainActivity的新实例。 此实例没有您想要的方向信息。

这不是您从Android中的活动传递信息的方式。你可以做的是在MainActivity中创建一个Player对象,并在MainActivity中设置Player的方向。

Player player = new Player();

在MainActivity中的onSensorChanged(SensorEvent sensorEvent)方法 -

player.setDirection(direction);
player.update();