【问题标题】:Making projectile shoot using with allegro library in C在 C 中使用 allegro 库进行弹丸射击
【发布时间】:2014-12-17 13:50:44
【问题描述】:

我正在尝试使用 C 中的 allegro 库进行弹丸射击。但我绝对做不到。我的所有代码都在下面。我的圈子上升了,但随后消失了。即使没有,我也不能不要把它摔倒在地。我不擅长物理,所以如果我的平等是错误的,请原谅我。

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


            }

【问题讨论】:

  • 我没有allegro,所以无法编译你的程序。但我认为问题可能出在以下几行:tUp = Vy / g;hmax = (Vy*Vy) / (2*g);。因为所有这些变量都是整数,所以你正在做整数除法。因此,如果 Vy
  • 谢谢你,我采纳你的建议。

标签: c allegro


【解决方案1】:

我没有尝试理解你所有的代码,但你的计算似乎是错误的。

以下是重力的实现方式:

首先,您需要使用 Px Py 之类的变量来跟踪您的弹丸位置。该位置将为您提供绘图坐标。 然后你需要用VxVy之类的变量来跟踪它的速度,通常是水平和垂直速度。如果你的初始速度是一个带角度的向量,转换一次。

您的游戏的每一次滴答声(在您的情况下,每次循环迭代),您都会将速度添加到位置。然后添加重力,垂直速度减去 10,同样在每个刻度(它实现 -10 的加速度)。

仅此而已。负速度和加速度是正常的,你不需要检查,但你可以检查位置的边界。另外,您应该注意,您通常将速度和加速度除以滴答声的频率,否则您的循环越快,弹丸移动的速度就越快。

您应该注意,这不是实现重力的最佳方式,因为这只是近似物理(每秒更多的滴答声会给您更准确的模拟)。你应该谷歌“游戏实现重力正确”以获得准确的算法,我不是专家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    相关资源
    最近更新 更多