Box2d の世界では高速で移動する物体がトンネル効果を起こし、互いにすり抜けてしまうことがわかっています。解決策は、ボディを弾丸として定義することです。私はそれを行いましたが、特にエンカウンターポイントが正確に中央に向いておらず、交差中に体が部分的に重なっている場合は特に、体が互いに交差することがあります。解決策はありますか?
これは私がすべての体を作る方法です:
redBall = [CCSprite spriteWithFile:@"red-ball" rect:CGRectMake(0, 0, 34, 34)];
redBall.tag = 1;
[self addChild:redBall];
ballBodyDef.type = b2_dynamicBody;
ballBodyDef.position.Set((winSize.width/2)/PTM_RATIO, redBall.position.y/PTM_RATIO);
ballBodyDef.userData = redBall;
ballBodyDef.bullet = true;
_ballBody = _world->CreateBody(&ballBodyDef);
// Create circle shape
b2CircleShape circle;
circle.m_radius = 17.0/PTM_RATIO;
// Create shape definition and add to body
b2FixtureDef ballShapeDef;
ballShapeDef.shape = &circle;
ballShapeDef.density = 0.2f;
ballShapeDef.friction = 0.0f;
ballShapeDef.restitution = 1.0f;
_ballFixture = _ballBody->CreateFixture(&ballShapeDef);
TouchesEnd でこのボールを次のように動かしています。
- (void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *myTouch = [touches anyObject];
CGPoint location = [myTouch locationInView:[myTouch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
CGPoint shootVector = ccpSub(location, striker.position);
CGFloat shootAngle = ccpToAngle(shootVector);
CGPoint normalizeShootVector = ccpNormalize(shootVector);
float x1 = - cos(shootAngle);
float y1 = - sin(shootAngle);
int power = 0;
float dist =ccpDistance(location, redBall.position);
if (dist >= 200)
power = 20;
else if (dist >= 100)
power = 10;
else if (dist >=75)
power = 7;
else if (dist >= 60)
power = 4;
else if (dist >= 50)
power = 3;
else if (dist >= 35)
power = 2;
else
power = 1;
b2Vec2 force = b2Vec2(x1*power, y1*power);
_ballBody->ApplyLinearImpulse(force,ballBodyDef.position);
}
それは単にボールからのタッチポイントの距離を計算し、距離に応じてボールに適用する力を見つけ、ボールをタッチした方向に動かすことです. そして、このボールは、邪魔になる他のボールと衝突します。