Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以选择/单击一幅图像的多个部分?_Java_Image_Javafx - Fatal编程技术网

Java 是否可以选择/单击一幅图像的多个部分?

Java 是否可以选择/单击一幅图像的多个部分?,java,image,javafx,Java,Image,Javafx,为了一个任务,我正在做一个棋盘游戏。(在java中)这个棋盘游戏有一个地图,有多个必须使用的字段/区域。单位可以放在他们身上,他们可以移动。其他东西也放在上面 对于地图,我使用了一个图像。我在网上寻找解决方案,但我找到的唯一的解决方案是网格游戏(如国际象棋或西洋跳棋)和该游戏的地图不能仅划分为正方形。我试过了,但是场的形状是不同的 关于如何解决这个问题,我有一些模糊的想法,但我不能把它们放到代码示例中,也不知道它们是否会工作,或者如何工作 我的想法是: 制作一些不可见的按钮,并将它们绑定到图片

为了一个任务,我正在做一个棋盘游戏。(在java中)这个棋盘游戏有一个地图,有多个必须使用的字段/区域。单位可以放在他们身上,他们可以移动。其他东西也放在上面

对于地图,我使用了一个图像。我在网上寻找解决方案,但我找到的唯一的解决方案是网格游戏(如国际象棋或西洋跳棋)和该游戏的地图不能仅划分为正方形。我试过了,但是场的形状是不同的

关于如何解决这个问题,我有一些模糊的想法,但我不能把它们放到代码示例中,也不知道它们是否会工作,或者如何工作

我的想法是:

  • 制作一些不可见的按钮,并将它们绑定到图片中的特定坐标。这个解决方案的问题是,它还必须能够显示放置在上面的东西。如果不是所有的字段都可以点击,这也会很不方便
  • 我有一个“覆盖”的图像,所有领域的轮廓和“内部”删除。我做了这个覆盖层,这样我可以在电路板上添加一个模糊的颜色覆盖层。有没有可能以任何方式使用它
  • 首先,我想把所有松散的领域,并把它们放在一起,形成一个形象。只是,我不知道我该怎么做。不仅要将其放置在何处,而且,我如何确保元素彼此比较始终处于同一位置,并且在更改屏幕/分辨率大小时,我的电路板不会出现问题
我在游戏中使用javafx作为图形元素


如果有什么我自己没有想到的建议,我也非常欢迎

如果检索鼠标单击的像素的颜色就足够了,那么您可以相当轻松地进行检索。如果您知道图像在图像视图中显示为未缩放和未裁剪,则您只需:

imageView.setOnMouseClicked(e -> {
    Color color = imageView.getImage().getPixelReader().getColor((int)e.getX(), (int)e.getY());
    // ...
});
更一般地说,您可能需要将图像视图坐标映射到图像坐标:

imageView.setOnMouseClicked(e -> {
    double viewX = e.getX();
    double viewY = e.getY();
    double viewW = imageView.getBoundsInLocal().getWidth();
    double viewH = imageView.getBoundsInLocal().getHeight();
    Rectangle2D viewport = imageView.getViewport();
    double imgX = viewport.getMinX() + e.getX() * viewport.getWidth() / viewW;
    double imgY = viewport.getMinY() + e.getY() * viewport.getHeight() / viewH ;
    Color color = imageView.getImage().getPixelReader().getColor((int)imgX, (int)imgY);
    // ...
});
获得颜色后,您可以进行一些简单的分析,看看它是否与图像中各种项目的颜色大致匹配,例如,检查
色调
组件,或者检查与固定颜色的“距离”是否适当小

其典型实现可能如下所示:

// choose a color based on what is in your image:
private final Color FIELD_GREEN = Color.rgb(10, 10, 200);

private double distance(Color c1, Color c2) {
    double deltaR = c1.getRed() - c2.getRed();
    double deltaG = c1.getGreen() - c2.getGreen();
    double deltaB = c1.getBlue() - c2.getBlue();
    return Math.sqrt(deltaR * deltaR + deltaG * deltaG + deltaB * deltaB);
}

private boolean colorsApproximatelyEqual(Color c1, Color c2, double tolerance) {
    return distance(c1, c2) < tolerance ;
}

这是否可行取决于图像地图的性质。如果贴图中的颜色太复杂(或者对象不容易通过颜色区分),那么您可能需要在场景图中放置其他元素,并在每个元素上注册处理程序,正如您在问题中所描述的那样。

svg可能会帮到您吗?对不起,我不知道该怎么做我该怎么做?有了SVG,你可以制作任何形状的按钮。如果你只是把图像放在按钮上,它仍然保持正方形,只是中间有图像。一旦你有了一组形状按钮,你可以使用你的第一种方法将它们粘贴到地图上。这将是非常困难和大量的工作,因为所有的字段都有非常不同的形状,而不是简单的形状。颜色不会是一个问题,因为我有“空”覆盖,可以在那里应用颜色。但是我如何使用颜色设置的空间呢?如果我想在那里安置一个单位,那该怎么办?@Noralie不太清楚你在问什么。可以将
图像视图
放在
窗格
中,并在
窗格
中添加其他内容,将
布局X
布局
设置为鼠标点击的坐标。我可以创建所有字段的单个对象(所有不同的颜色)并赋予它们不同的属性吗?如果我想在那个区域显示一些东西,我可以直接这样做,还是需要其他东西?
if (colorsApproximatelyEqual(color, FIELD_GREEN, 0.1)) {
    // process click on field...
}