2013-07-05 59 views
-3

這是我的第一篇文章 我希望如果有人能夠在我的賽車遊戲中爲我提供更好的碰撞反應方面的幫助。 到目前爲止,我發展的是基礎和胡思亂想,一個小小的物理學對我很好。 這是代碼。更好的碰撞反應對於使用Java的2D汽車遊戲

P.S:我不能使用Box2D,因爲我沒有時間學習它以符合截止日期,我不能!

如果需要,我可以提供鏈接到我的源文件。

Area police_area=new Area(transformed_police); 
Area punk_area=new Area(transformed_punk); 
pox=(int) police_area.getBounds2D().getCenterX(); 
poy=(int) police_area.getBounds2D().getCenterY(); 
pux=(int) punk_area.getBounds2D().getCenterX(); 
puy=(int) punk_area.getBounds2D().getCenterY(); 
if((police_area.isEmpty()!=true)&&(punk_area.isEmpty()!=true)) 
{ 
    police_area.intersect(punk_area); 
    if(police_area.isEmpty()!=true) 
    { 
     car_police.score_update(); 
     car_punk.score_update(); 
     if(pox>pux && poy>puy)//1 
     { 
      car_punk.x-=((int)(movement_police.speed))+5; 
      car_punk.y-=((int)(movement_police.speed))+5; 
      for(int i=0;i<=(movement_police.speed)/2;i++) 
      { 
       try 
       { 
        car_punk.rotate_ac(); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
      }      
     } 
     if(pox==pux && poy>puy)//2 
     { 
      car_punk.y-=((int)(movement_police.speed))+5;      
     } 
     if(pox<pux && poy>puy)//3 
     { 
      car_punk.x+=((int)(movement_police.speed))+5; 
      car_punk.y-=((int)(movement_police.speed))+5;  
      for(int i=0;i<=(movement_police.speed)/2;i++) 
      { 
       try 
       { 
        car_punk.rotate_c(); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     } 
     if(pox>pux && poy<puy)//6 
     { 
      car_punk.x-=((int)(movement_police.speed))+5; 
      car_punk.y+=((int)(movement_police.speed))+5; 
      for(int i=0;i<=(movement_police.speed)/2;i++) 
      { 
       try 
       { 
        car_punk.rotate_c(); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     } 
     if(pox==pux && poy<puy)//7 
     { 
      car_punk.y+=((int) (movement_police.speed))+5; 
     } 
     if(pox<pux && poy<puy)//8 
     { 
      car_punk.x+=((int)(movement_police.speed))+5; 
      car_punk.y+=((int)(movement_police.speed))+5; 
      for(int i=0;i<=(movement_police.speed)/2;i++) 
      { 
       try 
       { 
        car_punk.rotate_ac(); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     } 
     if(pox>pux && poy==puy)//4 
     { 
      car_punk.x-=((int)(movement_police.speed))+5; 
     } 
     if(pox<pux && poy==puy)//5 
     { 
      car_punk.x+=((int)(movement_police.speed))+5; 
     } 
    }     
} 
+0

你可以編輯它,使其更容易閱讀和分析?間距實際上是關閉的。 –

+0

我會馬上到它,騰出一分鐘 – theClassicFreak

+0

一系列的*下*,*家*和*選項卡*是否:) – theClassicFreak

回答

0

正確的方式做,這將是兩個形狀之間計算minimum translation vector(或MTV),並用它來改變你的物理變量。

計算兩個矩形之間的MTV應該相當容易,只要您將渲染間的流逝時間限制在最大值並保持低速以防止隧道效應。

隧道是當一個物體移動的很快,你錯過碰撞durnig你的模擬。這個問題可以通過投影你的形狀並沿着它假設的路徑執行碰撞檢測來解決,但是這會更困難並且可能導致幀速率下降。

實施恰當的物理學很難。即使模擬模擬真實的物理也很困難。正因爲如此,我建議您在遊戲進一步發展之前查看Box2D。它會爲你節省很多時間。

你可以嘗試計算從一輛汽車指向另一輛汽車的矢量,然後對其進行標準化,並通過相對於汽車兩種速度的某種力量進行縮放,以便爲朋克汽車獲得適當的力量。

我強烈建議您至少對這些方程使用Vector類。他們混淆了你的代碼,並且在物理遊戲中,你需要遍佈整個地方的向量。編輯: 下面是我正在描述的一個例子。

pox=(int) police_area.getBounds2D().getCenterX(); 
poy=(int) police_area.getBounds2D().getCenterY(); 
pux=(int) punk_area.getBounds2D().getCenterX(); 
puy=(int) punk_area.getBounds2D().getCenterY(); 

//calculate vector pointing from police center to punk center. 
double dx = pux - pox; 
double dy = puy - poy; 
//normalize vectors, as we are going to apply a scalar relative to velocities 
double length = Math.sqrt((dx * dx) + (dy * dy)); 
dx = (dx/length); 
dy = (dy/length); 

//ouch, black magic math, no logic here. 
double scalar = movement_police.speed-movement_punk.speed; 

//scale normalized vector by black magic scalar 
dx*=scalar; 
dy*=scalar; 

//now we actually alter the punks speed. 
movement_punk.velocity_x += dx; 
movement_punk.velocity_y += dy; 

速度和方向受到虛假物理方式的影響。這可能是解決問題的一部分的最簡單方法。這不處理旋轉物理,摩擦,質量或密度...這就是爲什麼我會盡可能延長這個最後期限,並學習如何使用box2d。也熟悉基本的矢量數學。你會需要它的遊戲!

+0

我完全讚賞你的指導方針,但是沒有其他方法可以解決這個問題,這不會導致維基百科知道你將要做什麼? – theClassicFreak

+0

哈哈耶維基百科數學文章通常看起來像希臘人不是嗎?是的,你可以計算出一個從警車中心位置到你的朋克車中心位置的矢量,並用它來改變這裏的速度。 –

+0

是的,他們做的加我不能使用Box2D因爲我必須滿足最後期限,缺乏時間學習,雖然我肯定會在以後。 – theClassicFreak