我正在使用Accelerometer(Andengine)开发游戏。
示例代码:
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
它在HTC g1设备(320x480)中正常工作。但是当我试图在三星b7510(320x240)和galaxy平板电脑上运行时,我需要反向旋转acclometer。对于那个问题我做了
if(pAccelerometerData.getY()<-1)
// Move ball in upwards direction
else if (pAccelerometerData.getY()>1)
// Move ball in dowards direction
如何使用Accelerometer为所有设备制作相同的版本?
答案 0 :(得分:1)
这里的问题是默认情况下某些设备是纵向模式,有些设备默认为横向模式。加速度计的y轴在设备的自然状态下与设备的“向上”方向对齐,设备随设备而变化。在常规的默认纵向电话上,y轴与屏幕的最长边对齐:
+------+
| | ^
| | y|
| | |
| | |
| | +---->
| | x
+------+
但在平板电脑或默认为横向的宽手机上,y轴与屏幕的最短边对齐。
+--------------+
| | ^
| | y|
| | |
+--------------+ +------->
x
解决方法是检查android.view.Display.getRotation()。在处于默认方向的肖像设备上(即像第一个ASCII艺术图一样),这将返回ROTATION_0
。在横向设备上,当屏幕最长的部分朝上时,它将返回ROTATION_90
(或ROTATION_270
)。
同样,如果您强制您的游戏在AndroidManifest.xml中使用android:screenOrientation="landscape"
或在代码段中通过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的设备,则必须使用反射或类似技术。