2013-06-27 116 views
2

我正在做一個遊戲,我需要給我的對象碰撞,但我有很多快速的小物體和正常的碰撞算法(形狀等相交)不起作用,因爲位置+速度迭代推進牆壁,並且實際上從來沒有一個交叉點。「完美」碰撞檢測算法固定

所以我開始構建自己的(也許它已經存在,但我沒有看到它在任何地方)碰撞算法的基礎上保存對象是最後一個位置。

請看下面的圖像:

enter image description here

的想法是體現在幀1和圖像2。基本上,通過檢查最後一個矩形的左側和新矩形的右側之間是否有隔牆,在檢查碰撞時我從不跳過區域,並且沒有跳牆的風險(所以我認爲)。

這是算法的代碼:

private void bounce(GameElement b, Terrain t) 
{ 
    Rectangle tR = t.getRectangle(); 
    int tRleft = tR.x; 
    int tRright = tR.x+tR.width; 
    int tRup = tR.y; 
    int tRdown = tR.y+tR.height; 

    Rectangle bRnow = b.getRectangle(); 
    int bRnowLeft = bRnow.x; 
    int bRnowRight = bRnow.x+bRnow.width; 
    int bRnowUp = bRnow.y; 
    int bRnowDown = bRnow.y+bRnow.height; 

    Rectangle bRlast = b.getRectangleLast(); 
    int bRlastLeft = bRlast.x; 
    int bRlastRight = bRlast.x+bRlast.width; 
    int bRlastUp = bRlast.y; 
    int bRlastDown = bRlast.y+bRlast.height; 

    boolean leftRight = false, rightLeft=false, upDown=false, downUp=false; 
    boolean betweenX = false, betweenY = false; 

    if(bRnow.x>bRlast.x)leftRight=true; 
    if(bRnow.x<bRlast.x)rightLeft=true; 
    if(bRnow.y>bRlast.y)upDown=true; 
    if(bRnow.y<bRlast.y)downUp=true; 

    if(bRlastRight>tRleft && bRlastLeft<tRright) betweenX = true; 
    if(bRlastDown>tRup && bRlastUp<tRdown) betweenY=true; 

    if(leftRight) 
     if((tRleft>bRnowLeft || tRleft>bRlastLeft) && tRleft<bRnowRight && betweenY) 
     { 
      b.setX(tR.x-bRnow.width - 1); 
     } 

    if(rightLeft) 
     if((tRright<bRnowRight || tRright<bRlastRight) && tRright>bRnowLeft && betweenY) 
     { 
      b.setX(tR.x+tR.width + 1); 
     } 

    if(upDown) 
     if((tRup>bRnowUp || tRup>bRlastUp) && tRup<bRnowDown && betweenX) 
     { 
      b.setY(tR.y-bRnow.height - 1); 
     } 

    if(downUp) 
     if((tRdown<bRnowDown || tRdown<bRlastDown) && tRdown>bRnowUp && betweenX) 
     { 
      b.setY(tR.y+tR.height + 1); 
     } 
} 

其所謂的反彈,因爲它不是一個真正有組織的ATM,我仍然不得不考慮如何構建算法,使其成爲更廣義的和之實踐(將不勝感激幫助也是)

這種做碰撞的方式有一個錯誤,在圖3中看到的一個錯誤(抱歉繪製圓圈,它們應該是正方形),因爲FAST物體仍然通過對角線:/另一方面,在牆上的直接命中非常整齊。

我該如何改進,優化和組織這個算法?或者有沒有更好的算法,我只是想得太多而已?我感謝您的幫助。

+1

閱讀材料:http://www.a-coding.com/2010/10/predictive-collision-detection.html – Patashu

+0

類似的方法引用[here](http://www.vobarian.com/collisions /)。 – trashgod

+0

我不知道完美的碰撞會更容易用圓圈代替方塊。 – Xkynar

回答

0

軸對齊的邊界框樹通常很適合檢測物體碰撞。 Here is a tutorial with some code - 它的例子是3D碰撞檢測,但數據結構可以很容易地適應2D碰撞檢測。

+0

似乎太複雜和計算昂貴,我正在尋找=/ – Xkynar

+0

,似乎只能成功檢測到碰撞點,但不能在檢測到快速移動物體的碰撞。畢竟只有在對邊框進行截取時纔會創建樹?如果運動迭代非常大以至於從未攔截邊界框,它不應該工作...... – Xkynar