2011-12-23 1 views
1

Я развиваю игру с помощью Accelerometer (Andengine).Как сделать такую ​​же сборку для всех устройств Android с помощью акселерометра

Пример кода:

this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 
    final Engine engine = new Engine(new EngineOptions(true,ScreenOrientation.LANDSCAPE, new FillResolutionPolicy(), this.mCamera).setNeedsSound(true)); 

if(pAccelerometerData.getX()<-1) 
// Move ball in upwards direction 

else if (pAccelerometerData.getX()>1) 
// Move ball in dowards direction 

Его прекрасно работать в HTC g1 устройства (320x480). Но когда я пытаюсь запустить в samsung b7510 (320x240) и таблетке галактики, мне нужно вращать актометр в обратном направлении. Для этой проблемы я сделал

if(pAccelerometerData.getY()<-1) 
// Move ball in upwards direction 

else if (pAccelerometerData.getY()>1) 
// Move ball in dowards direction 

Как сделать такую ​​же сборку для всех устройств с помощью акселерометра?

ответ

1

Проблема заключается в том, что некоторые устройства являются портретным режимом по умолчанию, а некоторые - по умолчанию. Ось y акселерометра выровнена в направлении «вверх» устройства в его естественном состоянии, которое изменяется от устройства к устройству. На регулярной портрета-по-умолчанию телефон, ось у выравнивается по длинной стороне экрана:

+------+ 
|  | ^
|  | y| 
|  | | 
|  | | 
|  | +----> 
|  |  x 
+------+ 

Но на таблетки, или широкий телефон, который является пейзаж по умолчанию, ось у совмещен на самую короткую сторону экрана.

+--------------+ 
|    | ^
|    | y| 
|    | | 
+--------------+ +-------> 
          x 

Решение должно проверить android.view.Display.getRotation(). На портретном устройстве, которое находится в ориентации по умолчанию (то есть, как и в первой диаграмме ASCII), это вернет ROTATION_0. На ландшафтном устройстве, повернутом так, что с самой длинной частью экрана, направленной вверх, он вернется ROTATION_90 (или ROTATION_270).

Точно так же, если вы заставляете свою игру, чтобы быть в ландшафтном режиме с android:screenOrientation="landscape" в AndroidManifest.xml или через ScreenOrientation.LANDSCAPE как в вашем фрагменте кода, то портрет телефон вернется ROTATION_90 и пейзаж устройство ROTATION_0.

В случае вынужденных ландшафтных игр вам нужно будет что-то вроде этого:

WindowManager wm = (WindowManager) context.getSystemService(
            Context.WINDOW_SERVICE); 
boolean portrait = wm.getDefaultDisplay().getRotation() == Surface.ROTATION_90; 
// ... 
float dy; 
if (portrait) { 
    dy = pAccelerometerData.getX(); 
} else { 
    dy = pAccelerometerData.getY(); 
} 
if (dy < -1) { 
    // move ball up 
} else if (dy > 1) { 
    // move ball down 
} 

Это только для Android 2.2 и более поздних версий. Раньше устройства были все портреты, а метод getRotation() не существует, поэтому вам нужно будет использовать отражение или подобные методы, если вы хотите поддерживать устройства, у которых нет Froyo.

+0

Я использовал DisplayMetrics displayMetrics = new DisplayMetrics(); this.getWindowManager(). GetDefaultDisplay(). GetMetrics (displayMetrics); Дисплей display = getWindowManager(). GetDefaultDisplay(); int portrait = display.getRotation(); if (портрет == Surface.ROTATION_90 || портрет == Surface.ROTATION_270) {// landscape} else {-portrait-} – JohnRaja

 Смежные вопросы

  • Нет связанных вопросов^_^