2

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

拉古文德拉库马尔

4

2 回答 2

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));

    }

}
于 2014-02-25T10:02:05.670 回答
1

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

于 2014-02-21T14:26:21.473 回答