0

私は現在、Allegro 5 ライブラリを使用して、基本的なパーティクル システムを作成しています。

これが私が思いついたものです:

int main()
{

    int mouseX = 0, mouseY = 0;
    int randNum = 0;


    std::vector <Particle *> Particles;
    bool running = false, redraw =  false, mouseHold = false;
    int particleCount = 0;

    al_init();
    al_init_image_addon();
    al_install_mouse();
    al_init_font_addon();
    al_init_ttf_addon();

    ALLEGRO_DISPLAY* display = al_create_display(800, 600);
    ALLEGRO_EVENT_QUEUE* event_queue = al_create_event_queue();
    ALLEGRO_TIMER* myTimer = al_create_timer(1.0 / 60);
    ALLEGRO_TIMER* pTimer = al_create_timer(1.0 / 120);
    ALLEGRO_FONT* myFont = al_load_ttf_font("MyFont.ttf", 20, NULL);

    al_register_event_source(event_queue, al_get_display_event_source(display));
    al_register_event_source(event_queue, al_get_timer_event_source(myTimer));
    al_register_event_source(event_queue, al_get_timer_event_source(pTimer));
    al_register_event_source(event_queue, al_get_mouse_event_source());

    running = true;
    al_start_timer(myTimer);
    while(running)
    {
        ALLEGRO_EVENT ev;
        al_wait_for_event(event_queue, &ev);

        if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
            running = false;

        if(ev.type == ALLEGRO_EVENT_MOUSE_AXES)
        {
            mouseX = ev.mouse.x;
            mouseY = ev.mouse.y;
        }

        if(ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN)
        {
            if(ev.mouse.button == 1)
                mouseHold = true;
        }

        if(ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_UP)
        {
            if(ev.mouse.button == 1)
                mouseHold = false;
        }

        if(ev.type == ALLEGRO_EVENT_TIMER)
        {
            randNum = (std::rand()+1 * ev.timer.count) % 50;
            std::cout << randNum << std::endl;

            if(mouseHold)
            {
                Particle* particle = new Particle(mouseX + randNum, mouseY + randNum);
                Particles.push_back(particle);
            }

            particleCount = Particles.size();
            for(auto i : Particles)
                i->Update();

            redraw = true;
        }

        for(auto iter = Particles.begin(); iter != Particles.end(); )
            {
                if(!(*iter)->GetAlive())
                {
                    delete (*iter);
                    iter = Particles.erase(iter);
                }
                else
                    iter++;
            }

        if(redraw && al_event_queue_is_empty(event_queue))
        {
            for(auto i : Particles)
                i->Draw();

            al_draw_textf(myFont, al_map_rgb(0,200,0), 0, 10, NULL, "Mouse X: %i", mouseX);
            al_draw_textf(myFont, al_map_rgb(0,200,0), 0, 30, NULL, "Mouse Y: %i", mouseY);
            al_draw_textf(myFont, al_map_rgb(0,200,0), 0, 60, NULL, "Particle Count: %i", particleCount);

            al_flip_display();
            al_clear_to_color(al_map_rgb(0,0,0));
            redraw = false;
        } 
    }


    al_destroy_display(display);
    al_destroy_event_queue(event_queue);
    al_destroy_timer(myTimer);
    for(auto i : Particles)
        delete i;
    Particles.clear();

    return 0;
}

はい、コードはかなり悪いです。実際に実装するよりも、C ++の背後にある理論についてよく知っているようですが、学習していると思います。

問題点:

これは非常に悪いので、何度も「新規」と「削除」を呼び出すことはできないと誰かが言いました。

パーティクルの作成はタイマーによって制限されています。作成方法がわからない/わからないので、パーティクル作成の速度を制御できます。

誰かが私のために作成してくれるとは思っていません。理解するのに役立つ何かを読んだり、誰かがコードを投稿して学習したり、考えさせたりすることができれば、非常に役立ちますか?

4

1 に答える 1

0

パーティクルの生成は、実際にはタイマーによって制限されています。タイマー イベントが発生したときにマウス ボタンを押したままにしておくと、1 つのパーティクルを生成するように Allegro に指示しています。タイマー ティックごとに複数のパーティクルを作成することで、パーティクルの作成速度を上げることができます。

    for(int i = 0; i < rate; rate++)
    {
            randNum = (std::rand()+1 * ev.timer.count) % 50;
            std::cout << randNum << std::endl;

            if(mouseHold)
            {
                Particle* particle = new Particle(mouseX + randNum, mouseY + randNum);
                Particles.push_back(particle);
            }
    }

次に、可変レートを使用して、パーティクルを生成する「速度」を制御します。これには、元の X と Y の位置が同じ複数のパーティクルが描画されるという欠点がありますが、randNum も使用しているので問題ありません。

これらのパーティクルの動作に応じて、ニーズにより適した別のオプションは、より速い速度で刻むタイマーを使用してパーティクルを生成することです。ALLEGRO_EVENT_TIMER をチェックしているときは、

if(ev.timer.source == timer)
{
    redraw = true;
}
if (ev.timer.source == fasterTimer)
{
    randNum = (std::rand()+1 * ev.timer.count) % 50;
    std::cout << randNum << std::endl;

    if(mouseHold)
    {
        Particle* particle = new Particle(mouseX + randNum, mouseY + randNum);
        Particles.push_back(particle);
    }
}
于 2013-04-24T17:39:31.787 に答える