【发布时间】: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