2014-10-22 90 views
0

我有問題,移動得太快的球可以穿過牆壁(牆壁是4個像素寬,偶爾會有超過400像素/秒的速度(這是超過4像素每更新假設fps是60))。我在StackOverflow上進行了研究,但其他人的解決方案並不適合我,因爲他們使用的是矩形,而我正在使用像素碰撞。這裏是方法,它返回如果球與壁相交(方法是在球類):Java檢測快速移動物體的碰撞

public boolean intersects(Wall w) { 

    BufferedImage im1 = new BufferedImage (size, size, BufferedImage.TYPE_INT_ARGB);  // size is diameter of the ball 
    BufferedImage im2 = new BufferedImage (size, size, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g1 = im1.createGraphics(); 
    Graphics2D g2 = im2.createGraphics(); 
    g1.translate(-x + size/2, -y + size/2);   
    g2.translate(-x + size/2, -y + size/2); 
    render(g1); 
    w.render(g2); 
    g1.dispose(); 
    g2.dispose(); 

    for (int x = 0; x < im1.getWidth(); x++){ 
     for (int y = 0; y < im1.getHeight(); y++){ 
      Color c1 = new Color(im1.getRGB(x, y), true); 
      Color c2 = new Color(im2.getRGB(x, y), true); 
      if (c1.getAlpha() != 0 && c2.getAlpha() != 0){ 
       return true; 
      } 
     } 
    } 

    return false; 

} 

這裏是球如何繪製:

public void render(Graphics2D g) { 
    color = new Color (Color.HSBtoRGB(hue, 0.5f, 0.5f)); 
    g.setColor (color); 
    g.fillOval((int)(x-size/2), (int) (y-size/2), size, size); 
} 

壁被簡單地定義爲2分,在這裏是如何繪製牆:

public void render(Graphics2D g2) { 
    g2.setColor(new Color(r, g, b)); 
    g2.setStroke(new BasicStroke(width));  //width = 4 
    g2.draw(new Line2D.Float(p1.x, p1.y, p2.x, p2.y)); 
} 
+0

難道是因爲他們旅行的距離超出了你的範圍檢查範圍,也就是說,他們一舉移動到目前爲止,你的邊界檢查只是不夠寬... – MadProgrammer 2014-10-22 05:54:43

+0

這是真的,但是如果我嘗試增加牆的邊界(即增加它的邊界寬度與球的距離),碰撞檢查變得太慢,而不是創建大小爲4x4的bufferedimage,我將不得不創建大小爲ballspd x ballspd的bufferedimage,並遍歷所有像素,這對於數量不夠有效我有球和牆。 – 2014-10-22 05:59:38

+0

而不是嘗試對其進行物理建模,虛擬建模...... – MadProgrammer 2014-10-22 06:00:54

回答

1

我有幾個快速的想法,你可能想嘗試。

爲什麼不根據牆的尺寸檢查端點(一些簡單的代數,我想你可能已經試圖做的)。如果您需要與代數有關的幫助,我會在下面包含一個鏈接。基本上只記錄球的起點(在移動之前),並在更新時檢查舊位置與估計位置,並運行函數以查看是否發生碰撞。如果你想要逼真的物理,這將變得棘手。

https://gamedev.stackexchange.com/questions/26004/how-to-detect-2d-line-on-line-collision

在上面的鏈接,只是假設你的牆壁是一條線,而之前的座標和球的預計明年座標形成的其他線路。如果你只有直線移動球,這種方法效果很好。

你唯一的選擇可能是有兩個同時模式運行(基本上,你在出球和牆壁有一個視覺空間和虛擬設置檢查物理後面你是顯示的內容。