Следующие полшага к созданию аркады.
Прикрутим к нашему SimpleBaseGameActivity вот такую штуку:+
public class HelloWorldActivity extends SimpleBaseGameActivity implements SensorEventListener{
Однако, как только мы этот Implement приписали - сразу возникает ошибка в этой же строчке:Multiple markers at this lineНам надо описать эти 2 метода. И вот как мы это сделаем:
- The type HelloWorldActivity must implement the inherited abstract method
SensorEventListener.onSensorChanged(SensorEvent)
- The type HelloWorldActivity must implement the inherited abstract method
SensorEventListener.onAccuracyChanged(Sensor, int)
private int accellerometerSpeedX;
private int accellerometerSpeedY;
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//
}
public void onSensorChanged(SensorEvent event) {
synchronized (this) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
accellerometerSpeedX = (int) event.values[1];
accellerometerSpeedY = (int) event.values[0];
break;
}}}
Ну а в OnCreateScene запихиваем вот такую конструкцию:mSensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
Конечно, в начало кода надо пихнуть переменную:private SensorManager mSensorManager;После этих манипуляций у нас есть ежекадровые данные с акселерометра.
Надо бы их куда-нибудь применить. Припишем функцию апдэйта позиции нашего спрайта:
private void updateSpritePosition(float pSecondsElapsed) {
//Log.d("Sapfil_Log", "upd");
if ((accellerometerSpeedX != 0) || (accellerometerSpeedY != 0)) {
// Set the Boundary limits
int tL = 0;
int lL = 0;
int rL = CAMERA_WIDTH - (int) mSprite.getWidth();
int bL = CAMERA_HEIGHT - (int) mSprite.getHeight();
//float dt = pSecondsElapsed * 20;
// вычисление новых координат и проверка касания с краем экрана
sX -= (accellerometerSpeedY * (pSecondsElapsed * speed));
sY += (accellerometerSpeedX * (pSecondsElapsed * speed));
if (sX < lL)
sX = lL;
if (sX > rL)
sX = rL;
if (sY < tL)
sY = tL;
if (sY > bL)
sY = bL;
mSprite.setPosition(sX, sY);
};
}
Функция есть. Теперь ее надо как-то где-то вызывать, конечно ежекадрово.scene.registerUpdateHandler(new IUpdateHandler() {
public void onUpdate(float pSecondsElapsed) {
updateSpritePosition(pSecondsElapsed);
}
public void reset() {
// TODO Auto-generated method stub
}
Вот собственно и все. Полный код давайте запихнем на Everfall.http://www.everfall.com/paste/id.php?0mf6g2njgree
если еще просматриваешь этот блог, то есть один маленький вопрос. А как задать некий "угол" для акселерометра? я имею ввиду, играть если телефон нужно держать параллельно земле не очень удобно, если например сидишь где то в автобусе , метро или просто за столом. Если можно задавать базовый угол, то будет намного удобнее, сточки зрения юзабилити )))
ОтветитьУдалитьP.S : я только начинаю знакомиться с Android и AndEnginer, поэтому возможно вопрос не совсем корректный, а может даже глуповат )))