こんにちは、私は日食が初めてで (プログラミングを始めて数か月しか経っていないので、把握が不安定です)、プレイヤーのアバターが加速度計で動かされ、画面上のものをかわす必要があるゲームを作成しようとしています (からトップダウンの視点)。アバター、背景、および敵を描画するための gameScreen クラスを既に作成しています。また、加速度計のクラスを作成して、gameScreen にアバターを移動する場所を伝えようとしています。現在、AndroidGame フレームワークを拡張する加速度計のコードを含むクラスがありますが、これはアクティビティではなく、onCreate がないため、加速度計の設定方法がわかりません。これを行う方法はありますか、それとも私はこれについてすべて間違っていますか?
これは私がこれまでに持っているものです(明らかに不完全です)。
import edu.austincc.testlearnand.SplashLoadingScreen;
import edu.austincc.framework.Screen;
import edu.austincc.testlearnand.Assets;
import edu.austincc.framework.implementation.AndroidGame;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
public class BuffaloStampede extends AndroidGame implements SensorEventListener {
TextView textView;
SensorManager manager;
double[] gravity = new double[3];
public double[] linear_acceleration = new double[3];
boolean firstTimeCreate = true;
@Override
public Screen getInitScreen() {
if (firstTimeCreate) {
Assets.loadBS(this);
firstTimeCreate = false;
}
return new SplashLoadingScreen(this);
}
@Override
public void onBackPressed() {
getCurrentScreen().backButton();
}
@Override
public void onResume() {
super.onResume();
Assets.theme.play();
}
@Override
public void onPause() {
super.onPause();
Assets.theme.pause();
manager.unregisterListener(this);
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView = new TextView(this);
manager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
if (manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() == 0) {
textView.setText("No accelerometer installed");
} else {
Sensor accelerometer = manager.getSensorList(
Sensor.TYPE_ACCELEROMETER).get(0);
if (!manager.registerListener(this, accelerometer,
SensorManager.SENSOR_DELAY_NORMAL)) {
textView.setText("Couldn't register accelerometer listener");
}
}
setContentView(textView);
}
@Override
public void onSensorChanged(SensorEvent event) {
// alpha is calculated as t / (t + dT)
// with t, the low-pass filter's time-constant
// and dT, the event delivery rate
final double alpha = 0.8;
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}
public double[] getGravity() {
return gravity;
}
public double[] getLinear_acceleration() {
return linear_acceleration;
}
public void setGravity(double[] gravity) {
this.gravity = gravity;
}
public void setLinear_acceleration(double[] linear_acceleration) {
this.linear_acceleration = linear_acceleration;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// nothing to do here
}
}