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++背後的理論,而不是實際執行它..但我猜是在學習。
的問題:
有人說我不能叫「新」和「刪除」這麼多次,因爲這是非常糟糕的。
粒子的創造受到定時器的限制 - 我無法/不知道如何製作,所以我可以控制粒子創建的速度。
我不期待有人爲我創作,如果我能閱讀某些東西來幫助我理解或有人發佈一些代碼來學習/讓我思考,那麼這將非常有用。
輝煌。我實際上實現了這一點,但沒有完全知道如何做到這一點大聲笑,謝謝你,也可以只是給我一個真正發生了什麼?我有點知道,但要充分理解id欣賞它:D – user2312034 2013-04-24 23:47:08
由於您的計時器設置爲1/60運行,您將每秒獲得60個ALLEGRO_TIMER_EVENTS。由於包含您的粒子創建的代碼塊在該檢查中,因此每秒最多可以獲得60個粒子。通過使用速度更快的計時器,您可以生成更多的粒子,如第二種解決方案所示。第一種解決方案將通過產生每秒60個可變速率的粒子來做同樣的事情。看一看http://fixbyproximity.com/2d-game-development-course/(第4部分),以獲得Allegro內部時間的高級概述。 – 131nary 2013-04-25 11:05:35