0

あるオブジェクトを別のオブジェクトの上に移動させたいのですが、それらが衝突したときに跳ね返ることはありません。

Simple では、1 つのボール (体) と 1 つの長方形の線の画像 (体) があり、画像は 45 度傾斜しています。

トップスピードからのボール落下は、坂道イメージ(スタティックボディ)にボールが接触すると常に跳ね返り、走り続けます。

ボールがライン イメージを超えると、バウンドせず、衝突に応じて速度が遅くなり、最終的にボールが停止します。実世界でボールが何かに衝突したときと同じように、ボールの速度が遅くなり、衝突に応じて回転し、衝突の速度が低下するために停止します。

私はこれをやっていますが、私が望む結果を達成することはできません。

 -(id) init
{
if( (self=[super init])) {

    CGSize winSize = [CCDirector sharedDirector].winSize;
    // Create a world
    b2Vec2 gravity = b2Vec2(0.0f, 0.0f);
    _world = new b2World(gravity);


    /////////////////////////   Ball ///////////////////////////////

    // Create sprite and add it to the layer
    CCSprite *ball = [CCSprite spriteWithFile:@"ball.png"];
    ball.position = ccp(100, 200);
    ball.tag = 1;
    [self addChild:ball];

    // Create ball body
    b2BodyDef ballBodyDef;
    ballBodyDef.type = b2_dynamicBody;
    ballBodyDef.position.Set(127/PTM_RATIO, 210/PTM_RATIO);
    ballBodyDef.userData = ball;
    ballBody = _world->CreateBody(&ballBodyDef);       // b2Body * ballBody

    // Create circle shape
    b2CircleShape circle;
    circle.m_radius = 26.0/PTM_RATIO;

    // Create shape definition and add to body
    b2FixtureDef ballShapeDef;
    ballShapeDef.shape = &circle;
    ballShapeDef.density = 15.0f;
    ballShapeDef.friction = 2.f;
    ballShapeDef.restitution = 0.0f;
    _ballFixture = ballBody->CreateFixture(&ballShapeDef);




    b2Vec2 force = b2Vec2(73, -52);
    ballBody->ApplyLinearImpulse(force, ballBodyDef.position);

    //ballBody->SetLinearVelocity(b2Vec2(10,0));   // try
   // ballBody->SetAngularVelocity(0);            //  try


    /////////////////////////   Ball ///////////////////////////////







    // Create paddle and add it to the layer
    CCSprite *paddle = [CCSprite spriteWithFile:@"paddle.png"];
    paddle.position = ccp(winSize.width/2, 50);
    [self addChild:paddle];

    // Create paddle body
    b2BodyDef paddleBodyDef;
    paddleBodyDef.type = b2_staticBody;         //b2_staticBody, b2_dynamicBody
    paddleBodyDef.position.Set(winSize.width/2/PTM_RATIO, 50/PTM_RATIO);
    paddleBodyDef.userData = paddle;
    paddleBodyDef.angle = 75;
    _paddleBody = _world->CreateBody(&paddleBodyDef);

    // Create paddle shape
    b2PolygonShape paddleShape;
    paddleShape.SetAsBox(paddle.contentSize.width/PTM_RATIO/2, paddle.contentSize.height/PTM_RATIO/2);

    // Create shape definition and add to body
    b2FixtureDef paddleShapeDef;
    paddleShapeDef.shape = &paddleShape;
    paddleShapeDef.density = 25.0f;
    paddleShapeDef.friction = 1.1f;
    paddleShapeDef.restitution = 0.1f;
    _paddleFixture = _paddleBody->CreateFixture(&paddleShapeDef);






    // Restrict paddle along the x axis
    b2PrismaticJointDef jointDef;
    b2Vec2 worldAxis(0.0f, 0.0f);
    jointDef.collideConnected = true;
    jointDef.Initialize(_paddleBody, _groundBody, _paddleBody->GetWorldCenter(), worldAxis);
    _world->CreateJoint(&jointDef);


    [self schedule:@selector(tick:)];
    self.touchEnabled = YES;
}



- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

if (_mouseJoint != NULL) return;

UITouch *myTouch = [touches anyObject];
CGPoint location = [myTouch locationInView:[myTouch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO);

if (_paddleFixture->TestPoint(locationWorld)) {

    b2MouseJointDef md;

    md.bodyA = _groundBody;
    md.bodyB = _paddleBody;
    md.target = locationWorld;
    md.collideConnected = true;
    md.maxForce = 1000.0f * _paddleBody->GetMass();

    _mouseJoint = (b2MouseJoint *)_world->CreateJoint(&md);
    _paddleBody->SetAwake(true);
}

// [セルフキック];

}

-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

if (_mouseJoint == NULL) return;

UITouch *myTouch = [touches anyObject];
CGPoint location = [myTouch locationInView:[myTouch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO);

_mouseJoint->SetTarget(locationWorld);





}
4

1 に答える 1

0

わかりました、あなたは非常に小さな間違いを犯しました。問題は重力にあります。

に変更します

b2Vec2 gravity = b2Vec2(0.0f, -10.0f);
于 2013-06-27T11:36:04.110 に答える