Я работаю над игрой на C ++ с использованием Android NDK и системой JNI с использованием SDL (Simple DirectMedia Layer). Я закончил с большинством частей, но я не могу понять, как реализовать контроль наклона (контроль наклона, как в храме). Я много гуглил без какой-либо соответствующей информации.
Пожалуйста, помогите мне, я застрял.
Рагхувендра Кумар
Он уже включен в пример 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 будет содержать значения акселерометра, которые вы можете использовать для управления своей игрой.
Я могу использовать управление наклоном в 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));
}
}