2014-02-20 21 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

我不能給你一個代碼示例,但你不明白什麼?創建一個簡單的循環就足夠了,它可以每秒多次讀取加速度計,並使用這些值來控制遊戲。 –