2010-04-05 34 views
8

Tôi nghĩ rằng tôi đã cấu hình Box2d để có một số loại tốc độ tối đa cho bất kỳ cơ thể, nhưng tôi không chắc chắn. Tôi áp dụng một xung như (100000000, 100000000), và cơ thể di chuyển nhanh như (100, 100) - mà không phải là nhanh chóng cả.Box2d: Tốc độ tuyến tính tối đa có thể?

Tôi đang sử dụng cổng Box2d XNA C#.

Trò chơi của tôi là từ trên xuống 2ngày.

Dưới đây là một số mã có thể có liên quan:

private readonly Vector2 GRAVITY = new Vector2(0, 0); 

    public void initializePhysics(ContactReporter contactReporter) 
    { 
     world = new World(GRAVITY, true); 
     IContactListener contactListener = contactReporter; 
     world.ContactListener = contactListener; 
    } 

    public void Update(GameTime gameTime) 
     { 
    // ... 

      worldState.PhysicsWorld.Step((float)gameTime.ElapsedGameTime.TotalSeconds, 10, 10); 

    //... 
     } 

Dưới đây là một số mã ví dụ áp dụng các xung:

private void ApplyImpulseFromInput() 
    { 
     Vector2 movementImpulse = new Vector2(); 

     if (inputReader.ControlActivation(ActionInputType.MOVE_LEFT) == 1f) 
     { 
      movementImpulse.X = -Constants.PLAYER_IMPULSE_CONSTANT; 
     } else if (inputReader.ControlActivation(ActionInputType.MOVE_RIGHT) == 1f) 
     { 
      movementImpulse.X = Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } 

     if (inputReader.ControlActivation(ActionInputType.MOVE_UP) == 1f) 
     { 
      movementImpulse.Y = -Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } else if (inputReader.ControlActivation(ActionInputType.MOVE_DOWN) == 1f) 
     { 
      movementImpulse.Y = Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } 

     model.Body.ApplyImpulse(movementImpulse, model.Position); 
    } 

Nếu Constants.PLAYER_IMPULSE_CONSTANT là bất cứ nơi nào từ 1000f để 1000000000f, người chơi có thể di chuyển tối đa (-120, -120) đến (120, 120). Nếu hằng số ít hơn, như 1f, người chơi sẽ di chuyển chậm hơn.

Mã này được sử dụng để thiết lập vật lý cho tất cả mọi thứ trong thế giới game:

 controller.Model.BodyDef = new BodyDef(); 
     controller.Model.BodyDef.type = controller.Model.Mobile ? BodyType.Dynamic : BodyType.Static; 
     controller.Model.Body = worldState.PhysicsWorld.CreateBody(controller.Model.BodyDef); 
     controller.Model.Body.SetLinearDamping(10.0f); 

thể nó có thể là tuyến tính giảm xóc? Tôi đã thay đổi nó từ 10.0f thành 0, không có hiệu lực.

UPDATE: weirdness với giảm xóc tuyến tính: Tôi đã thực hiện những quan sát trên cơ thể đó là di chuyển với áp dụng phương pháp xung trên:

Linear Damping  Max Speed 
0f     120 
10f     120 
50f     120 
55f     90 
60f     0 
70f     0 
100f     0 
100000f    0 

Tại sao lại có một loạt các tính nhạy cảm trong tuyến tính giảm xóc giữa 50f60f?

+0

Mã áp dụng xung có thể hữu ích. –

+0

Xin lỗi. Đã thêm nó. –

+0

+1 để chống lại bất kỳ ai đã bỏ phiếu này. Đây là một câu hỏi hợp pháp. – avpx

Trả lời

3

Tôi có cùng sự cố với phiên bản 2.1a tôi phát hiện ra rằng việc thay đổi dòng 128 trong b2Settings.as có thể hữu ích. Thay đổi công thức tĩnh b2_maxTranslation: Số = 2.0 thành số cao hơn. chắc chắn rằng đây không phải là cách đúng, nhưng ngay bây giờ không thực sự biết làm thế nào để làm điều đó một cách chính xác.

+0

wow. thật kỳ lạ, nhưng nó đã sửa nó. –

+8

Tôi chỉ gặp vấn đề này ngày hôm nay, ngoại trừ tôi đang sử dụng phiên bản C++ của Box2D. Các ý kiến ​​đọc: "Vận tốc tuyến tính tối đa của một cơ thể. Giới hạn này là rất lớn và được sử dụng để ngăn chặn các vấn đề số. Bạn không cần phải điều chỉnh điều này."Mô phỏng của tôi được đặt thành 1 pixel bằng 1 đơn vị Box2D. Tôi đã gặp vấn đề tương tự với vận tốc giới hạn. Âm thanh như Box2D thích bạn giữ mô phỏng ở mức độ nhỏ hơn. – don

+0

Vâng, bạn có thể thực hiện việc này, nhưng không phải là Xem câu trả lời của Robert –

14

Đó không phải là cách khắc phục sự cố đó. Bạn có nghĩa vụ phải quy mô xuống các đối tượng của bạn khi tạo chúng trong thế giới box2D. Sau đó, bạn chỉ có thể mở rộng thông tin mà box2D cung cấp cho bạn trở lại kích thước của thế giới của bạn.

Ví dụ: một hộp trong thế giới của tôi dài 120 pixel. Nếu tôi thu nhỏ đối tượng xuống 30 lần sao cho nó có thể được mô phỏng bởi box2d đúng thì độ dài của hộp của tôi trong thế giới box2D sẽ dài 4 "pixel" (120/30 hoặc kích thước của đối tượng/quy mô của bạn). Bây giờ, hãy nói rằng box2D tính toán rằng hộp của tôi đã di chuyển 3 "pixel" trong thế giới box2d. Sau đó tôi có thể lấy thông tin đó và mở rộng quy mô trở lại kích thước của thế giới của tôi, điều đó có nghĩa là hộp chỉ di chuyển 90 pixel (3 * 30). Tôi hy vọng điều đó không quá khó hiểu. Tôi thường thấy khó giải thích cho bản thân mình.

+0

Tôi đã có cùng một vấn đề, và thu nhỏ kích thước của mô phỏng của tôi những điều cố định –

+5

1. Từ hướng dẫn Box2D: "Box2D được điều chỉnh cho các đơn vị MKS. Giữ kích thước của vật chuyển động khoảng từ 0,1 đến 10 mét. Bạn sẽ cần phải sử dụng một số hệ thống mở rộng quy mô khi bạn kết xuất môi trường và diễn viên của mình. Các test2 Box2D thực hiện điều này bằng cách sử dụng một biến đổi khung nhìn OpenGL. "Sử dụng ví dụ động cơ ví dụ: HelloWorld để tham chiếu các đơn vị của riêng bạn chống lại. –

Các vấn đề liên quan