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.
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. –
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
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