【问题标题】:Android barrier detection of accelerating object加速物体的Android障碍检测
【发布时间】:2014-03-12 17:28:29
【问题描述】:

我的应用程序包含一个在表面视图上移动的对象。我可以通过加速度计移动它。 这是玩家对象的移动代码:

if(x + mx*speed > 0 && x + mx*speed < GameView.WIDTH) {
        x += mx*speed;
    }
if(y+ my*speed > 0 && y+ my*speed < GameView.HEIGHT) {
        y+=my*speed;
    }

x 和 y 是玩家的坐标

mx 是玩家从加速度计获得的值,例如:向左倾斜时,mx 为-2,更多倾斜时,mx 为-4、-5、-6 等。 --> my 是y轴也一样

当我想要更快的运动时,速度是一个可以修改和玩耍的变量。

如您所见,我试图将移动限制为仅在玩家在视图内时移动。

现在我的问题是:当设备强烈向右倾斜时,mx 变成 6。速度设置为 5。这意味着,当玩家的位置 + 6 * 5 大于游戏视图时,它不应该再动。但这会导致玩家在视图右侧停止像素...当轻轻向右倾斜时,对象会完全停止在视图的边界...

现在我应该如何更改代码以实现在屏幕边界处完美停止其移动的对象?

在这张图片上,您可以看到圆圈并没有完全停在底部,因为圆圈和底部边框之间有一些像素。当用加速度计稍微往回走时,圆圈会与屏幕底部对齐:

但现在,我只能在缓慢移动时才能到达屏幕边框,这意味着 mx 或 my 较低。

你可以看到mY值的截图。在第一张照片上,我 = ca。 8 和第二个约。 6.

有什么想法吗?

提前致谢

【问题讨论】:

  • 一两个屏幕截图可能有助于澄清您的问题。
  • 添加了两张截图
  • 可以在 Android Breakout (code.google.com/p/android-breakout) 中找到一些关于碰撞检测的喋喋不休。特别注意 GameState.java 中 findFirstCollision() 顶部的 cmets —— 游戏以小增量向前移动球,并检查每一步。你不需要这个——你只需要担心四堵墙,所以代数会提供答案——但是如果你添加更多的物体来碰撞你可能需要类似的东西。 (如果碰撞发生在对象的边缘而不是中心,它也会变得更加复杂。)

标签: android game-physics collision acceleration


【解决方案1】:

尝试像这样将值限制在边框上

x = Math.max(Math.min(x + mx*speed, GameView.WIDTH), 0.0f));
y = Math.max(Math.min(y + my*speed, GameView.HEIGHT, 0.0f));

【讨论】:

  • 去试试,谢谢!编辑:效果很好!但遗憾的是它只适用于屏幕的右侧和底部......您有没有建议如何同时实现这两个方面?
  • 当然。我添加了一些应该处理这个问题的代码。不过有点hacky。此时,您可能想要创建自己的方法,称为 cap 或类似的名称。
  • 像魅力一样工作!谢谢! (完全没有考虑 Math.min 或 Math.max)
  • @user2410644 之前代码的问题是靠近边缘,您根本没有改变位置,使物体离墙很近。使用Math.min,您将更新靠近边缘的位置,但永远不要越过它。
猜你喜欢
  • 2017-05-24
  • 2017-08-20
  • 1970-01-01
  • 2023-03-09
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
相关资源
最近更新 更多