Android Accelerometer球类游戏计算屏幕偏移量

时间:2019-01-23 18:28:51

标签: java android game-physics

我的问题更多是逻辑/数学问题,而不是技术性问题。我希望这对于StackOverflow社区是可以的。我有一个使用加速度传感器的简单Android球类游戏,该传感器在SurfaceView中绘制球。它几乎可以正常工作。有时候除了球的行为。

我设法设置了一种逻辑,使球始终在屏幕边界内。 每当手机向一侧倾斜时,球都会移动并最终撞击屏幕边缘,并一直停留在屏幕边缘。一切正常,直到此处。

但是,当我决定退回球并将手机向相反方向倾斜时,在球开始向后移动之前会有很大的延迟。在边缘,即使手机朝相反的方向倾斜,我也希望球也立即朝相反的方向移动。

这是因为即使在初始倾斜过程中将球拖到屏幕边缘时,由于加速度计不断发出的值也会使球的实际位置(xPos或yPos)继续变化,因此差异越来越大。

最终,当我将手机翻转回相反的位置时,我必须等待那些加速度计的位置值返回到屏幕边缘,然后球才开始朝相反的方向移动。

这会导致巨大的延迟。例如,如果手机在X轴上向右倾斜10秒钟,那么当我在X轴的相反方向(向左)倾斜手机时,在球开始向后移动之前还有10秒的延迟。

这是到目前为止我拥有的更新球位置逻辑:

public void onSensorChanged(SensorEvent sensorEvent){
    if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) {
        yAcc = sensorEvent.values[1];
        xAcc = sensorEvent.values[2];

        float frameTime = 0.666f;
        xVel += (xAcc * frameTime); // V[fin] = V[ini] + a*t
        yVel += (yAcc * frameTime);
        //travelled distance
        float xS = (xVel /2)* frameTime;    // d = V[fin]*t * 0.5
        float yS = (yVel /2)* frameTime;
        //switch values
        xPos = -xS;
        yPos = -yS;

        //balls stays in borders
        if (xPos > xScreenSize) { //ball hits right screen edge
            xPos = xScreenSize;
        } else if (xPos < 0) {    //ball hits left edge
            xPos = 0;
        }

        if (yPos > yScreenSize) {  //ball hits top edge
            yPos = yScreenSize;   
        } else if (yPos < 0) {     //ball hits bottom edge
            yPos = 0;
        }
    }
}

此外,如果需要进一步解决问题,我可以尝试提供一个gif图像,向您显示球的行为。

现在我正在考虑两种可能的解决方案,但是我无法实现它们。 一种是在屏幕上的x和y位置创建一个偏移量变量并跟踪偏移量,另一种是在需要时以某种方式将加速度计的发射值重新设置为0,这样每次球碰到边缘时都会对其进行重新校准。但是我不知道该怎么做,我不确定是否有可能。感谢所有帮助。

0 个答案:

没有答案