Сегодня у вас на компьютере появится новая игра, которую вы сами и сделаете. В прошлый раз мы нарисовали линию (был простой статический рисунок). Но в любой игре должна быть анимация. Для анимации нам нужно использовать двойную буферизацию (о том, что это такое, писалось раньше). Вы, конечно, можете попробовать написать игру и с одиночным буфером (очень даже красиво получается :-)).
В этой статье мы научимся рисовать сферы (это будет наш мячик), четырехугольники (ракетки), обрабатывать клавиатуру (нам же нужно как-то управлять ракетками), ну и еще некоторые мелочи. Но обо всем по порядку. Итак, начнем с сфер. Для рисования сферы нам нужно создать объект типа GLUquadricObj с помощью функции gluNewQuadric. Сама функция для создания сферы выглядит так:
Где quadObj это указатель на объект типа GLUquadricObj. 2-й параметр это радиус сферы, а два последних параметра число разбиений вокруг оси Z и число разбиений вдоль оси Z (ведь все сложные фигуры состоят из более простых, вроде точек, линий, треугольников). Чем большее будет разбиение, тем лучше будут выглядеть фигуры, но тем сложнее компьютеру будет нарисовать эту фигуру, соответственно, и картинка будет притормаживать при анимации.
Давайте сейчас разберем нашу функцию main(), которая теперь намного жирнее, чем была в предыдущий раз (ведь она уже готова для игры). Посмотрим на код:
Здесь должно быть все понятно. Теперь давайте займемся рисованием наших ракеток. Для этого мы будем использовать функцию auxSolidBox(int w,int h,1); из библиотеки GLAUX, где int w это ширина коробки, int h ее высота. Итак, напишем функцию для отображения наших ракеток, но вначале в самом верху программы (после всех #include) определим все переменные:
Все просто и по существу: bw ширина ракетки, bh высота ракетки, left левый край окна, bottom низ окна, right правый край окна, top верх окна, bitaStep шаг ракетки (при нажатии на клавишу ракетка перемещается на данный промежуток), StepY, StepX шаг мячика по оси X и Y (при большем числе скорость шарика будет быстрее), rocket_y1, rocket_y2 положение 1-й и 2-й ракетки, x, y координаты мячика.
Отображение ракеток:
Все объекты рисуются с точки (0,0), но иногда нам нужно нарисовать фигуру с другой точки для этого мы должны перейти к новым координатам с помощью функции glTranslated(x,y,z). Но перед этим нужно сохранить информацию о старых координатах с помощью функции glPushMatrix(). Наконец, после всех операций над данным объектом вам нужно вернуться к старой системе координат с помощью функции glPopMatrix().
Аналогично рисуем вторую ракетку:
Теперь научимся обрабатывать клавиатуру. Для этого мы напишем функцию Keyboard(unsigned char key, int x, int y), где key это нажатая клавиша, а x, y положение мышки. Наша функция выглядит так:
Теперь нам осталось написать функцию для вычисления координат мячика (мячик ведь будет все время летать по экрану), а также функцию рисования самого мячика. Ниже написана функция для вычисления координат мячика:
А теперь рисуем сам мячик:
И последнее: давайте напишем маленькую функцию Display().
Теперь откомпилируем код, и… наконец-то у нас получилась игра! :-)