2016-11-11 61 views
1

播放器(盒)停止所以我有一個播放器(Box2D的框),可以水平與「A」,用「d」被移動:的Box2D如何從旋轉

SetLinearVelocity(b2Vec2(speed, object.getB2Object()->GetLinearVelocity().y)); 

但是,當我移動的方塊玩家不滑動,但是角色的角落,像這樣:

enter image description here

我想通了,降低了框的摩擦和地面防止這在一定程度上,但仍然發生相當regulary也使得播放器停止時進一步滑動。我已經嘗試過SetFixedRotation(true)函數,但是這似乎使玩家停下來一起移動,大概在它要旋轉的地方。我也試過SetAngularVelocity(0),但是這仍然使得盒子旋轉,儘管非常緩慢。在表面移動時,是否有另一種方法來防止玩家旋轉?由於

[編輯]

做設定的摩擦幾乎爲零旋轉框提示什麼pingul後。它看起來好像每隔一段時間都在絆倒某些東西,而不是爲地板上的10個單獨的瓷磚,我將它們移除並創建了一個寬的瓷磚,問題停止了!因此,我認爲這個盒子正沿着下一個瓷磚絆倒。然後我的下一個問題是,爲什麼會這樣,因爲我知道瓷磚都具有相同的高度,寬度和位置如下所示:

//the number of tiles 
const unsigned int MAX_TILES = 10; 
for(int i = 0; i < MAX_TILES; i++){ 
           //position      ,size   ,density ,linear_damping ,friction ,isdynamic,b2World          
    tiles.push_back(new GameObject(vec3(6+i-(MAX_TILES/2), -10, 1), vec3(1, 1, 0), 1.0f ,1.0f   ,0.5f  ,false ,world_b2)); 
    tiles[tiles.size()-1]->Init(); //Some OpenGL stuff for rendering 
    tiles[tiles.size()-1]->getMesh()->setTexture(test_sheet.getTexture(2,0)); //gets a texture from sprite sheet class 
} 

[編輯2]

數學庫使用:GLM

在水平方向重疊瓷磚什麼都不做,但我認爲它與此有關,但在垂直軸上。當玩家轉到另一個圖塊時,旋轉或不旋轉,y值會稍微變化。這可以是向上或向下,只能改變+ -0.003〜。當跳躍時,當遊戲在任何地板磚上開始時,它將回到第一個值。

+0

那麼如果你把摩擦力設置爲0會發生什麼? – pingul

+0

請檢查我的編輯:) – MajesticHey

回答

0

我不知道你使用的是什麼樣的矢量庫,但我會假設vec3將浮點數或雙精度作爲參數。將vec3(6+i-(MAX_TILES/2)轉換爲浮點數可能會導致對象之間的小差距。

對象可以重疊少量嗎?如果將size更改爲vec3(1.0001, 1, 0),會發生什麼情況?

+0

感謝您的耐心等待。添加了編輯2 – MajesticHey

+0

@MajesticHey嗯...你的瓷磚代碼不應該爲這種差異負責。如果繪製不同對象的邊界框而不是位圖,會發生什麼情況?例如。使物體有一些非常明顯的顏色,並繪製出來。另外,你能否展示移動角色的代碼? – pingul

+0

@MajesticHey你找到了解決這個問題的方法嗎? – pingul