我正在制作一个简单的游戏。 我有 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);
}
它工作得很好,但有时按钮会相互覆盖,这意味着它会出现在几乎相同的位置。我希望每个按钮都位于唯一的位置,并且不要触摸其他按钮。
知道我如何才能实现这一目标吗? 提前致谢!
最佳答案
您正在寻找的是碰撞检测,我的回答将大大简化这个过程。我建议搜索碰撞检测算法以了解更多信息。
因此,对于 super 简单的开始,我们可以比较 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 语句,这是一个不错的起点。
关于java - 生成按钮的随机位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37034967/