Создание приложений с разворотом на 4 стороны в AndEngine
Мне нужно было написать четыре игрушки, которые бы работали при переворачивании экрана на четыре стороны. Для создания игрушек была использована библиотека AndEngine. По сравнения с cocos2d-android в ней почти нет глюков, лучше отлажена, в некоторых местах удобней в использовании - например система координат совпадает с системой Android, а в кокосе она перевернута по оси Y. Есть небольшие функциональные недостатки, но библиотека постоянно развивается. Наверное основное преимущество - библиотека быстро работает, особенно по сравнению с cocos2d. Итак о решении вопроса. Для основной Activity добавляем реализацию implements SensorEventListener. Затем по окончании всяких инициализаций регистрируем сенсоры при помощи метода: private void initSensors() { sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensorList = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION); sensorManager.registerListener(this, sensorList.get(0), SensorManager.SENSOR_DELAY_NORMAL); Log.w(tag + "initSensors", "Init sensor."); } Пишем следующий имплементиремый метод onSensorChanged: public void onSensorChanged(SensorEvent event) { if (System.currentTimeMillis() - time_update_sensors < 1000) { return; } time_update_sensors = System.currentTimeMillis(); float X = event.values[1]; float Y = event.values[2]; oldOrientation = orientation; if (Math.abs(X) > Math.abs(Y)) { if (X > ORIENTATION_CRITERIA) { orientation = 2; } if (X < -ORIENTATION_CRITERIA) { orientation = 0; } } else { if (Y > ORIENTATION_CRITERIA) { orientation = 1; } if (Y < -ORIENTATION_CRITERIA) { orientation = 3; } } Log.i("onSensorChanged", "Orientation = " + orientation + " " + event.values[0] + " " + event.values[1] + " " + event.values[2]); if (oldOrientation != orientation) { switch (orientation) { case 0: { Log.i(tag + "onSensorChanged", "Orientation = " + orientation + ", launching Guitar"); sensorManager.unregisterListener(this); Intent intent = new Intent(this, Guitar.class); startActivity(intent); finish(); break; } case 1: { Log.i(tag + "onSensorChanged", "Orientation = " + orientation + ", launching SingView"); sensorManager.unregisterListener(this); Intent intent = new Intent(this, SingView.class); startActivity(intent); finish(); break; } case 2: { Log.i(tag + "onSensorChanged", "Orientation = " + orientation + ", launching Drums"); sensorManager.unregisterListener(this); Intent intent = new Intent(this, Drums.class); startActivity(intent); finish(); break; } case 3: { Log.i(tag + "onSensorChanged", "Orientation = " + orientation + ", continue Piano"); break; } } } } ORIENTATION_CRITERIA я ставил равным 30 градусам. Для приложений которые работаю в позициях 2 и 3 (вверх ногами по отношению к традиционным PORTRAIT и LANDSCAPE) при создании камеры запустить метод mCamera.flip() для разворота.
| |
| |
Views: 1846 | |