java - 生成按钮的随机位置

标签 java android xml game-engine

我正在制作一个简单的游戏。 我有 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/

相关文章:

java - 为 N 名玩家生成一手牌(每手五张牌)

java - ooxml 架构、IntelliJ IDEA 和 NullPointerException

html - 用于匹配具有缺失/未指定属性的元素的 XPath?

java - 一个模式不能包含两个同名的全局组件

java - Spring 在使用 find 访问对象时是否应该启动事务?

java - JSF 是否包含任何邮件标签或库或任何邮件功能?

android - FFMPEG 输出文件 #0 不包含任何流

Android 房间查询在 Repository 空指针异常中使用 AsyncTask

java - 尝试使用 eclipse 将文件推送到 android 设备时出现问题

javascript - 使用 JavaScript 将 Xml 转换为 HTML5