2

私の 2D ゲームでは、ゲーム エンティティ コントロール (飛行機) を担当する次のコードがあります。電話に関してはすべて正常に動作しているようですが、残念ながら、Android タブレットではステアリングが完全に信頼できない (軸がめちゃくちゃになっている、またはまったく機能しない) という情報を入手しました。残念ながら私は自分のタブレットを持っていないので、詳しく調べることはできません。では、次のコードの何が問題なのですか? (わかりやすくするために、センサーに関連するコードのみを配置します)

// ...
private float[] accelerometerValues;
private float[] magneticFieldValues;
private float[] R;
private float[] I;
private float[] outR;
private float[] sensorValues;

private Sensor accelerometer;
private Sensor magneticField;
// ...

// ... sensor initialization
    sensorManager = (SensorManager)activity.getSystemService(Context.SENSOR_SERVICE);
    if(sensorManager == null)
        return;
    accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    magneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
// ...

// ... onPause() sensor is being unregistered
public void onResume() {
    if(!sensorManager.registerListener(sensorListener, accelerometer, SensorManager.SENSOR_DELAY_GAME) ||
       !sensorManager.registerListener(sensorListener, magneticField, SensorManager.SENSOR_DELAY_GAME))
// ...

    // ...
    sensorListener = new SensorEventListener() {
        public void onAccuracyChanged(Sensor arg0, int arg1) {              
        }
        public void onSensorChanged(android.hardware.SensorEvent event) {
            synchronized(InputMgr.this) {
                switch(event.sensor.getType()) {
                case Sensor.TYPE_ACCELEROMETER:
                    System.arraycopy(event.values, 0, accelerometerValues, 0, 3);
                    break;
                case Sensor.TYPE_MAGNETIC_FIELD:
                    System.arraycopy(event.values, 0, magneticFieldValues, 0, 3);
                    break;
                }
            }
        }
    };  
    // ...  

    // used somewhere in the game
public void getSensorValues(float values[]) {
    synchronized(InputMgr.this) {
        SensorManager.getRotationMatrix(R, I, accelerometerValues, magneticFieldValues);
        SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_Y, SensorManager.AXIS_X, outR);
        SensorManager.getOrientation(outR, sensorValues);
        System.arraycopy(sensorValues, 0, values, 0, sensorValues.length);
    }
}
4

2 に答える 2

3

これはあなたを元気づけることはありませんが、私は同様の問題を抱えています. TYPE_MAGNETIC_FIELD センサーを確認できます。それにイベント リスナーを追加できますが、そこからデータを取得することはできません。他のセンサーは正常に動作します。これはGalaxy Tab 7にあります。

onSensorChanged(SensorEvent イベント) はケース Sensor.TYPE_MAGNETIC_FIELD を起動しません:

そのため、磁場センサーからデータを取得できません。

あなたがそれを解決したら、私たちに知らせてください=)

于 2012-10-31T05:17:14.863 に答える
2

デフォルトの向きが横向き(->ほとんどのタブレット)のデバイスでは、センサー値は「間違った」ものです(理由はわかりません)。したがって、これらのデバイスをキャッチして、回転行列を再マップする必要があります。

マトリックスを再マップする必要があるかどうかを確認するには、次のコードを使用できます。

public boolean needToRemapOrientationMatrix;

// compute once (e.g. in onCreate() of your Activity):
Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int orientation;
if(display.getWidth() < display.getHeight()) orientation = Configuration.ORIENTATION_PORTRAIT;
else if(display.getWidth() > display.getHeight()) orientation = Configuration.ORIENTATION_LANDSCAPE;
else orientation = Configuration.ORIENTATION_SQUARE;
int rotation = display.getRotation();
needToRemapOrientationMatrix =
    (orientation==Configuration.ORIENTATION_LANDSCAPE && (rotation==Surface.ROTATION_0 || rotation==Surface.ROTATION_180)) ||
    (orientation==Configuration.ORIENTATION_PORTRAIT && (rotation==Surface.ROTATION_90 || rotation==Surface.ROTATION_270));

また、センサー値を読み取るときに、必要に応じてマトリックスを再マップします。

public void getSensorValues(float values[]) {
    synchronized(InputMgr.this) {
        SensorManager.getRotationMatrix(R, I, accelerometerValues, magneticFieldValues);

        if(needToRemapOrientationMatrix)
            SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_MINUS_Y, SensorManager.AXIS_X, R);

        SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_Y, SensorManager.AXIS_X, outR);
        SensorManager.getOrientation(outR, sensorValues);
        System.arraycopy(sensorValues, 0, values, 0, sensorValues.length);
    }
}

これは私のために働いた、私はそれが役立つことを願っています。

于 2012-07-02T15:10:43.373 に答える