我正在製作一款2D遊戲,沒什麼奇特的,它與對象(從現在開始稱爲實體)應該與海誓山盟和地形碰撞。現在,檢測碰撞不是問題,問題是實體與地形碰撞。需要關於碰撞處理的建議
我有一個簡單的.png,在加載遊戲時,我會瀏覽此圖像的所有像素,並將所有黑色圖像添加到列表中,這些圖像是可以相互碰撞的像素。從實體類
碰撞代碼:
int ceiling = Integer.MAX_VALUE;
int floor = 0;
int rightPoint = 0;
int leftPoint = Integer.MAX_VALUE;
for(Point p : main.terrain.points)
if(getHypoRect().contains(p))
{
if(p.x > rightPoint && right)
rightPoint = p.x;
if(p.x < leftPoint && left)
leftPoint = p.x;
if(p.y < ceiling && up)
ceiling = p.y;
if(p.y > floor && down)
floor = p.y;
}
if(rightPoint != 0)
xCoord = rightPoint - sprite.getImage().getWidth();
else if(right)
xCoord+=speed;
if(leftPoint != Integer.MAX_VALUE)
xCoord = leftPoint;
else if(left)
xCoord-=speed;
if(ceiling != Integer.MAX_VALUE)
yCoord = ceiling;
else if(up)
yCoord-=speed;
if(floor != 0)
yCoord = floor - sprite.getImage().getHeight();
else if(down)
yCoord+=speed;
在for循環我經過的地形所有點(黑色像素),然後檢查實體的collisionbox包含它們(速度在增加這種方法,或者說「假設」添加,這就是爲什麼它有奇怪的名字)。 現在,如果該點的x值大於「rightpoint」,並且實體正在向右走,則會被覆蓋。 leftPoint(「leftest」點),天花板和地板也是如此。 然後我檢查這些點是否有變化,如果它們意味着我們與地形發生碰撞,所以我們將它們反彈回來。例如,假設實體正在向右行走,並且我們與地形發生碰撞,RightPoint已寫入與我們碰撞的「最右」點,然後我們設置座標,以便實體恰好在與它碰撞的點旁邊。
如果一次只能朝一個方向行進,這可以很好地工作,但在考慮多個輸入時會發生「奇怪」的事情。
示例:實體走向平坦的地面,朝向右側的窗臺,當實體位於窗臺的一半時,它想要向下,因此向右和向下都被按下,我的代碼將執行什麼操作檢查輸入,將實體放置到想要的位置,然後在它觸及地形時將其彈回,這樣就可以看到我按右鍵並將實體彈回到窗臺的末端。
這是我自己的想法terraincollision如何工作,除了如何檢查碰撞發生,但我沒有找到任何東西,但沒有涵蓋這一點。 任何想法可以讓我的解決方案起作用,或指示terraincollision應該如何完成?
謝謝,即使我保持彈跳回來的想法,實際上工作得很好,但仍然有點古怪。如果我不反彈,如果實體速度足夠高,它將保持與地形的尷尬距離。 – XistenZ 2013-02-10 15:53:17