我正在使用 android NDK 和使用 SDL(简单 DirectMedia 层)的 JNI 系统开发 C++ 游戏。我已经完成了大部分部件,但我无法弄清楚如何实现倾斜控制(如寺庙运行中的倾斜控制)。我在没有任何相关信息的情况下搜索了很多。请帮助我,我被卡住了。
拉古文德拉库马尔
我正在使用 android NDK 和使用 SDL(简单 DirectMedia 层)的 JNI 系统开发 C++ 游戏。我已经完成了大部分部件,但我无法弄清楚如何实现倾斜控制(如寺庙运行中的倾斜控制)。我在没有任何相关信息的情况下搜索了很多。请帮助我,我被卡住了。
拉古文德拉库马尔
我可以在 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));
}
}
它已经包含在 SDL2 的示例 android 项目中。在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);
}
}
然后可以通过调用 sdl_android.c 中的函数Android_JNI_GetAccelerometerValues (float values[3]) 在您的 C++ 代码中读取这些值。
例如,您的代码可能如下所示:
#include "../SDL/src/core/android/SDL_android.h"
float accelValues[3];
Android_JNI_GetAccelerometerValues(accelValues);
之后 accelValues 将包含可用于控制游戏的加速度计值。