gpt4 book ai didi

java - 似乎无法将 int 值从 Main 返回到 Player Class

转载 作者:行者123 更新时间:2023-11-30 00:13:10 26 4
gpt4 key购买 nike

我一直在尝试从我的 MainActivity 向我的播放器类返回一个 int 值,以确定他应该移动的方向以及应该使用我的 sprite 表中的哪组图像。我似乎只在我的 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;
}
}

最佳答案

mainActivity = new MainActivity();

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

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

Player player = new Player();

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

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

关于java - 似乎无法将 int 值从 Main 返回到 Player Class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47814411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com