【问题标题】:Can't seem to return int value from Main to Player Class似乎无法将 int 值从 Main 返回到 Player Class
【发布时间】:2018-05-28 14:31:44
【问题描述】:

我一直在尝试从我的 MainActivity 返回一个 int 值到我的玩家类,以确定他应该移动的方向以及应该使用我的精灵表中的哪组图像。我似乎只在我的 Player 课程中收到 0。我知道我的加速度计代码正在工作,因为我已经单独对此进行了测试,但是 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;
    }
}

【问题讨论】:

  • 您能否将代码缩短为minimal reproducible example,并指出您设置int 值的位置以及您尝试传递和接收它的位置?
  • 在不知道sensorEvent.values[0]sensorEvent.values[1] 中的值是什么的情况下很难分辨。你能告诉我们onSensorChanged(SensorEvent sensorEvent) 接收的参数是什么吗?
  • @Pieter sensorEvent.values[0-2] 由加速度计生成,它们工作正常,[0] 是 x,[1] 是 y,[2] 是 z。

标签: java android class variables return


【解决方案1】:

mainActivity = new MainActivity();

在这里,您正在创建 MainActivity 的新实例。 此实例没有您想要的方向信息。

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

Player player = new Player();

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

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

【讨论】:

  • 这就是我要找的东西,谢谢!唯一的问题是我不能像你所说的那样添加播放器类,就好像我在 onCreate 中添加它一样我得到错误,因为它不包含 gameView 和上下文但是我似乎无法将 Context 添加到 onCreate 方法?你知道如何将播放器类添加到主要活动中吗?
  • 我不确定您所说的“似乎无法将上下文添加到 onCreate 方法”是什么意思。您可以使用 getApplicationContext 在 Activity 中的任何函数中获取上下文。将此行添加到您的 onCreate 方法 - player = new Player(getApplicationContext(), gameView);
猜你喜欢
  • 1970-01-01
  • 2015-10-03
  • 2017-04-25
  • 2023-01-10
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多