2014-11-01 82 views
1

直到最近,我一直在更改每次更新時精靈的x座標,我對此感到滿意。但是昨天在debugDraw模式下,我發現在一定的速度後,物理體不會與精靈正確對齊,如下所示: enter image description here 後來我被告知,(通過在cocos2d論壇中的Birkemose)首選的方式將一個物理體從A移到B就是對它施加衝動。但我不知道如何以這種方式實現恆速。這是我用移動它不應用任何衝動代碼:如何使用動態物理體以恆定速度移動精靈

-(void)update:(CCTime)delta{ 
    rollingHero.position=ccp(rollingHero.position.x+scrollSpeed*delta,  
         rollingHero.position.y); 
    physicsNode.position=ccp(physicsNode.position.x-scrollSpeed*delta, 
         physicsNode.position.y); 
} 

因此,要創造感動我滾動物理節點,並用相同的滾動速度相反的方向英雄的感覺。 我嘗試了許多應用衝動的不同變體,但我從來沒有以恆定的速度移動它。速度加快,英雄脫離屏幕。如果有人發佈示例代碼,我將非常感激。

回答

4

衝動不能使你的角色保持恆定的速度是因爲衝動直接轉化爲動量的變化(因而速度的變化)。所以如果你試圖通過沖動保持恆定的速度,你必須首先檢查你的精靈的速度,儘管你可以接近恆定的速度,但它不會是真正的恆定速度。

static const float kRollingHeroMoveSpeed  = 10.f; 
static const float kRollingHeroAccelConstant = 10.f; 

-(void)update:(CCTime)delta { 

    // check velocity of sprite 
    if(_rollingHero.physicsBody.velocity.x < kRollingHeroMoveSpeed) { 

     // if velocity is under limit, push character 
     [_rollingHero.physicsBody applyImpulse:ccp(kRollingHeroAccelConstant, 0)]; 
    } 
} 

更好的方法是進入Chipmunk2D physics engine that powers Cocos2D physics的C級別。

-(void)onEnter { 
    [super onEnter]; 

    // tell physics engine to use our C function to update physics body 
    _rollingHero.physicsBody.body.body->velocity_func = playerUpdateVelocity; 
} 

static void playerUpdateVelocity(cpBody *body, 
           cpVect gravity, 
           cpFloat damping, 
           cpFloat dt) { 

    // check validity of cpBody 
    cpAssertSoft(body->m > 0.0f && body->i > 0.0f, "Body's mass and moment must be positive to simulate. (Mass: %f Moment: %f)", body->m, body->i); 

    // update velocity and angular velocity 
    body->v = cpvadd(cpvmult(body->v, damping), cpvmult(cpvadd(gravity, cpvmult(body->f, body->m_inv)), dt)); 
    body->w = body->w*damping + body->t*body->i_inv*dt; 

    // reset force vector 
    body->f = cpvzero; 
    // reset torque 
    body->t = 0.0f; 

    // set body's velocity to desired velocity 
    body->v.x = kRollingHeroMoveSpeed; 
} 

Here's cpBody.h on Github

+0

感謝您的完美和詳細的答案 – 2014-11-02 14:40:01