Управление наклоном в SDL для Android NDK JNI Games

Я работаю над игрой на C ++ с использованием Android NDK и системой JNI с использованием SDL (Simple DirectMedia Layer). Я закончил с большинством частей, но я не могу понять, как реализовать контроль наклона (контроль наклона, как в храме). Я много гуглил без какой-либо соответствующей информации.
Пожалуйста, помогите мне, я застрял.

Рагхувендра Кумар

2

Решение

Он уже включен в пример Android-проекта SDL2. В SDLActivity.java метод onSensorChanged регистрирует все движения наклона:

    public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
SDLActivity.onNativeAccel(event.values[0] / SensorManager.GRAVITY_EARTH,
event.values[1] / SensorManager.GRAVITY_EARTH,
event.values[2] / SensorManager.GRAVITY_EARTH);
}
}

Затем эти значения можно затем прочитать в коде C ++, вызвав функцию Android_JNI_GetAccelerometerValues ​​(значения с плавающей запятой [3]) в sdl_android.c.

Так, например, ваш код может выглядеть так:

   #include "../SDL/src/core/android/SDL_android.h"float accelValues[3];
Android_JNI_GetAccelerometerValues(accelValues);

после чего accelValues ​​будет содержать значения акселерометра, которые вы можете использовать для управления своей игрой.

1

Другие решения

Я могу использовать управление наклоном в SDL, хотя до сих пор не понимаю, как соотнести значения x, y, z с положением пикселя на экране. Но, по крайней мере, базовая операция может быть выполнена с использованием значений x, y, z. Благодаря aeror_ для правильных указателей. Это очень просто. Пример тестового кода:

#include "../SDL/src/core/android/SDL_android.h"
//Get Tilt values though SDL implementation
void InputHandler::HandleTitltEvt()
{

float accelValues[3];
Android_JNI_GetAccelerometerValues(accelValues);

stTileValues_.x = accelValues[0];
stTileValues_.y = accelValues[1];
stTileValues_.z = accelValues[2];

return ;

}

//Handle TiltValues to Move your player across the screen
void Player::HandleInput_()
{

InputHandler::Instance()->HandleTitltEvt();

Axis_t tiltValues = InputHandler::Instance()->getTiltValue();
if( (tiltValues.y > 0) && ((vPosition_.getY() + iHeight_) < (Game::Instance()->getGameHeight() - 15)))
{

vVelocity_.setY(iMoveSpeed + 5);if (tiltValues.x > 0)
{
vVelocity_.setX(iMoveSpeed+5);

}
else if (tiltValues.x < 0)
{
vVelocity_.setX(-(iMoveSpeed+5));

}

}
else if ((tiltValues.y < 0) && ((vPosition_.getY() + iHeight_) > 0))
{
vVelocity_.setY(-(iMoveSpeed+5));if (tiltValues.x > 0)
{
vVelocity_.setX(iMoveSpeed+5);

}
else if (tiltValues.x < 0)
{
vVelocity_.setX(-(iMoveSpeed+5));

}

}
else if (tiltValues.x > 0)
{
vVelocity_.setX(iMoveSpeed+5);

}
else if (tiltValues.x < 0)
{
vVelocity_.setX(-(iMoveSpeed+5));

}

}
1

По вопросам рекламы [email protected]