我一直在尝试从我的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;
}
}
答案 0 :(得分:1)
mainActivity = new MainActivity();
您在此处创建MainActivity的新实例。 此实例没有您想要的方向信息。
这不是您从Android中的活动传递信息的方式。你可以做的是在MainActivity中创建一个Player对象,并在MainActivity中设置Player的方向。
Player player = new Player();
在MainActivity中的onSensorChanged(SensorEvent sensorEvent)
方法 -
player.setDirection(direction);
player.update();