2013-10-14 45 views
1

我做一些成熟的角色控制,這樣的事情 - >BOX2D platformer 我使用ContactListener接口。 我的問題是(摩擦),這些線路中的鏈接,從代碼 - >在接觸地面時如何改變身體的摩擦?

if(!grounded) { 
    playerPhysicsFixture.setFriction(0f); 
    playerSensorFixture.setFriction(0f);    
} else { 
    if(!Gdx.input.isKeyPressed(Keys.A) && !Gdx.input.isKeyPressed(Keys.D) && stillTime > 0.2) { 
     playerPhysicsFixture.setFriction(100f); 
     playerSensorFixture.setFriction(100f); 
    } 
    else { 
     playerPhysicsFixture.setFriction(0.2f); 
     playerSensorFixture.setFriction(0.2f); 
    } 
} 

我想不出如何改變摩擦時腳已經在與地面接觸。當我改變我角色的onUpdate()方法中的摩擦時,已經啓動的協議的摩擦不會改變。有人可以幫我解決這個問題嗎?

回答

1

從b2Fixture:

// Set the coefficient of friction. This will _not_ change the friction of 
// existing contacts. 
void SetFriction(float32 friction); 

那麼你是完全正確的。在Box2D的最新版本中,他們添加了Contact.setFriction()以適應該行爲。我不確定在哪個版本的libGDX中加入了這個版本的Box2D,但至少在libGDX的夜晚,這些新的方法是可用的。

所以設置在Contact摩擦你的ContactListener

+0

感謝的建議,但是當我改變它結束之前不要刷新聯繫。我做錯了什麼? – Shefchenko

+2

@Shaq我其實從來沒有必要這樣使用它。我可以在Contact.setFriction的JavaDoc的閱讀是這樣的:「替換缺省摩擦混合物,可以在b2ContactListener :: PreSolve稱之爲該值一直保持到設置或復位。」你在PreSolve中設置了它嗎? – noone

+0

謝謝@noone,你救了我的命。我知道我應該避免這樣的評論,但是,我很興奮,因爲它的工作原理。我將它設置在preSolve()上,但方式錯誤。現在我有布爾變量,我用preSolve()設置摩擦力。 – Shefchenko