我正在做一個遊戲,我需要給我的對象碰撞,但我有很多快速的小物體和正常的碰撞算法(形狀等相交)不起作用,因爲位置+速度迭代推進牆壁,並且實際上從來沒有一個交叉點。「完美」碰撞檢測算法固定
所以我開始構建自己的(也許它已經存在,但我沒有看到它在任何地方)碰撞算法的基礎上保存對象是最後一個位置。
請看下面的圖像:
的想法是體現在幀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物體仍然通過對角線:/另一方面,在牆上的直接命中非常整齊。
我該如何改進,優化和組織這個算法?或者有沒有更好的算法,我只是想得太多而已?我感謝您的幫助。
閱讀材料:http://www.a-coding.com/2010/10/predictive-collision-detection.html – Patashu
類似的方法引用[here](http://www.vobarian.com/collisions /)。 – trashgod
我不知道完美的碰撞會更容易用圓圈代替方塊。 – Xkynar