2011-05-13 106 views
4

我目前正在實施一個允許玩家在賽道上駕駛汽車的java小遊戲。碰撞檢測顏色

我希望汽車如果偏離軌道慢,但是,因爲軌道是圓形的,所以使用矩形似乎不是最好的想法。

一個突然出現在我頭上的想法是用某種方式使用汽車像素的顏色。如果汽車的所有像素碰巧都是地圖上的綠色,而不是黑色的,那麼我會放慢車速。

這是一個很好的方法嗎?如果是這樣,我該如何去做呢?搜索剛剛獲得了相同的矩形交集方法來進行碰撞檢測。

+0

如何定義圓形軌道?如果你還沒有,你可能還想看看http://gamedev.stackexchange.com/。 – YXD 2011-05-13 00:58:06

回答

1

你可以做碰撞檢測類似比特。用1代表前景,用0代表透明或外部像素。 '將面罩與汽車所在的背景相結合,會導致汽車所在的背景像素。當然,這個'AND'操作不是對位進行操作,而是對背景的像素值進行操作。搜索Raster-Ops或PixBlt可能會導致一些解決方案。

+0

這可以通過['getRaster()'](http://download.oracle.com/javase/6/docs/api/java/awt/image/BufferedImage.html#getRaster%28%29)來完成,但它的規模很差。 – trashgod 2011-05-13 02:07:39

+0

這是有道理的。我如何去做這個面具?我應該使用什麼數據結構? – oadams 2011-05-13 07:01:02

+0

將整個屏幕作爲一個多維數組看起來對我來說是個壞主意,因爲在高分辨率下,每個操作都會非常緩慢。 – 2011-05-13 11:55:23

3

如果您的汽車和軌道可以使用實現Shape界面的類來繪製,那麼可以使用各種方法之一來解決問題。有一個比例和旋轉示例here和更詳細的示例here

+0

您是否可以點亮一下contains()方法的實現? – 2011-05-13 11:56:13

+0

@Dhaivat Pandya:這是最好的部分 - 所有的實現類已經有了具體的方法。這裏有一個[示例](https://sites.google.com/site/drjohnbmatthews/point-in-polygon),使用「Polygon」。 – trashgod 2011-05-13 19:46:42

+0

+1這似乎是唯一的理智和不慢的答案。 – 2011-05-13 20:46:51

1

這些都是很好的答案。如果您想更深入地瞭解顏色檢測的想法,請查看Java API中的Robot類;它有很多很酷的低級功能,比如獲取屏幕上一個點的顏色值(px,px),移動光標而不依賴於用戶等等。

+0

這是一個[使用'createScreenCapture()']的示例(http://stackoverflow.com/questions/3742731/java-how-to-draw-constantly-changing-graphics/3742841#3742841)。 – trashgod 2011-05-13 02:31:21

+0

這不是一個好主意。這就像試圖通過製作機器人手臂將程序寫入文件一樣。你可以在後端做。 – 2011-05-13 20:46:34

+0

你自己的後端?你將如何在Java中做到這一點?我沒有看到類比;低級訪問是低級訪問。但我並不是說這個算法是一個好主意。 – xdevient 2011-05-13 21:34:34

0

我喜歡trashgod的答案最好,但是,如果你不使用Shape類,那麼你可能會遇到問題。

所以,這是我的答案。首先,任何你可以在屏幕上繪製的東西都有一定的粒度,所以要充分利用它。你還沒有提供很多關於如何在屏幕上傳輸的細節,但是,這是我的建議。

使用Bezier Curves。由於它們是數學上定義的(並且繪圖非常簡單),因此您可以輕鬆地在Bezier曲線上選擇100個點,並檢查您的汽車邊緣是否在Bezier曲線內。這可能是最準確的解決方案。

如果你不喜歡數學出於某種原因,我會建議跟蹤一個變量,它包含最近一塊污垢的距離,當這個變量爲零時,可以減慢車速。或者(最糟糕的解決方案),您可以比較屏幕上顯示的兩個補丁(汽車和污垢),並檢查汽車是否在污垢上。這是Shape.contains()方法所做的,但是,它是由專業人員編寫的,而且您的版本可能會明顯變慢。