2013-04-23 216 views
0

我目前正在製作一個基本粒子系統,也使用Allegro 5庫。C++粒子系統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

輝煌。我實際上實現了這一點,但沒有完全知道如何做到這一點大聲笑,謝謝你,也可以只是給我一個真正發生了什麼?我有點知道,但要充分理解id欣賞它:D – user2312034 2013-04-24 23:47:08

+0

由於您的計時器設置爲1/60運行,您將每秒獲得60個ALLEGRO_TIMER_EVENTS。由於包含您的粒子創建的代碼塊在該檢查中,因此每秒最多可以獲得60個粒子。通過使用速度更快的計時器,您可以生成更多的粒子,如第二種解決方案所示。第一種解決方案將通過產生每秒60個可變速率的粒子來做同樣的事情。看一看http://fixbyproximity.com/2d-game-development-course/(第4部分),以獲得Allegro內部時間的高級概述。 – 131nary 2013-04-25 11:05:35