2014-02-20 19 views
2

我正在使用使用SDL(Simple DirectMedia Layer)的android NDK和JNI系统的C++游戏。我完成了大部分的部件,但我无法想象如何实现倾斜控制(倾斜控制,如寺庙运行)。我已经搜索了很多没有任何相关信息。 请帮我,我卡住了。SDL for Android中的倾斜控制NDK JNI游戏

Raghuvendra库马尔

+0

http://stackoverflow.com/questions/how-to-ask – Dayan

+0

在NDK目录天然活性例子展示了如何获得陀螺仪值。 – eozgonul

回答

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

它已经包含在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); 
     } 
    } 

然后这些值然后可在C++代码通过调用函数Android_JNI_GetAccelerometerValues(浮点值[3])在读sdl_android.c,。

因此,例如,你的代码可能是这样的:

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

之后accelValues将包含可用于控制游戏的加速计值。

+0

这真的很有帮助。你能指出一些代码示例或像懒惰foo的教程。 –

+0

我不能给你一个代码示例,但你不明白什么?创建一个简单的循环就足够了,它可以每秒多次读取加速度计,并使用这些值来控制游戏。 –