1

ボールがあり、テーブルのようにいくつかの長方形があるゲームを作成しています。

Box2d で動作しているので、SneakyInput ジョイスティックでボールを自由に動かすことができます。ここに問題があります。

LevelHelper と SpriteHelper で作成した「テーブル」とボールがあります。ここではすべてが適切に機能しているようです。私のボールは動的で、テーブルはキネマティックです (静的でも試してみました)。私の世界には重力はありません。

さて、ボールを動かしていると、一瞬だけテーブルにぶつかり、その瞬間通り抜けることができません。その後、そうです。

Cocos2D HelloWorld ファイルに付属のボックスを試してみましたが、ボールも同じように 1 秒ほど衝突します。

あなたはなにか考えはありますか?

ここにいくつかのコードがあります:

{
-(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 に答える