Создание снаряда с использованием библиотеки allegro в C

Я пытаюсь сделать выстрел снарядом, используя библиотеку allegro на C. И я никак не мог этого сделать. Весь мой код ниже. Мой круг поднимается, но затем исчезает. Даже если нет, я не могу его принести вниз на землю. Я не силен в физике, поэтому, если мои равные ошибаются, пожалуйста, простите меня.

#include <allegro.h>
#include < math.h >


void StartAlleg(); // my start program function
void EndAlleg();



int main() {
    StartAlleg();

    BITMAP *buffer = create_bitmap(640, 480);

    int   g = 10, Vo = 0 , Vx = 5, Vy = 475, angle= 0;
    double time = 0, tUp = 0,hmax=0; //g is gravity

    show_mouse(screen);
    while (!key[KEY_ESC])
    {
        circle(buffer,  Vx, Vy, 5, makecol(255, 0, 0));

        if (key[KEY_UP]&&angle<360) angle++;
        if (key[KEY_RIGHT]) Vo++;
        if (key[KEY_DOWN] && angle>0) angle--;
        if (key[KEY_LEFT] && Vo>0) Vo--;

        textout_ex(buffer, font, "Player 1 : ", 0, 0, makecol(255, 255, 13), -1);
        textprintf(buffer, font, 0, 25, makecol(255, 255, 13), "Angle = %d  ",angle);
        textprintf(buffer, font, 0, 15, makecol(255, 255, 13), "Speed = %d  ", Vo);




        if (key[KEY_Z]  ){


            Vx = Vo*cos(double(angle));
            Vy = Vo*sin(double(angle));
            if (angle== 180 || angle == 360) Vy = 0;
            if (angle== 90 || angle== 270) Vx = 0;
            if (Vx < 0) Vx *= (-1);
            if (Vy < 0) Vy *= (-1);

            tUp = Vy / g;
            time = tUp * 2;

            hmax = (Vy*Vy) / (2*g);


                }

        textprintf(buffer, font, 0, 35, makecol(255, 255, 13), "tUp Value = %.2f  ", tUp);

        for (int i = 1; i <= time; i++)
        {
            if (i<tUp){ Vx = Vx + g; Vy += g; }

            else{ Vy -= g; Vx = Vx + g; }


        }


            blit(buffer, screen, 0, 0, 0, 0, 640, 480);
            rest(60);
            clear_bitmap(buffer);

    }

    EndAlleg(); // my end program function
    return 0;
}
END_OF_MAIN()



void StartAlleg() {
    int depth, res;
    allegro_init();
    depth = desktop_color_depth();
    if (depth == 0) depth = 32;
    set_color_depth(depth);
    res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
    if (res != 0) {
        allegro_message(allegro_error);
        exit(-1);
    }
    install_timer();
    install_keyboard();
    install_mouse();
    install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, "A");
}
void EndAlleg() {
    clear_keybuf();

}

Я думаю, основная проблема здесь:

 for (int i = 1; i <= time; i++)
            {
                if (i<tUp){ Vx = Vx + g; Vy += g; }

                else{ Vy -= g; Vx = Vx + g; }


            }

person Musti    schedule 17.12.2014    source источник
comment
У меня нет аллегро, поэтому я не могу скомпилировать вашу программу. Но думаю проблема может быть в этих строках: tUp = Vy / g; и hmax = (Vy*Vy) / (2*g);. Поскольку все эти переменные являются целыми числами, вы выполняете целочисленное деление. Таким образом, если Vy‹g, то Vy/g=0 в целочисленном делении. Я бы сделал Vy, VX двойными, а не целыми.   -  person TheBigH    schedule 17.12.2014
comment
Спасибо, воспользуюсь вашим советом.   -  person Musti    schedule 17.12.2014


Ответы (1)


Я не пытался понять весь ваш код, но кажется, что ваши расчеты неверны.

Вот как можно реализовать гравитацию:

Во-первых, вам нужно отслеживать положение вашего снаряда с помощью таких переменных, как Px Py. Эта позиция даст вам координаты чертежа. Затем вам нужно отслеживать его скорость, обычно горизонтальную и вертикальную скорость, с такими переменными, как Vx Vy. Если ваша начальная скорость представляет собой один вектор с углом, преобразуйте его один раз.

Каждый тик вашей игры (каждую итерацию цикла в вашем случае) вы добавляете скорости к позициям. Затем, чтобы добавить гравитацию, вы вычитаете 10 из вертикальной скорости, также на каждом такте (это реализует ускорение -10).

И это все. Отрицательные скорости и ускорения - это нормально, проверять не нужно, но можно проверить границы для позиций. Кроме того, вы должны отметить, что вы обычно делите скорость и ускорение на частоту ваших тиков, иначе чем быстрее ваш цикл, тем быстрее будет двигаться снаряд.

Вы должны заметить, что это не лучший способ реализовать гравитацию, потому что это только приблизительная физика (чем больше тиков в секунду, тем точнее будет симуляция). Вы должны погуглить "игра правильно реализует гравитацию" для точного алгоритма, я не эксперт.

person ElderBug    schedule 17.12.2014