Javascript phsyics in a 2d space

Posted by eroo on Stack Overflow See other posts from Stack Overflow or by eroo
Published on 2010-04-30T22:39:58Z Indexed on 2010/04/30 22:47 UTC
Read the original article Hit count: 291

Filed under:
|
|

So, I am working on teaching myself Canvas (HTML5) and have most of a simple game engine coded up. It is a 2d representation of a space scene (planets, stars, celestial bodies, etc). My default "Sprite" class has a frame listener like such:

"baseClass" contains a function that allows inheritance and applies "a" to "this.a". So, "var aTest = new Sprite({foo: 'bar'});" would make "aTest.foo = 'bar'". This is how I expose my objects to each other.

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


  // and this is where I need help

  // 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.s.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.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.
    }
});

} });

} Thanks in advance. The real trick is that one line:

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

This is more a physics question than Javascript, but I've searched and searched and read way to many wiki articles on orbital mathematics. It gets over my head very quickly.

Edit: There is a weirdness with the SO formatting; forgives me, I is noobie.

© Stack Overflow or respective owner

Related posts about physics

Related posts about JavaScript