我試圖建立一個超級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它看起來相當笨拙(代碼和視覺結果)。 我知道要有更逼真的碰撞,我必須計算反射向量。 我找到了它的公式。但我不知道如何將它應用到我的球類中。 任何幫助改善和開發此代碼將不勝感激。