Android 安卓:使用加速度计实现球的平稳滚动

Android 安卓:使用加速度计实现球的平稳滚动,android,accelerometer,Android,Accelerometer,我为Android开发了一个迷宫游戏,你可以通过倾斜手机来控制球 所以我使用加速计,积分x和y加速计的值,然后将球向那个方向移动一步 我有一个问题,虽然,我不能实现一个非常顺利的滚动。当球加速时,很明显,它会以很大的离散步数跳跃。我见过其他类似的应用程序,它的滚动速度很快但很平稳 因此,我可能不得不改变策略,改用某种时间解决方案。现在速度越快,我走的步就越大。相反,我应该有一个计时器,如果速度高,每毫秒移动一个像素,或者如果速度低,每10毫秒移动一个像素,或者沿着这些线移动。 或者,人们如何实现

我为Android开发了一个迷宫游戏,你可以通过倾斜手机来控制球

所以我使用加速计,积分x和y加速计的值,然后将球向那个方向移动一步

我有一个问题,虽然,我不能实现一个非常顺利的滚动。当球加速时,很明显,它会以很大的离散步数跳跃。我见过其他类似的应用程序,它的滚动速度很快但很平稳

因此,我可能不得不改变策略,改用某种时间解决方案。现在速度越快,我走的步就越大。相反,我应该有一个计时器,如果速度高,每毫秒移动一个像素,或者如果速度低,每10毫秒移动一个像素,或者沿着这些线移动。 或者,人们如何实现更平滑的滚动


另外:你会使用OpenGL吗?

你在这里真正做的是积分耦合微分方程。如果你没有学习足够的微积分或物理来了解这意味着什么,不要担心

以耦合微分方程为生的人们已经进化出许多算法来有效地实现这一点

这里有四个方程:x和y方向的加速度和x和y方向的速度:

dvx/dt = ax
dvy/dt = ax
dsx/dt = vx
dxy/dt = vy
sx,sy给出球在给定时间的位置。你需要sx,sy和vx,vy的初始条件

听起来您选择了集成ODE的最简单方法:Euler显式集成。从开始时的值加上时间步长的变化率,计算步骤结束时的值:

(vx, vy)_1 = (vx, vy)_0 + (ax, ay)_0 * dt
(sx, sy)_1 = (sx, sy)_0 + (vx, vy)_0 * dt
编程很容易,但如果您的时间步长太大,在某些情况下,它往往会遇到稳定性问题

您可以缩短时间步长,这将迫使您执行多次计算,或者切换到另一个集成方案。寻找隐式积分、龙格库塔等


集成和渲染是两个独立的问题

非常感谢!那么单独计算速度和更新屏幕有意义吗?让sensorthread更新速度,然后让计时器每隔毫秒左右更新一次屏幕。我认为您应该更新速度和位置,同时在同一线程中执行屏幕渲染。你想使用动态加速度计数据,所以你不能预先计算路径,实际上我做的只是分别计算每个方向的积分。只是做一个线积分。减去当前时间和最后一步的时间,然后计算加速度值之间直线下的面积。然后把它加到一个总和上,就是速度。我仍然不明白你的建议是如何解决真正的问题的,虽然信息丰富,但当速度变快时,我会在屏幕上移动很多步,这会导致如果你在一个圆中移动球,它会变成一个多角圆,如果这有意义的话。如果你了解一些关于数值积分的知识,它会。外推是一件危险的事情,尤其是当你根据一个在一步开始时有效的斜率来预测一个长步结束时的值时。终点的准确度取决于台阶坡度的微小变化。如果它很大,你最好迭代求解:猜测最后的斜率,计算一个新的结束值,看看你的猜测有多好。它们耦合的事实如何影响计算?我发现了这一点,但我不确定如果它们是耦合的,是否可以使用: