2013-04-23 6 views
0

В настоящее время я создаю систему частиц, базовую, также использующую библиотеку Allegro 5.C++ Particle System 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++, чем ее реализацию.

Проблемы:

Кто-то сказал, что я не мог называть «новыми» и «Удалить» столько раз, сколько это очень плохо.

Создание частицы ограничено таймером - я не могу/не знаю, как это сделать, чтобы я мог контролировать скорость создания частиц.

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

ответ

0

Ваше поколение частиц, как вы его заложили, действительно ограничено вашим таймером. Вы говорите 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); 
    } 
} 
+0

Блестящий. Я на самом деле реализовал это, но не знал, как это сделать, спасибо, также не могли бы вы просто дать мне сбежать от того, что происходит на самом деле? я точно знаю, но чтобы полностью понять, что это так: D – user2312034

+0

Поскольку ваш таймер установлен на 1/60, вы получите 60 ALLEGRO_TIMER_EVENTS каждую секунду. Поскольку блок кода, содержащий ваше создание частиц, находится внутри этой проверки, вы можете получить максимум 60 частиц в секунду. Используя таймер с более высокой скоростью тика, вы можете генерировать больше частиц, как показано во втором решении. Первое решение будет делать то же самое, создавая переменную скорость * 60 частиц в секунду. Взгляните на http://fixbyproximity.com/2d-game-development-course/ (часть 4) для хорошего обзора времени в Allegro. – 131nary

 Смежные вопросы

  • Нет связанных вопросов^_^