В настоящее время я создаю систему частиц, базовую, также использующую библиотеку 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++, чем ее реализацию.
Проблемы:
Кто-то сказал, что я не мог называть «новыми» и «Удалить» столько раз, сколько это очень плохо.
Создание частицы ограничено таймером - я не могу/не знаю, как это сделать, чтобы я мог контролировать скорость создания частиц.
Я не ожидаю, что кто-то создаст для меня, это было бы очень полезно, если бы я мог что-то прочитать, чтобы помочь мне понять, или кто-то опубликовал какой-то код, чтобы узнать или заставить меня думать?
Блестящий. Я на самом деле реализовал это, но не знал, как это сделать, спасибо, также не могли бы вы просто дать мне сбежать от того, что происходит на самом деле? я точно знаю, но чтобы полностью понять, что это так: D – user2312034
Поскольку ваш таймер установлен на 1/60, вы получите 60 ALLEGRO_TIMER_EVENTS каждую секунду. Поскольку блок кода, содержащий ваше создание частиц, находится внутри этой проверки, вы можете получить максимум 60 частиц в секунду. Используя таймер с более высокой скоростью тика, вы можете генерировать больше частиц, как показано во втором решении. Первое решение будет делать то же самое, создавая переменную скорость * 60 частиц в секунду. Взгляните на http://fixbyproximity.com/2d-game-development-course/ (часть 4) для хорошего обзора времени в Allegro. – 131nary