我正在做一个简单的游戏。 我有6个按钮,我想每次在不同的位置随机播放它们。
所以我做了一个简单的方法来实现这个目标。
private void changeButtonPlace(ImageView button) {
Random r = new Random();
int newXloc = r.nextInt(getScreenWidth() - (2 * button.getLayoutParams().width));
int newYloc = r.nextInt(getScreenHeight() - (3 * button.getLayoutParams().height));
button.setX(newXloc);
button.setY(newYloc);
}
它工作得很好,但有时按钮会互相覆盖,这意味着它会在几乎相同的位置上进行。我希望每个按钮都位于一个独特的位置,而不要触摸其他按钮。
知道我怎么能做到这一点? 提前谢谢!
答案 0 :(得分:3)
您正在寻找的是碰撞检测,我的回答将大大简化此过程。我建议搜索碰撞检测算法以了解更多信息。
因此,对于超级简单的开始,我们可以比较2个盒子的位置,长度和高度。对于我的例子,我将假设这些盒子的原点是它们的左上角。
if((boxA.xPos + boxA.length ) < boxB.xPos || boxA.xPos > (boxB.xPos + boxB.length))
那将检查两个盒子是否沿着x轴接触,我们也可以改变y轴的值
if((boxA.yPos + boxA.height ) < boxB.yPos || boxA.yPos > boxB.yPos + boxB.height)
现在,这不是一种非常有效的方法。有许多更好的方法来简化这种逻辑,并节省资源。但是,它很快而且很脏,并且可能足以满足像您只需要6个按钮的简单游戏这样的小应用程序。
所以,使用这两个方程式,您可以嵌套它们然后在里面运行碰撞代码,或者您可以将它们组合成一个等式:
if(((boxA.yPos + boxA.height) < boxB.yPos || boxA.yPos > (boxB.yPos + boxB.height)) || ((boxA.xPos + boxA.length ) < boxB.xPos || boxA.xPos > (boxB.xPos + boxB.length)))
对于一行来说,这是很多东西,如果你刚刚开始,我建议将它们嵌套,这样你就可以更好地通过方程看到逻辑流。但是,请记住未来,如果你需要挤出那些额外的性能,或者将它们组合成一个if语句就可以开始了。
答案 1 :(得分:1)
一种方法是制作网格而不是屏幕上的随机位置使用网格上的随机点。这样,您可以检查当前网格位置是否已有一个按钮。
如果您希望它们更加分散,您可以将每个按钮添加到阵列,并检查新按钮是否与其他按钮接触。循环无限创建随机位置和另一个循环以检查它们是否没有点击数组中的其他按钮。找到新位置后,添加按钮并突破无限循环。
答案 2 :(得分:0)
你应该考虑按钮的宽度,在设置按钮的位置之前,确保没有按钮与简单的相交if,如果它们只是随机化相交的按钮,应该很容易编程
修改:
让我们稍微简单一点假设你有3个按钮,假设它们位于带有这些坐标的2d轴上 答:1,0 B:2,0 C:5,0 按钮宽度:X = 2 Y = 2
正如你在乍一看这个例子中看到的那样,好像没有按钮相互交叉但是如果你将宽度添加到B你就明白真正的位置是B [1,3],[ - 1,1假设坐标是按钮的中心,则与C [4,6],[ - 1,1]的实际位置相交
first [,]表示X轴秒[,]表示Y轴 因此,您的支票将是这样的:
For each Button x
For each button x
calculate real coordinates of button x and y check intersection
if exists recalculate the coordinates and start the loop over
在讨论运行时间时,这个解决方案有点贵,但是一旦你明白了,你就能找到更容易的东西。