2010-04-30 8 views
5

Donc, je travaille sur l'enseignement moi-même Canvas (HTML5) et j'ai codé la plupart d'un moteur de jeu simple. C'est une représentation 2D d'une scène spatiale (planètes, étoiles, corps célestes, etc.). Ma classe "Sprite" par défaut a un écouteur de trame comme celui-ci:phsyics Javascript dans un espace 2d

"baseClass" contient une fonction qui permet l'héritage et applique "a" à "this.a". Donc, "var aTest = new Sprite ({foo: 'bar'});" ferait "aTest.foo = 'bar'". C'est comme ça que j'expose mes objets les uns aux autres.

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

    } 
}); 

Merci d'avance. Le vrai truc est cette ligne, et btw je sais que cela n'a aucun sens. Degrés + distance = échec.

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

Ceci est plus une question de physique que Javascript, mais j'ai cherché et cherché et lire façon de nombreux articles wiki sur les mathématiques orbitales. Il passe par-dessus ma tête très rapidement.

+2

quelle est la question? Je sais que c'est dans le code. mais vous devriez l'indiquer explicitement ailleurs. –

+0

J'ai un objet avec une vitesse fixe, pointant à 0 degré. Il est sous l'influence gravitationnelle d'un autre corps, par exemple, exactement 100 unités à 90 degrés. Comment ai-je) calculer le vecteur vers ledit corps, et b) trouver la somme (ou la moyenne?) D'un nombre quelconque de vecteurs différents vers des objets différents. – user330123

+0

Finalement, j'ai pu créer une étoile et une planète, et avec une vitesse et un angle de départ très soigneusement choisis, je pouvais créer une orbite de travail (cyclique). Si cela est fait correctement, les objets "non-gravitaires" seraient simples à fabriquer (donc, des comètes et des vaisseaux spatiaux minuscules), et ils pourraient avoir une poussée et tomber dans des "champs de gravité". – user330123

Répondre

3

Oh, ça me prend dans la mémoire, jouer avec la simulation physique est tellement amusant. En tout cas, il semble que vous ayez besoin de polir vos maths vectoriels, c'est probablement la question la plus importante, cet article devrait contenir tout ce que vous devez savoir sur les mathématiques vectorielles, même si je ne suis pas sûr que ce soit est la source la plus facile disponible. Votre code semble un peu trop orienté objet, bien sûr c'est beaucoup plus une question de préférence, mais je m'en tiens à des objets de données purs et de garder la logique dans des fonctions distinctes.

Et voici un peu de maths de physique pour vous aider à démarrer, chaque objet doit avoir une position en tant que vecteur, une vitesse en tant que vecteur et masse.

Pour tous les tics que vous faites deux choses, pour chaque objet que vous ajoutez la vitesse à la position:

p=p+v 

Et pour chaque objet par rapport à tous les autres objets que vous changez la vitesse en fonction de l'attraction gravitationnelle calculée . la vitesse de B changerait comme si d'un puits de gravité:

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

Une fois que vous avez craqué maths vecteur vous devriez être en mesure de traduire en code réel.

+0

Je ne comprends pas vraiment comment construire un vecteur en javascript, même si je vois qu'il y a quelques librairies. Donc un vecteur de position et de vitesse ... Où va la valeur dans la matrice? [posX, posY, vitesse]? J'ai lu cette page wiki, et je regarde le calcul vectoriel en Javascript, mais j'ai une sorte de déconnexion sur la façon de représenter la vitesse en utilisant un vecteur. Merci un tas btw ... Je vais essayer de décoder votre poste pendant un certain temps, je pense: D – user330123

+0

Ok, je pense que je comprends maintenant. Qu'est-ce que A.m? La masse d'A? Ce n'est pas une quantité de vecteur, n'est-ce pas? Si non, comment puis-je ajouter un vecteur à un nombre normal (ou est-ce une question bête) – user330123

+0

Aussi, comment faites-vous la division vectorielle? – user330123