menu

Создание приложений с разворотом на 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() для разворота.
Category: Мои заметки | Added by: tsvetkov (18.08.2010)
Views: 1846 | Rating: 0.0/0