1

我正在创建一个游戏,其中有一个球,还有一些矩形,因为它们是桌子。

嗯,它与 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);



            }







        }
    }

}

提前致谢!

4

1 回答 1

0

问题在于像您一样手动设置身体的转变。仅设置速度:

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

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

于 2013-03-28T13:26:32.897 回答