8.1. Создание анимации с помощью библиотеки xgl
Компьютерная анимация подразумевает вывод в окно программы последовательности картинок, которые и создают эффект движения. Для постоянной перерисовки изображения в экране, в Windows-приложениях используется специальный обработчик событий – таймер. С помощью таймера задается временной цикл, в котором происходит перерисовка открытого окна. Временной цикл длится до тех пор, пока работает программа (открыто окно) или не дана команда на остановку таймера.
Если вы используете XGL, то таймер запускается вызовом функции xglSetTimerFunc.
Таким образом, создается неявный цикл обращения к функции-таймеру. Внутри этой функции будут производиться изменения состояний анимируемого объекта. Визуальное отображение объекта производится, как и раньше, внутри функции Draw.
Аргументами функции xglSetTimerFunc(имяфункции,время); является имя функции и время перерисовки изображения в миллисекундах. Чем меньше время, тем быстрее движется изображение. Перерисовка изображения и изменения координат графических примитивов происходит в функции имяфункции.
Для того, чтобы изменения произведенные в функции OnTimer с объектом стали видны, нужно инициировать перерисовку окна (функция xglRedraw). В результате вызова этой функции операционная система пошлет сообщение нашему окну на обновление, будет вызвана функция Draw и объект отобразится в новом состоянии. Предыдущее содержимое окна стирается функцией xglClear.
Для задания периода используется функция xglSetTimerFunc, параметрами которой является указатель на функцию таймера и интервал в миллисекундах, через которые будет вызываться наша функция OnTimer.
Вызываться функция xglSetTimerFunc должна после того как создано окно для вывода графики (функция xglInitWindow), и перед тем как программа уйдет в цикл обработки сообщений (функция xglMainLoop).
Более понятным анимации станет после разбора примера - движение шарика (кружка) в окне.
#include "XGL.H"
// используем глобальные переменные
double win_width=400,win_height=400;//размеры окна
double x_1,y_1,r=15;//координаты центра и радиус шарика
double vx=1,vy=2;// компоненты вектора скорости шарика
void Draw();
void FTimer(); //таймер с именем Ftimer, но можно любое другое
void main()
{
if(!xglInitWindow(0, 0, win_width, win_height, "Test XGL"))
{
auxQuit(); // выход
}
xglSetTimerFunc(FTimer, 10);// вызов таймера
glClearColor (0.3f,0.5f,0.5f,0.00);// задаем цвет фона окна
xglMainLoop(Draw); // вызов функции рисования
}
void Draw()
{
glColor3f(1.0f,0.0f,0.0f); // задаем цвет окружности
xglDrawCircle(x_1,y_1,r);// рисуем окружность
}
void FTimer()
{
x_1=x_1+vx; // пересчитываем координаты
y_1=y_1+vy;
xglClear();// очистка экрана от предыдущего изображения
xglRedraw(); // Перерисовка изображения
}
В приведенном примере шарик вылетает за пределы окна. Если мы хотим в программе учитывать отражение от стенок, то после пресчета координат x_1 и y_1 следует проверить, не выходят ли значения координат за пределы окна. Например, так:
if(x_1+r>=double(win_width)|| x_1-r<=0.)
vx=-vx;
if(y_1+r>=double(win_height)|| y_1-r<=0)
vy=-vy;
Создайте приложение, запустите на выполнение. Подумайте, как изменить скорость движения шарика.
- Введение
- Глава 1. Основы.
- Int main()
- 1.2. Методика создания программ в Microsoft Visual Studio.
- Void main(){
- 1.3. Ввод-вывод.
- 1.4. Переменные и константы.
- Int I; // объявление целочисленной переменной
- 42 // Десятичная константа
- 0X42 // шестнадцатеричная константа, начинается с 0х
- 042 // Восьмеричная константа, начинается с 0
- 1.5. Арифметические операции.
- Void main()
- 1.6. Встроенные функции. Математические функции. Состав math.H.
- Void main()
- Int rand(void); // функция используется без аргумента
- Глава 2. Операторы и выражения.
- 2.1. Логические выражения и операторы
- 2.1.1. Оператор if else
- If (условие)
- If (условие)
- 2.1.2. Конструкция if else if
- Int number;
- Int number;
- 2.1.3. Условный оператор.
- 2.1.4. Оператор switch.
- Int dvalue;
- 2.2. Операторы цикла.
- 2.2.1. Оператор for
- Void main()
- Int I; // создаем переменную цикла
- Void main()
- Int I; // переменную цикла можно определить и вне цикла
- 2.2.2. Изменение шага цикла
- Void main()
- 2.2.3. Цикл while.
- 2.2.4. Цикл do while
- Void main()
- 2.3. Операторы break и continue
- Void main()
- Void main()
- 2.4. Типичные ошибки при использовании операторов цикла
- Глава 3. Производные типы данных.
- 3.1. Ссылки и указатели.
- Int test; // объявили целочисленную переменную
- Int & s_test; // ошибка! ссылка не связана с переменной
- Int *p1; // объявлен указатель на целое с именем p1
- 3.2. Массивы и строки.
- Int z[10]; //массив из 10 целых чисел
- Int ar[3]; // объявлен целочисленный массив из 3 элементов
- Int varr[4]; // объявление массива
- 3.2.2. Многомерные массивы.
- Int z[3][4]; //массив из 12 целых чисел
- 3.2.3. Строки
- Void main()
- Void main()
- Void main()
- Void main()
- If(strstr(st,st2)) //если подстрока встречается, выводим
- 3.1.5. Динамическое определение одномерных массивов.
- 3.1.6. Динамические двумерные массивы.
- 3.1.7. Указатели, массивы и арифметика указателей.
- Int tacs[3];
- Void main()
- 3.2. Структуры
- Int age; // элементы структуры
- Int hours;
- Int mins;
- Void main()
- Int hours;
- Int mins;
- Void main()
- 4. Функции, определяемые пользователем
- 4.1. Объявление и определение функции
- Int max(int , int ); // в прототипе достаточно указать только тип и
- Void main() {
- Int MyRand(){
- Int func(){ return 1;} // правильное выражение
- Int func2(){return 0.146;} // неправильно, 0.146 преобразуется к int с
- Void swap(int p, int q)
- Int bigger(int a,int b)
- 4.2. Передача параметров функций
- 5. Заголовочные файлы.
- 6. Работа с файлами
- 6.1 Простой файловый ввод/вывод
- 6.2 Тонкости работы с файлами
- 7.1. Определение классов.
- Void main()
- 7.2. Как объявлять функции класса?
- 7.3. Конструкторы и деструкторы классов.
- 8. Графика OpenGl.
- Void callback Draw()
- Void main()
- 8.1. Создание анимации с помощью библиотеки xgl
- Приложения Управление выводом
- Управление шириной вывода