2017-06-12 25 views
2

我正在做一個桌面遊戲。 (在java中)這個桌面遊戲有一張地圖,必須使用多個字段/地塊。單位可以放在他們身上,他們可以移動。其他東西也放在它們上面。是否可以選擇/點擊一個圖像的多個部分?

對於地圖我有一個圖片我使用。我在網上尋找解決方案,但是我發現在網格遊戲(如國際象棋或跳棋)中的唯一位置以及此遊戲的地圖不能在正方形中劃分。我嘗試過這種方式,但是場地形狀不同以使其發揮作用。

對於如何解決這個問題,我有一些模糊的想法,但我不能將它們放入代碼示例中,並且不知道它們是否可以工作或如何工作。

的想法,我有:

  • 使一些無形的按鈕,並將其綁定到特定的圖像座標。我用這個解決方案遇到的問題是,它也必須能夠顯示放在它上面的東西。如果不是所有的字段都是可點擊的,這也是非常不方便的。
  • 我有一個'疊加'圖像,所有字段的輪廓和'內部'刪除。我做了這個覆蓋,所以我可以在板上添加一個淡淡的顏色覆蓋。有沒有可能以任何方式使用它?
  • 首先我要剪掉所有鬆散的田野,並把它們放在一起形成一個圖像。只是,我不知道我該怎麼做。不僅在哪裏放置它,而且還要如何確保元素始終與彼此相比處於相同位置,並且在更改屏幕/分辨率大小時,我的板不會弄亂?

我使用javafx作爲我遊戲中的圖形元素。

如果有什麼建議我沒有想到我自己,那些也是非常受歡迎的。

+0

也許svg會幫助你嗎?檢查https:// stackoverflow。com/questions/40753613/javafx-button-with-svg –

+0

對不起,我不太知道該怎麼辦 – Noralie

+0

我該怎麼辦? – Noralie

回答

1

如果足以檢索點擊鼠標的像素的顏色,那麼您可以非常輕鬆地完成此操作。如果您知道圖像顯示在圖像視圖未縮放和未裁剪,那麼所有你需要的是:

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); 
    // ... 
}); 

一旦你有了顏色,你可以做一些簡單的分析,看看它是否大致匹配圖像中各種項目的顏色,例如檢查hue組件,或檢查固定顏色的「距離」是否適當小。

這方面的一個典型的實現可能看起來像:

// 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 ; 
} 

並在處理程序後,你可以做

if (colorsApproximatelyEqual(color, FIELD_GREEN, 0.1)) { 
    // process click on field... 
} 

這是否是一種可行的方法取決於的性質圖像映射。如果地圖中的着色過於複雜(或者不容易用顏色區分對象),那麼您可能需要在場景圖中放置其他元素,並在每個元素上註冊處理程序,如問題中所述。

+0

顏色不會是一個問題,因爲我有'空'覆蓋,並可以在那裏應用顏色。 – Noralie

+0

但是,我將如何使用顏色設置的空間?如果我想在那裏放置一個單元,那將如何工作? – Noralie

+0

@Noralie不知道你在問什麼。也許把'ImageView'放在'Pane'中,然後用'layoutX'和'layoutY'設置爲鼠標點擊的座標,在'Pane'中添加其他內容 –

相關問題