2010-10-16 32 views
1

J'essaie de calculer l'angle de mouvement d'un sprite en C++.Calcul des coordonnées d'un sprite en C++

Bien que pour le moment j'utilise simplement la console pour sortir mes résultats.

Mon problème est que lorsque Mes résultats sont affichés dans la console, je ne peux pas obtenir l'axe x pour entrer dans les nombres négatifs.

Malheureusement, je viens juste d'apprendre à propos du trig de base, donc je ne sais pas si je ne fais pas mes maths.

Par exemple: Si je choisis mon angle que 270 et ma vitesse 1, la console affiche les nouvelles coordonnées que (1, -1) quand je pensais qu'il devrait être (-1,0)

De même si j'essaye mon angle comme -90 et ma vitesse comme 1 je reçois (0, -1)

Est-ce juste que x ne peut pas entrer dans des nombres négatifs?

Ou est-ce que je fais une erreur fondamentale?

Mon code est ci-dessous - Donc, si quelqu'un pouvait signaler ce que je fais mal, il serait grandement apprécié.

#include <iostream> 
#include <cmath> 

using namespace std; 

const float PI = 3.14159265; 

class sprite { 
    public: 
     int x; 
     int y; 
     int angle; 
     int speed; 
     sprite(); 
}; 

sprite::sprite() { 
    x = 0; 
    y = 0; 
    angle = 0; 
    speed = 0; 
} 

int main() { 
    int userInput = 0; 
    sprite mySprite; 

    cout << "Starting co-ordinates: (" << mySprite.x << "," << mySprite.y << ")\n\n"; 

    while(userInput != 999) { 
     cout << "Angle to move: "; 
     cin >> userInput; 
     mySprite.angle = userInput; 

     cout << "Speed to move at: "; 
     cin >> userInput; 
     mySprite.speed = userInput; 

     mySprite.x += ceil(cos(mySprite.angle*PI/180)*mySprite.speed); 
     mySprite.y += ceil(sin(mySprite.angle*PI/180)*mySprite.speed); 

     cout << "\n\n"; 
     cout << "New co-ordinates: (" << mySprite.x << "," << mySprite.y << ")\n\n"; 
    } 

    return 0; 
} 

Répondre

3

Modification:

mySprite.x += floor(cos(mySprite.angle*PI/180)*mySprite.speed + 0.5); 
    mySprite.y += floor(sin(mySprite.angle*PI/180)*mySprite.speed + 0.5); 

Et lire this (ou tout autre guide que vous voulez) pour comprendre pourquoi.

+0

Merci beaucoup de votre extrait de code et le lien vers le guide Arithmétique à virgule flottante. Étant nouveau à ce que c'était une lecture très utile et intéressante en effet. –

1

Pour commencer, la réponse que vous devriez vous attendre est (0, -1), non (-1,0) (0 est à droite, 90 est en place, 180 est à gauche, 270 est vers le bas). La raison pour laquelle vous obtenez (1, -1) est parce que les limites du point flottant signifient que vos résultats cos et sin sont (1e-8, -1). Vous prenez alors le ceil de ceux-ci, qui sont (1, -1). Vous voulez probablement arrondir plutôt que de prendre le plafond.

+0

Merci pour votre réponse. J'étais sous l'hypothèse que 0 degrés pointait vers le haut, ce qui me permet de clarifier certaines choses. –