2010-04-30 16 views
5

Vì vậy, tôi đang làm việc để tự dạy Canvas (HTML5) và có hầu hết các công cụ trò chơi đơn giản được mã hóa. Nó là một đại diện 2d của một cảnh không gian (các hành tinh, các ngôi sao, các thiên thể, vv). Lớp "Sprite" mặc định của tôi có trình lắng nghe khung như vậy:Javascript phsyics trong không gian 2d

"baseClass" chứa một hàm cho phép kế thừa và áp dụng "a" cho "this.a". Vì vậy, "var aTest = new Sprite ({foo: 'bar'});" sẽ làm cho "aTest.foo = 'bar'". Đây là cách tôi phơi bày đồ vật của mình với nhau.

Sprite = baseClass.extend({ 
    init: function(a){ 
    baseClass.init(this, a); 
    this.fields = new Array(); // list of fields of gravity one is in. Not sure if this is a good idea. 
    this.addFL(function(tick){ // this will change to be independent of framerate soon. 

     // gobjs is an array of all the Sprite objects in the "world". 
     for(i = 0; i < gobjs.length; i++){ 

     // Make sure its got setup correctly, make sure it -wants- gravity, and make sure it's not -this- sprite. 
     if(typeof(gobjs[i].a) != undefined && !gobjs[i].a.ignoreGravity && gobjs[i].id != this.id){ 
      // Check if it's within a certain range (obviously, gravity doesn't work this way... But I plan on having a large "space" area, 
      // And I can't very well have all objects accounted for at all times, can I? 
      if(this.distanceTo(gobjs[i]) < this.a.size*10 && gobjs[i].fields.indexOf(this.id) == -1){ 
      gobjs[i].fields.push(this.id); 
      } 
     } 
     } 
     for(i = 0; i < this.fields.length; i++){ 
     distance = this.distanceTo(gobjs[this.fields[i]]); 

     angletosun = this.angleTo(gobjs[this.fields[i]])*(180/Math.PI); // .angleTo works very well, returning the angle in radians, which I convert to degrees here. 

     // I have no idea what should happen here, although through trial and error (and attempting to read Maths papers on gravity (eeeeek!)), this sort of mimics gravity. 
     // angle is its orientation, currently I assign a constant velocity to one of my objects, and leave the other static (it ignores gravity, but still emits it). 
     // This cant be right, because it just _sets_ the angle regardless of whatever it was. 
     // This is where we need to find "the average of the forces". 
     this.a.angle = angletosun+(75+(distance*-1)/5); //todo: omg learn math 

     if(this.distanceTo(gobjs[this.fields[i]]) > gobjs[this.fields[i]].a.size*10){ 
      this.fields.splice(i); // out of range, stop effecting. 
     } 
     } 
    }); 

    //draw objects based on new position (from fixed velocity and angle). 

    } 
}); 

Xin cảm ơn trước. Bí quyết thực sự là một dòng, và btw tôi biết nó không có ý nghĩa gì cả. Độ + khoảng cách = lỗi.

this.a.angle = angletosun+(75+(distance*-1)/5); 

Đây là thêm một câu hỏi vật lý hơn so với Javascript, nhưng tôi đã tìm kiếm và đã tìm kiếm và đọc cách để nhiều bài viết wiki về toán học quỹ đạo. Nó vượt qua đầu tôi rất nhanh chóng.

+2

câu hỏi là gì? tôi biết nó trong mã. nhưng bạn nên nêu rõ nó ở một nơi khác. –

+0

Tôi có một đối tượng với tốc độ cố định, chỉ 0 độ. Đó là dưới ảnh hưởng hấp dẫn của một cơ thể khác, nói, chính xác 100 đơn vị ở 90 độ. Làm thế nào để tôi a) tính toán vectơ về phía cơ thể nói trên, và b) tìm tổng (hoặc trung bình?) Của bất kỳ số lượng vectơ khác nhau nào đối với các đối tượng khác nhau. – user330123

+0

Cuối cùng tôi có thể tạo ra một ngôi sao và một hành tinh, và với một vận tốc và góc bắt đầu được lựa chọn rất cẩn thận, có thể tạo ra một quỹ đạo hoạt động (chu kỳ). Nếu được thực hiện một cách chính xác, các đối tượng "phi trọng lực phát ra" sẽ đơn giản để tạo ra (do đó, sao chổi và các phi thuyền không gian nhỏ), và có thể có lực đẩy và rơi vào "các trường trọng lực". – user330123

Trả lời

3

Ồ, điều này dẫn tôi xuống làn đường bộ nhớ, chơi với mô phỏng vật lý thật thú vị.

Trong mọi trường hợp, có vẻ như bạn cần phải đánh giá các bài toán vectơ của mình, đó có thể là vấn đề quan trọng nhất, bài viết này nên chứa mọi thứ bạn cần biết về toán học vector, mặc dù tôi không chắc chắn là nguồn có sẵn dễ nhất. http://en.wikipedia.org/wiki/Euclidean_vector

Mã của bạn có vẻ hơi hướng đối tượng hơn, tất nhiên đó là vấn đề ưu tiên, nhưng tôi muốn dính vào các đối tượng dữ liệu thuần túy và giữ logic trong các chức năng riêng biệt.

Và đây là một chút toán học vật lý để giúp bạn bắt đầu, mỗi đối tượng nên có một vị trí như một véc tơ, vận tốc như một vectơ và khối lượng.

Đối với mỗi đánh dấu bạn làm hai điều, đối với mỗi đối tượng bạn thêm vận tốc đến vị trí:

p=p+v 

Và đối với mọi đối tượng liên quan đến tất cả các đối tượng khác với bạn thay đổi tốc độ theo lực hấp dẫn tính . Vận tốc của B sẽ thay đổi như vậy vì trọng lực của A:

B.v=B.v+(A.p-B.p)*(A.m/(|A.p-B.p|^3)) 

Khi bạn đã giải toán vectơ bạn có thể dịch thành mã thực.

+0

Tôi không thực sự hiểu làm thế nào để xây dựng một vector trong javascript, mặc dù tôi thấy có một số thư viện. Vì vậy, vị trí và vận tốc vectơ ... Trường hợp trong ma trận làm mỗi giá trị đi? [posX, posY, speed]? Tôi đã đọc trang wiki đó và tôi đang xem xét phép toán vectơ trong Javascript, nhưng tôi có một số loại ngắt kết nối như cách biểu diễn vận tốc bằng cách sử dụng một vectơ. Cảm ơn một loạt btw ... Tôi sẽ cố gắng giải mã bài đăng của bạn trong một thời gian tôi nghĩ: D – user330123

+0

Ok, tôi nghĩ tôi đã hiểu ngay bây giờ. A.m là gì? A của khối lượng? Đó không phải là số lượng véc tơ phải không? Nếu không, làm thế nào để tôi thêm một véc tơ vào một số bình thường (hoặc đó là một câu hỏi ngớ ngẩn) – user330123

+0

Ngoài ra, làm thế nào để bạn thực hiện phân chia vector? – user330123

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