2013-03-06 64 views
0

我試圖建立一個超級simpel物理引擎只是作爲一種培訓形式,並至少了解創建遊戲物理的基礎知識。我知道像box2d和花栗鼠這樣的東西提供了更多的可能性。但那不是我現在想要達到的。我希望將我的簡單代碼提升到下一個級別,並嘗試實現更真實的行爲。我試圖按照這個通用教程http://www.wildbunny.co.uk/blog/2011/04/06/physics-engines-for-dummies/,但語法混淆了我,我不完全確定如何應用一些事情。建立一個迷你物理引擎的目標c/cocos2d

現在我有一個從CCNode派生的簡單球類(使用cocos2D框架) 該類有它自己的更新方法,使得它在隨機方向上移動並且邊緣反彈。

-(void) update:(ccTime) time { 
    [self moveCircle:time]; 
} 

- (void) moveCircle: (ccTime) time { 
    CGSize screenSize = [[CCDirector sharedDirector]winSize]; 

    // limit the velocity 

    if (self.vx > maxVel) { 
     self.vx = maxVel; 
    } else if (self.vx < minVel) { 
    self.vx = minVel; 
    } else if (self.vy > maxVel){ 
     self.vy = maxVel; 
    } else if (self.vy < minVel){ 
     self.vy = minVel; 
    } else { 
     self.vx += accelx; 
     self.vy += accely; 
    } 

    self.position = ccp(self.position.x+(self.vx*time), self.position.y+(self.vy *time)); 

    // bounce of the edges 

    if (self.position.x > screenSize.width-offset) { 
     self.vx *=-1; 
     accelx *=-1; 
     self.position = ccp(screenSize.width-offset, self.position.y); 
    } else if (self.position.x < offset) { 
     self.vx *=-1; 
     accelx *=-1; 
     self.position = ccp(offset, self.position.y); 
    } else if (self.position.y < offset) { 
     self.vy *=-1; 
     accely *=-1; 
     self.position = ccp(self.position.x,offset); 
    } else if (self.position.y > screenSize.height-offset) { 
     self.vy *=-1; 
     accely *=-1;  
     self.position = ccp(self.position.x, screenSize.height-offset); 
    } 
} 
在我的主類

我有這些球,它隨機走動的陣列,並且我使用下面的代碼將它們檢測到碰撞時

- (void) detectCollision { 

for (int i=0;i<[circlesP1 count];i++){ 
    for (int j=i+1;j<[circlesP1 count];j++){ 
     if(ccpDistance([[circlesP1 objectAtIndex:i]position],[[circlesP1 objectAtIndex:j]position])<80) { 

      P1Circle *circle1 = [circlesP1 objectAtIndex:i]; 
      [circle1 reverseDirection]; 
      P1Circle *circle2 = [circlesP1 objectAtIndex:j]; 
      [circle2 reverseDirection]; 
     } 
    } 
} 

}

之間檢測衝突以下方法在我的球類中執行

- (void) reverseDirection { 
    self.vx *=-1; 
    accelx *=-1; 
    self.vy *=-1; 
    accely *=-1; 
} 

這個工程.... bu它看起來相當笨拙(代碼和視覺結果)。 我知道要有更逼真的碰撞,我必須計算反射向量。 我找到了它的公式。但我不知道如何將它應用到我的球類中。 任何幫助改善和開發此代碼將不勝感激。

回答

0

有些想法適合你。以減少CPU負載。

而不是計算你的距離,這可能會花費很多CPU的。你可以只測試一個簡單的價值

靜態內聯BOOL isClose(A,B)返回{回報(ABS(XA - XB)<小量|| ABS(雅安 - 鐿)<小量);}

另一個改進可能是:

如果isFar(a,b)刷新10個循環的時間距離。我想沒有必要告訴你如何實現isFar。 然後,您需要一個數組來存儲一種計數器,以瞭解何時刷新距離。在每一次的時間你減少所有的計數器。 如果是關閉計數器= 1(刷新下一步) 如果是遠計數器= 10