2010-02-12 3 views
1

J'essaie de faire un jeu où les balles peuvent voler dans n'importe quelle direction. Je voudrais en faire des vecteurs avec une direction et une grandeur pour les faire aller dans la direction. Je ne suis pas sûr de savoir comment mettre en œuvre cela?Aide aux vecteurs

Merci

+0

Voulez-vous générer des directions et des vecteurs aléatoires? –

+0

Je veux passer l'angle et la magnitude en tant que paramètres, essentiellement des balles qui peuvent aller dans n'importe quelle direction – jmasterx

+0

si c'est une balle que vous ne voulez pas une magnitude. Vous avez besoin de sa position, une direction, la vitesse et un pas de temps (temps écoulé depuis la dernière mise à jour) – Craig

Répondre

1

Il y a deux parties qui doivent être calculées. Premièrement, je commencerais par la distance totale. Cela devrait être simple:

total_distance = velocity * time 

En supposant qu'il est un jeu en 2D, vous devez alors utiliser cosinus & sinus pour briser la distance totale vers le haut dans les X et les composants Y (pour un angle donné):

distance_y = total_distance * sin(2 * pi * angle/360) 
distance_x = total_distance * cos(2 * pi * angle/360) 

Enfin, la distance x/y devrait être compensé en fonction de la position de départ de la balle:

pos_x = distance_x + start_pos_x 
pos_y = distance_y + start_pos_y 

Bien sûr, vous pouvez envelopper tout cela dans une classe agréable, l'expansion & polissage au besoin.

+0

Résolu mon problème merci – jmasterx

+0

cela fonctionne, mais pas la meilleure solution. N'incluait pas non plus la magnitude ou la direction. imo original affiche a besoin d'apprendre des mathématiques vectorielles. – Craig

+1

Mes équations d'exemple incluent en effet à la fois la magnitude (vitesse) et la direction (angle). De plus, d'après ses commentaires, il avait du mal à décomposer un vecteur en ses composants X/Y, alors j'ai essayé de donner un exemple simple de la façon de le faire. –

1

Vous pourriez avoir une classe de balle qui contient une position, vecteur de direction et une vitesse. À chaque pas de temps, vous pouvez mettre à jour la position de la balle comme suit:

position += direction * veclocity; 

Ceci suppose que la direction était un vecteur unitaire.

+0

Je ne sais pas comment cela se traduit par les coordonnées X et Y? – jmasterx

+0

ne pas oublier de diviser la vitesse par un pas de temps, sinon vous aurez des objets fous rapides. – Craig

+0

Mais quelle est la «position» comment puis-je transformer cela en une coordonnée x, y? – jmasterx

1

Je créerais commencer par quelque chose comme ceci:

struct Vector3f { 
    float x, y, z; 
}; 

struct Bullet { 
    Vector3f position; 
    Vector3f velocity; 
}; 

inline const Vector3f& Vector3f::operator+=(const Vector &other) 
{ 
    x += other.x; 
    y += other.y; 
    z += other.z; 
    return *this; 
} 

inline const Vector3f& Vector3f::operator*=(float v) 
{ 
    x *= v; 
    y *= v; 
    z *= v; 
    return *this; 
} 

Vous pouvez mettre à jour votre position Bullet avec bullet.position += velocity (addition vectorielle est effectuée en ajoutant les composants séparément). Notez que le vecteur de vitesse contient à la fois la direction et la vitesse (= amplitude du vecteur).

Et si votre puce devrait devenir plus lente à chaque trame, vous pouvez faire quelque chose comme bullet.velocity *= 0.98 (où 0,98 représente la fraction). multiplication vectorielle avec un scalaire se fait en multipliant chaque composant avec le scalaire ...

Cordialement, Christoph

+0

Merci! DirectX tout est logique maintenant! Je ne suis pas sûr de savoir comment faire l'angle, disons si je veux qu'il voyage à 50 degrés – jmasterx

+0

Vector3f (0, 1, 0) signifierait que vous voyagez tout droit (en supposant que l'axe y pointe vers le haut) et Vector (1, 0, 0) pourrait signifier que vous voyagez à gauche. Si vous voulez voyager à 50 °, vous pouvez écrire Vector (cos (50), sin (50), 0). – tux21b

0

cette toute utilisation?

http://www.cs.cmu.edu/~ajw/doc/svl.html

google est un merveilleux outil

+0

Je pense que pour quelque chose d'aussi simple que le calcul vectoriel et matriciel, il vaudrait la peine d'apprendre à faire les maths. S'il veut entrer dans les jeux, il aura besoin de connaître les équations et leur but pour résoudre les problèmes plus loin sur la piste. Comme sachant comment le produit de point et les produits croisés fonctionnent pour résoudre S.A.T – Craig