Рассмотрим создание 2-D эффектов на примере фейерверка, который разбрасывает искры из центра экрана. Каждая искра фейерверка должен жить своей жизнью на основе случайных чисел.
Для описания искр понадобится структура следующего вида:
- struct PARTICLEWORD х, у; // Координаты искры
- double angle; // Угол движения
- int adjust; // Изменение угла движения
- int speed; // Скорость движения
- BYTE r, g, b; // Цвет
- int life; // Время жизни искры к затуханию Particle_ent;
Для реализации примера понадобятся две переменные: переменная определяющий количество искр, которые генерируют фейерверк и переменная с массивом искр. Отображение фейерверка будет происходить в основном цикле сообщений, в котором должна вызываться функция рисования сцены. Но к началу цикла нужно еще проинициализировать искры начальными значениями.
Рисование фейерверка происходит через прямой доступ к поверхности. Поскольку придется выводить на экран достаточно много точек, то блокируем поверхность в самом начале, чтобы не делать это на каждом этапе цикла. Так, в этом случае поверхность будет заблокирована достаточно долго, но скорость работы цикла рисования повышается за счет одного блокировки. После блокировки начинается цикл. Сначала увеличиваем угол движения искры на значение adjust. В зависимости от нового угла и скорости движения искры (параметр speed) рассчитываем новое положение. Теперь нужно узнать - вышла точка за пределы экрана. Если так, то выполняем инициализацию точки заново. Если не сделать этого, то точка окажется не там, где очикувалиеться. Дело в том, что при выводе графики через прямой доступ ни о какой автоматическую проверку границ экрана не может быть и речи. Теперь корректируем цвет точки. Он, как и угол движения, корректируется на значение adjust. Теперь все готово, и можно отображать точку на поверхности.