Вычисление координат для спрайта в C ++ - PullRequest
1 голос
/ 16 октября 2010

Я пытаюсь вычислить угол движения для спрайта в C ++.

Хотя сейчас я просто использую консоль для вывода своих результатов.

Моя проблема в том, что когда мои результаты отображаются в консоли, я не могу заставить ось х перейти в минус числа.

К сожалению, я только что узнал об основах триггера, поэтому понятия не имею, правильно ли я делаю математику.

Например: если я выберу угол, равный 270, и скорость, равную 1, консоль отобразит новые координаты как (1, -1), когда я думала, что это должно быть (-1,0)

Точно так же, если я попробую свой угол как -90 и свою скорость как 1, я получу (0, -1)

Разве х не может войти в минус числа?

Или я совершаю фундаментальную ошибку?

Мой код приведен ниже - поэтому, если кто-нибудь и укажет, что я делаю неправильно, это будет с благодарностью.

#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;
}

Ответы [ 2 ]

3 голосов
/ 16 октября 2010

Измените на:

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

И прочитайте это (или любое другое руководство, которое вам нравится), чтобы понять, почему.

1 голос
/ 16 октября 2010

Для начала ответ, который вы должны ожидать, это (0, -1), а не (-1,0) (0 - вправо, 90 - вверх, 180 - слева, 270 - вниз).Причина, по которой вы получаете (1, -1), заключается в том, что ограничения с плавающей точкой означают, что ваши результаты cos и sin равны (1e-8, -1).Затем вы берете ceil из них, которые (1, -1).Вы, вероятно, хотите округлить, а не взять потолок.

...