2013-02-10 42 views
1

我正在製作一款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應該如何完成?

回答

2

你反彈的想法可能有問題。嘗試改爲忽略與地形碰撞的移動:
如果玩家向下和向右移動,那麼首先檢查向下碰撞,如果是,則忽略該移動,並檢查是否正確,如果正確可行否則也會阻止。

+0

謝謝,即使我保持彈跳回來的想法,實際上工作得很好,但仍然有點古怪。如果我不反彈,如果實體速度足夠高,它將保持與地形的尷尬距離。 – XistenZ 2013-02-10 15:53:17