2011-12-24 48 views
5

Tôi đang cố tạo hiệu ứng hình ảnh 2d trong trò chơi XNA 2D của mình, bằng lực hấp dẫn. Tôi đã phát triển một lớp rất cơ bản để đạt được hiệu ứng mô phỏng. Đây là mã mẫu của tôi.Lực hấp dẫn mô phỏng trong XNA

namespace Capture 
{ 
class PhysX 
{ 
    static Vector2 g = new Vector2(0.0f, 10.0f); 
    public Vector2 pos, vel, acc, accumForce; 
    public float mass; 
    public bool USE_GRAVITY = true; 

    /* Constructor */ 
    public void Engage(ref GameTime gameTime, uint maxX, uint maxY) 
    { 

     Vector2 F = Vector2.Zero; 
     if (USE_GRAVITY) 
     { 
      F = accumForce + mass * g; 
     } 

     acc = F/mass;//This is the Net acceleration, Using Newtons 2nd Law 
     vel += acc * gameTime.TotalGameTime.Seconds;// v = u + a*t 
     pos += vel * gameTime.TotalGameTime.Seconds;// s = u*t + 0.5*a*t*t, 
     pos.X %= maxX; 
     pos.Y %= maxY; 

    } 

    public void ApplyForce(ref Vector2 f) 
    { 
     accumForce += f; 
    } 
} 
} 

Tôi đang gọi phương thức PhysX#Engage() theo phương thức Game#Update(GameTime gt). Vấn đề là tôi không nhận được một hình ảnh động trơn tru. Điều này là do vị trí rất sớm. Để khắc phục điều đó, tôi đã cố gắng thực hiện mô đun, như hiển thị trong mã với Viewport.Width, Viewport.Height nhưng vẫn là tọa độ vị trí không hề mượt mà. Tôi nên làm gì. Làm thế nào để làm cho hình ảnh động trơn tru? Hãy giúp tôi.

+0

là gì khối lượng của bạn thiết lập để? khối lượng càng cao thì tốc độ gia tốc càng chậm. –

+0

@SteveH thuật ngữ đại chúng trong lực lượng và phân chia theo khối lượng hủy bỏ. Gia tốc trọng lực không phụ thuộc vào khối lượng. – CodesInChaos

+0

@Anurag Tốc độ của bạn tăng tuyến tính theo thời gian. Thông thường bạn giới thiệu một thuật ngữ làm chậm tốc độ tuyến tính để mô phỏng ma sát và giới hạn vận tốc đầu cuối. – CodesInChaos

Trả lời

3

Tôi nghĩ điều đó xảy ra vì bạn đang dùng giá trị thời gian trôi qua làm số nguyên.

Hãy thử sử dụng giá trị gấp đôi giây mà sẽ đưa vào tài khoản ngay cả phần phân biệt:

flaot dt = (float)GameTime.ElapsedGameTime.TotalSeconds; 
vel += acc * dt;// v = u + a*t 
pos += vel * dt;// s = u*t + 0.5*a*t*t, 

Ngoài ra:

Điều này là do vị trí được rất lớn sớm.

Vâng, bạn nên giữ giá trị nổi gần nhất có thể với phạm vi [-1, + 1], nếu không bạn sẽ bị mất độ chính xác. Lời khuyên của tôi là:

  1. giữ các thuộc tính float của các đối tượng của bạn trong một phạm vi nhỏ ([- 1, + 1])
  2. chuyển đổi giá trị của bạn trước khi rút ra tùy thuộc vào độ phân giải của bạn
+0

cảm ơn, nó cho thấy một số cải tiến nhưng vẫn rất nhanh ... – batman

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