我正在尝试构建一个超级简单的物理引擎,作为一种培训形式,并至少了解创建游戏物理的基础知识。我知道 box2d 和花栗鼠之类的东西提供了更多的可能性。但这不是我现在想要实现的。我想把我的简单代码提升到一个新的水平,并尝试有更现实的行为。我正在尝试遵循这个通用教程http://www.wildbunny.co.uk/blog/2011/04/06/physics-engines-for-dummies/但语法让我感到困惑,我不完全确定如何应用一些东西。
现在我有一个简单的球类,它是从 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;
}
这可行....但它看起来相当笨拙(代码和视觉结果)。我知道要进行更逼真的碰撞,我必须计算反射向量。我找到了它的公式。但我不知道如何将它应用到我的球类中。任何有助于改进和开发此代码的帮助将不胜感激。