Главная

Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Создание анимации с помощью библиотеки 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;

 

Создайте приложение, запустите на выполнение. Подумайте, как изменить скорость движения шарика.

Приложения

Управление выводом

Для управления выводом на экран (а также в текстовый файл) при использовании объекта cout применяются управляющие символы: конец строки, табуляция и т.д.В таблице дано описание некоторых из них.

Таблица управляющих символов
Символ Назначение Пример использования Результат
Сигнал динамика cout<<”signal”<<’\a’;// или cout<<”signal\a” Сигнал встроенного динамика при выводе на экран. При выводе в файл отображается символ с порядковым номером 7 в ASCII – таблице.
\b Возврат на один символ назад cout<<”test”<<’\b’; Следующее применение cout «затирает» последний символ слова. Будет выведено tes
\n Переход на новую строку [10] cout<<”test”<<’\n’; // или cout<<”test\n”;  
Возврат каретки (не перевод строки) cout<<”test\r”; Следующее применение cout начнется с первого символа текущей строки, предыдущая информация в строке «затирается»
\t Символ горизонтальной табуляции cout<<”first\t”<<”second”; Дает результат, аналогичный табуляции в текстовых редакторах

 

þ При управлении печатью применяется символ «бэкслэш» - \. Помните, что, например, \n является одним «символом», поэтому в программе они выделяются одинарным апострофом, в отличие от текста, который выделяется двойными апострофами.

Управление шириной вывода

При использовании cout для вывода, можно явно указать ширину вывода каждого числа (каждой переменной), используя модификатор setw (set width). Например:

 

#include <iostream>

#include <iomanip>

using namespace std;

void main()

{

setlocale(LC_ALL,"Russian");

 

cout << "Мое любимое число равно" << setw(3) << 1001 << endl;

cout << "Мое любимое число равно" << setw(4) << 1001 << endl;

cout << "Мое любимое число равно" << setw(5) << 1001 << endl;

cout << "Мое любимое число равно" << setw(6) << 1001 << endl;

}

 

Когда вы откомпилируете и запустите эту программу, на экране появится следующий вывод:

 

 

Если вы указываете ширину с помощью setw, вы указываете минимальное количество символьных позиций, занимаемых числом. В предыдущей программе модификатор setw(3) указывал минимум три символа. Однако, так как число 1001 потребовало больше трех символов, cout использовал реально требуемое количество, которое в данном случае равнялось четырем. Следует отметить, что при использовании setw для выбора ширины, указанная ширина действительна для вывода только одного числа. Чтобы указать ширину для нескольких чисел, необходимо использовать setw несколько раз.

 

Замечание: Для использования модификатора setw необходимо использовать заголовочный файл iomanip.


[1] С чего-то ведь надо начать.

[2] О прототипах функции см. в главе 4.

[3] Приблизительно, т.к. точный адрес переменной может и не совпасть с приведенным в книге.

[4] Однако далее вы увидите, как обойтиэто ограничение, используя оператор new.

[5] из книги [Павловская Т.А., 2005 г.]

[6] Специально организованный файл с раcширением lib или dll.

[7] Или в стиле языка С - значения 1 или 0.

[8]Вы узнаете о роли конструктора позже в этом разделе, а пока запомните синтаксические правила, которые используется в C++ для прототипа функции конструктора.

[9] из книги С. Пратта “Язык программирования C++”

[10] Работает также, как endl

[A1]Следует указать в примечании исключения



Последнее изменение этой страницы: 2016-07-22

headinsider.info. Все права принадлежат авторам данных материалов.