2017-05-04 43 views
1

我想在我的遊戲中實現Gravity。 我目前有一個月球應該繞行星運行(兩者都使用我的遊戲中的Cell類)。在libgdx中創建一個圓形軌道

下面的代碼被使用(縮短):

在類細胞:

private Cell graviator; 
private Vector2 pos; 
private Vector2 vel; 
private Vector2 drg; 
private int mass; 
private float drgSpeed; 
private GravityField grav=new GravityField(this); 

public void move(){ 
    calculateDrag(); 
    if(orbiting){ 
     orbit(); 
    } 
    pos.add(vel); 
    pos.add(drg); 
} 

private void calculateDrag() { 
    drg.scl(drgSpeed); 
} 

private void orbit(){ 
    Vector2 temp=new Vector2(drg.x,drg.y); 
    temp.rotate90(0); 
    temp.nor(); 
    speed=(float)Math.sqrt((mass+graviator.getMass())/getGraviatorDistance()); // v= sqrt((M*m)/r) 
    temp.scl(speed); 
    vel=temp; 
} 

在類重力場:

private Cell cell; 

public void computeGravity(Cell cell2) { 
    float force = getForce(cell2); 
    if (cell != cell2.getGraviator()) { 
     if (cell2.getMass() < cell.getMass()) { 
      if (force > cell2.getLargestForce()) { 
       cell2.setGraviator(cell); 
       cell2.setLargestForce(force); 
       cell2.setDrg(getDragVector(cell2)); 
       cell2.setDrgAcc(getAcceleration(cell2)); 
      } 
     } 
    } else { 
     cell2.setLargestForce(force); 
     cell2.setDrg(getDragVector(cell2)); 
     cell2.setDrgAcc(getAcceleration(cell2)); 
    } 
} 

public Vector2 getDragVector(Cell cell2) { 
    Vector2 temp = new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y); 
    temp.nor(); 
    return temp; 
} 

public Vector2 getDirection(Cell cell2) { 
    return new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y); 
} 

public float getDistance(Vector2 direction) { 
    return direction.len(); 
} 

public float getForce(Cell cell2) { 
    Vector2 temp = new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y); 
    return cell.getMass() * cell2.getMass()/(temp.len() * temp.len()); //f = M*m/r^2 
} 

public float getAcceleration(Cell cell2) { 
    Vector2 temp = new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y); 
    float force = cell.getMass() * cell2.getMass()/(temp.len() * temp.len()); 
    float acceleration = force/cell2.getMass(); // a= f/m 
    return acceleration; 
} 
與我的重力場

,所以我基本上施加dragVector到被拉的細胞。

細胞,細胞是朝graviator移動與

pos.add(drg); 

,並朝與

pos.add(vel); 

在我的軌道上()方法,我試圖找到並設置VEL自己的movementVector VEL做一個圓形軌道。

我的問題是,我莫名其妙地無法完成軌道。月亮仍然略微縮小,距離越來越遠,對地球的影響越來越大。

我不知道爲什麼它不工作。我是否使用正確的公式?

寫出我用:

v= sqrt((M*m)/r)我OrbitVector速度 f = M*m/r^2用於向地球 a= f/m爲加速向地球

謝謝您的幫助蒲凌力!

回答

0

這很簡單。有2個紋理你將需要,你的軌道和月球。你必須做的是繼續在軌道上旋轉月球。

如果您使用的是精靈,你可以這樣做:

sprite.setRotation(rotationVaue); 
rotationValue+=1; 

不過這裏要注意一個非常重要的事情是,無論是圖像應具有相同的分辨率。

我最近做了同樣的事情,我甚至問了一個問題關於它的計算器,這裏是鏈接:

Collision detection for an arc of a circle

+0

好that's不是我想要什麼。 我想實現一個物理系統。軌道應該是動態的並且支持多重影響星體。 – Superwutz