2014-02-13 22 views
2

我的应用程序包含一个在surfaceview上移动的对象。我可以通过加速计移动它。 这里的选手对象的移动代码:加速对象的Android屏障检测

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大于游戏视图时,它应该不再移动。但是这会导致玩家在视图的右侧停止像素......当向右轻微倾斜时,对象在视图的边界完全停止...

现在应该如何更改代码来实现一个可以在屏幕边界完美停止运动的物体?

Image with intensively use of accelerometer

这张图片上可以看到一圈没有底部相当停止,因为有圆与下边框之间的一些像素。要稍微回来的加速度时,圆赞同屏幕的底部:

bottom of the screen

但现在,移动缓慢时,我只能到达屏幕边框,这意味着有低MX或我的。

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

任何想法?

在此先感谢

+0

屏幕截图或两个可能有助于澄清你的问题。 – Kerry

+0

添加了两个屏幕截图 – user2410644

+0

在Android Breakout(https://code.google.com/p/android-breakout/)中可以找到一些关于碰撞检测的喋喋不休的内容。特别注意GameState.java中'findFirstCollision()'顶部的注释 - 游戏以小增量前进球,并在每一步检查。你不需要这个 - 你只有四面墙担心,所以代数将提供答案 - 但是如果添加更多的对象与你碰撞可能需要类似的东西。 (如果碰撞发生在物体的边缘而不是中心,它也会变得更加复杂。) – fadden

回答

2

尝试的值,而不是上限边境像这样

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

想要尝试一下,谢谢! 编辑:伟大的工程!但可悲的是,它只能在屏幕的右侧和底部运行......你有没有建议如何实现这两方面呢? – user2410644

+0

当然。我已经添加了一些应该处理这个问题的代码。虽然有点哈克。在这一点上,你可能想要创建自己的方法,称为“帽子”或类似的东西。 – vidstige

+0

工程就像一个魅力!谢谢! (完全没有考虑Math.min或Math.max) – user2410644