簡體   English   中英

即使我將它們初始化為!awake,Box2D同步的新物體也會在第一步邁出第一步后醒來。

[英]Box2D sync new bodies become awake after first world step even if i init them to !awake

嗨,我在Box2D上玩得很開心。 我正在開發一個網絡游戲,它需要與所有身體完全同步。 (不會有很多屍體)。

因此,計划是我啟動一台帶有某些主體的服務器。 服務器執行世界模擬步驟。 然后過了一會兒客戶端連接。 服務器執行此操作后,會將世界上所有主體的所有狀態數據發送給客戶端,客戶端會將它們創建為NEW主體。 然后,客戶端將在客戶端上獲得完全完全同步的游戲副本。 服務器上的任何小更改都將被復制並作為消息發送給客戶端。 並且由於Box2D是確定性的,因此服務器端的任何更改在客戶端上的行為都將完全相同。

如果所有身體都清醒,這將非常有用。 但是,當我其中之一睡着時,模擬變得不同步。 睡眠物體的位置,角度和速度只有幾位小數。 實際上看起來他們只是需要休息才能搞清楚同步。

因此,我注意到的是,即使我明確地將一個新的身體置於睡眠狀態,在下一世界步驟之后,它也會再次蘇醒。 我猜這是因為Box2D需要對某種新體進行檢查。

有沒有什么辦法解決這一問題? 並保持同步?

如果我的校驗和檢查檢測到不同步,則當前每120幀重新同步所有主體。 並繼續這樣做,直到它們再次異步。 這會引起游戲對象的某些捕捉,但仍然可以令人驚訝地很好地工作,但是id而不是游戲首先不會變得不同步。

服務器將把float和int值發送給客戶端,客戶端將使用以下代碼創建主體。 在服務器端創建主體時,服務器使用幾乎相同的代碼:

//------------create world---------------
b2Vec2 gravity(0.0f, -10.0f);
b2World world(gravity);
world.SetAllowSleeping(true);

//---------------create bodies from values sent by server----------------------
//body def
b2BodyDef bodyDef;

if(bodyType == static_body)
bodyDef.type = b2_staticBody;
else if(bodyType == dynamic_body)
bodyDef.type = b2_dynamicBody;
else
throw "error invalid body def types";

bodyDef.angle = angle;
bodyDef.angularDamping = angularDamping;
bodyDef.angularVelocity = angularVelocity;
bodyDef.gravityScale = gravityScale;

bodyDef.linearDamping = linearDamping;
bodyDef.linearVelocity.x = linearVelocityX;
bodyDef.linearVelocity.y = linearVelocityY;
bodyDef.position.x = positionX;
bodyDef.position.y = positionY;

bodyDef.active = isActive;
bodyDef.awake = isAwake;
bodyDef.bullet = isBullet;
bodyDef.fixedRotation = isFixedRotation;
bodyDef.allowSleep = isSleepingAllowed;

//body
// Call the body factory which allocates memory for the ground body
// from a pool and creates the ground box shape (also from a pool).
// The body is also added to the world.
body = world.CreateBody(&bodyDef);

//fixture def
b2PolygonShape polygonShape;
polygonShape.SetAsBox(shapeWidth, shapeHeight);

b2FixtureDef fixtureDef;
fixtureDef.shape = &polygonShape;
fixtureDef.restitution = 0.5f;  // air resistance / fluid resistance
fixtureDef.density = 1.0f;
fixtureDef.friction = 1.0f;

//fixture
body->CreateFixture(&fixtureDef);

//set mass inertia and center
b2MassData md;
md.center = b2Vec2_zero;
md.I = intertia;
md.mass = mass;
body->SetMassData(&md);

//these cannot be predefined for some reason, seems like a bug in box2d
body->SetFixedRotation(isFixedRotation);

//----------run game simulations-----------
float32 timeStep = 1.0f / 60.0f;
int32 velocityIterations = 6;
int32 positionIterations = 2;

world.Step(timeStep, velocityIterations, positionIterations);

我在box2d論壇中問,如果模擬在不同的時間步長開始,box2d的內部狀態可能會有所不同。 因此唯一的解決方案就是解決它。

http://www.box2d.org/forum/viewtopic.php?f=3&t=8462&p=36115#p36115

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM