Box2D和SneakyInput碰撞检测

时间:2013-03-28 09:29:14

标签: box2d collision-detection joystick

我正在制作一个游戏,其中有一个球,并且有一些矩形,因为它们是桌子。

嗯,它正在使用Box2d,所以我可以使用我的SneakyInput操纵杆自由移动球,这是我的问题:

我有一个“桌子”和我的球,用LevelHelper和SpriteHelper制作。一切似乎在这里正常工作。我的球是动态的,我的桌子是运动学的(也用静电试过)。我的世界没有引力。

好吧,当我移动球时,它与桌子相撞一秒钟,并且在那一秒钟内无法通过它。在那之后,确实如此。

我尝试使用Cocos2D HelloWorld文件附带的盒子,我的球也一样,与它们碰撞一秒钟左右,然后我可以通过它们,它不会再次碰撞。

你有什么想法吗?

这里有一些代码:

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


        self.isTouchEnabled = YES;



        // init physics

       b2Vec2 gravity = b2Vec2(0,0);
        world = new b2World(gravity);

        //load from level

       loader = [[LevelHelperLoader alloc] initWithContentOfFile:@"Level1"];

       [loader addObjectsToWorld:world cocos2dLayer:self];

        [self schedule: @selector(tick:) interval:1.0f/60.0f];



        [self draw];


        [self initJoystick];



     //This load some example sprites for collisions

        // Use batch node. Faster
        CCSpriteBatchNode *parent = [CCSpriteBatchNode batchNodeWithFile:@"blocks.png" capacity:100];
        spriteTexture_ = [parent texture];

        // doesn't use batch node. Slower
        spriteTexture_ = [[CCTextureCache sharedTextureCache] addImage:@"blocks.png"];
        CCNode *parent = [CCNode node];

        [self addChild:parent z:0 tag:kTagParentNode];



        [self scheduleUpdate];







    }
    return self;
}


 -(void) tick: (ccTime) dt{
//scaled velocity for joystick
    CGPoint scaledVelocity = ccpMult(joystick.velocity, 120);

    world->Step(dt, 10, 10);

    for (b2Body* b = world->GetBodyList();b; b=b->GetNext()){
        CCSprite *myActor = (CCSprite*)b->GetUserData();

        if (b->GetUserData() != NULL){


            if (b->GetType() == b2_dynamicBody && myActor == [loader spriteWithUniqueName:@"prota"]){

               b->SetTransform(b2Vec2(b->GetPosition().x+scaledVelocity.x*dt/PTM_RATIO,b->GetPosition().y+scaledVelocity.y*dt/PTM_RATIO), 0);

                //move sprite to body position
                myActor.position = ccp(b->GetPosition().x * PTM_RATIO,
                                    b->GetPosition().y * PTM_RATIO);



            }







        }
    }

}

提前致谢!

1 个答案:

答案 0 :(得分:0)

问题在于手动设置身体的变形。 仅使用:

设置速度
b->SetVelocity(b2Vec2(scaledVelocity.x*dt/PTM_RATIO, scaledVelocity.y*dt/PTM_RATIO));

世界步法通过使用每个物体的物理属性(它们之间的速度)来计算每个物体的目的地,我相信手动设置位置会干扰这些计算