2011-12-23 3 views
1

私は加速度計(Andengine)を使ってゲームを開発しています。加速度計を使ってすべてのアンドロイドデバイスを同じビルドにする方法

サンプルコード:HTC G1はデバイス内

this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 
    final Engine engine = new Engine(new EngineOptions(true,ScreenOrientation.LANDSCAPE, new FillResolutionPolicy(), this.mCamera).setNeedsSound(true)); 

if(pAccelerometerData.getX()<-1) 
// Move ball in upwards direction 

else if (pAccelerometerData.getX()>1) 
// Move ball in dowards direction 

その作業罰金(320×480)。しかし、私はsamsung b7510(320x240)と銀河タブレットで実行しようとすると、私は逆方向にacclometerを回転する必要があります。その問題については、

if(pAccelerometerData.getY()<-1) 
// Move ball in upwards direction 

else if (pAccelerometerData.getY()>1) 
// Move ball in dowards direction 

アクセラレータを使ってすべてのデバイスを同じビルドにする方法は?

答えて

1

ここでの問題は、一部のデバイスがデフォルトでポートレートモードであり、一部のデバイスがデフォルトでは横長であることです。加速度計のy軸は、デバイスからデバイスに変化する自然状態のデバイスの「上」方向に揃えられています。 、y軸は、整列さ

+------+ 
|  | ^
|  | y| 
|  | | 
|  | | 
|  | +----> 
|  |  x 
+------+ 

しかし、錠剤、またはデフォルトで景色が広い電話で:正規肖像バイデフォルト電話で、Y軸は画面の最も長い側に揃えられ画面の最短側に移動します。

+--------------+ 
|    | ^
|    | y| 
|    | | 
+--------------+ +-------> 
          x 

解決策は、android.view.Display.getRotation()をチェックすることです。デフォルトの向きの肖像画のデバイス(つまり、最初のASCIIアートダイアグラムのような)では、これはROTATION_0を返します。ランドスケープデバイスが回転しているので、画面の最長部分が上を向いているので、ROTATION_90(またはROTATION_270)を返します。

あなたのスニペットのようにAndroidManifest.xmlを中またはScreenOrientation.LANDSCAPE経由android:screenOrientation="landscape"でランドスケープモードにするためにあなたのゲームを強制する場合は同様に、その後、肖像電話がROTATION_90や風景デバイスROTATION_0を返します。

WindowManager wm = (WindowManager) context.getSystemService(
            Context.WINDOW_SERVICE); 
boolean portrait = wm.getDefaultDisplay().getRotation() == Surface.ROTATION_90; 
// ... 
float dy; 
if (portrait) { 
    dy = pAccelerometerData.getX(); 
} else { 
    dy = pAccelerometerData.getY(); 
} 
if (dy < -1) { 
    // move ball up 
} else if (dy > 1) { 
    // move ball down 
} 

これが唯一のAndroid 2.2以降である:あなたはこのような何かを必要とする強制風景ゲームの場合には

。以前のデバイスはすべてポートレートで、getRotation()メソッドは存在しないため、Froyoを持たないデバイスをサポートしたい場合は、リフレクションまたは類似のテクニックを使用する必要があります。

+0

私はDisplayMetricsを使用しましたdisplayMetrics = new DisplayMetrics(); this.getWindowManager()。getDefaultDisplay()。getMetrics(displayMetrics); ディスプレイを表示する= getWindowManager()。getDefaultDisplay(); int portrait = display.getRotation(); if(portrait == Surface.ROTATION_90 || portrait == Surface.ROTATION_270){// landscape} else {-portrait-} – JohnRaja

関連する問題