SDL 中的倾斜控制,适用于 Android NDK JNI 游戏

Tilt Control in SDL for Android NDK JNI Games

本文关键字:Android NDK JNI 游戏 适用于 倾斜 控制 SDL      更新时间:2023-10-16

我正在使用android NDK和JNI系统使用SDL(Simple DirectMedia Layer)开发C++游戏。我已经完成了大部分部分,但我无法弄清楚如何实现倾斜控制(像寺庙运行中的倾斜控制)。我在没有任何相关信息的情况下用谷歌搜索了很多。请帮助我,我被困住了。

拉古文德拉·库马尔

它已经包含在 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 将包含可用于控制游戏的加速计值。

我能够在 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));
    }
}