Lagesensor Werte vertauscht

  • Antworten:11
Daniel
  • Forum-Beiträge: 60

20.04.2013, 22:50:32 via Website

Hey,

ich programmiere gerade mein erstes Spiel mit der AndEngine.
Bei diesem Spiel soll der Spieler ein Objekt mit dem Lagesensor über das Spielfeld bewegen können. Wenn ich das Spiel dann auf meinem Handy ausführe funktioniert auch schon alles so wie es soll:
1@Override
2 public void onSensorChanged(SensorEvent event) {
3 final Vector2 gravity = Vector2Pool.obtain(event.values[1], event.values[0]);
4 this.physicsWorld.setGravity(gravity);
5 Vector2Pool.recycle(gravity);
6}

Sobald ich das Spiel aber auf meinem Tablet starte, sind die Werte vertauscht. Das heisst, wenn ich das Tablet z.b. nach vorne kippe, bewegt sich das Spielobjekt nach links oder rechts und nicht nach vorne.
Das Problem dabei ist, dass es auf meinem Handy mit dem gleichen Code richtig funktioniert.

Damit es auf meinem Tablet funktioniert, muss der Code dann so aussehen:
1@Override
2 public void onSensorChanged(SensorEvent event) {
3 final Vector2 gravity = Vector2Pool.obtain(-event.values[0], event.values[1]);
4 this.physicsWorld.setGravity(gravity);
5 Vector2Pool.recycle(gravity);
6}

Wie könnte man dieses Problem lösen?

— geändert am 20.04.2013, 22:58:24

Antworten
Marcel H.
  • Forum-Beiträge: 8.845

22.04.2013, 00:10:23 via App

Am einfachsten wären zwei App Versionen.
Eine für Handys die andere für Tabs

Keep cool :D

Antworten
Daniel
  • Forum-Beiträge: 60

22.04.2013, 08:56:16 via App

Aber koennte das nicht auch von etwas anderem abhaengig sein? Ich weiss ja jetzt nicht ob das bei allen handys und tablets so ist.
Ich habe es auf einem galaxy s2 mit android 4.0.3 und auf einem galaxy note 10.1 mit android 4.1.2 getestet.

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

22.04.2013, 10:55:40 via Website

Das liegt sicher daran das ein Tablet eine andere Ausrichtung hat wie ein Phone. Logisch wäre das zumindest

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Daniel
  • Forum-Beiträge: 60

22.04.2013, 13:48:15 via Website

Ok, danke für die Hilfe.
Ich gehe jetzt einfach mal davon aus, dass das bei allen Phones und Tablets so ist. Ich denke es wird sicher eine Möglichkeit geben, wie die App herausfinden kann, ob sie auf einem Handy oder Tablet installiert ist und werde das mal suchen.

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.218

22.04.2013, 15:29:16 via App

Mac Systems
Das liegt sicher daran das ein Tablet eine andere Ausrichtung hat wie ein Phone. Logisch wäre das zumindest

Das denk ich allerdings auch. Tablets haben ja eher die landscape ausrichtigung.

Antworten
impjor
  • Forum-Beiträge: 1.793

22.04.2013, 16:11:38 via App

Ich denke gerade für ein Spiel ist es sinnvoll Landscape zu erzwingen, dann sollte dieses Problem auch nicht vorhanden sein.

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Daniel
  • Forum-Beiträge: 60

22.04.2013, 16:14:53 via Website

Nach einigem googlen habe ich jetzt die Lösung gefunden. Ich benutze jetzt eine Methode, die die Werte des Lagesensors so verändert, dass sie auf allen Geräten gleich sind. Mit diesem Code funktioniert es jetzt auf beiden Geräten, auch wenn ich die Methode nicht so ganz verstanden habe:

1@Override
2 public void onSensorChanged(SensorEvent event) {
3 float[] adjustedValues = adjustAccelOrientation(displayOrientation, event.values);
4 final Vector2 gravity = Vector2Pool.obtain(-adjustedValues[0], -adjustedValues[1]);
5 this.physicsWorld.setGravity(gravity);
6 Vector2Pool.recycle(gravity);
7 }
8
9 public static float[] adjustAccelOrientation(int displayRotation, float[] eventValues)
10 {
11 float[] adjustedValues = new float[2];
12
13 final int axisSwap[][] = {
14 { 1, -1, 0, 1 }, // ROTATION_0
15 {-1, -1, 1, 0 }, // ROTATION_90
16 {-1, 1, 0, 1 }, // ROTATION_180
17 { 1, 1, 1, 0 } }; // ROTATION_270
18
19 final int[] as = axisSwap[displayRotation];
20 adjustedValues[0] = (float)as[0] * eventValues[ as[2] ];
21 adjustedValues[1] = (float)as[1] * eventValues[ as[3] ];
22
23 return adjustedValues;
24 }

Antworten
Daniel
  • Forum-Beiträge: 60

22.04.2013, 16:16:23 via Website

impjor
Ich denke gerade für ein Spiel ist es sinnvoll Landscape zu erzwingen, dann sollte dieses Problem auch nicht vorhanden sein.

Gruß

Mein Spiel läuft auf beiden Geräten die ganze Zeit im landscape modus, daran lag es nicht.

Antworten