Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование с нуля - это совсем просто! 93) Программирование спрайтовых игр


Школа программирования

93) Программирование спрайтовых игр

Сегодня я решил сделать очередное отступление :) , и начать публикацию еще одного курса - программирование спрайтовых (двумерных) игр на BlitzBasic. Эта очень удобная среда позволяет быстро создавать игры и мультимедийные приложения - десятком операторов можно сделать то, что низкоуровневым программированием на Си++ и DirectX займет в десять, а то и сто раз больше.

Всевозможную информацию об этой среде разработки можно найти на сайте http://blitz.pp.ru/ . Официальный сайт разработчика - http://www.blitzmax.com/. Справа на этом сайте есть ссылка Gallery - можете полюбоваться сотнями красивых игр, сделанных на BlitzBasic.

Таким образом, в нашей рассылке поочередно публикуются курсы: по созданию ролевой игры на Паскале, по языку PHP (веб-программирование) и по системе BlitzBasic. С последней и начнем.

Введение.
Программирование в BlitzBasic происходит на одноименном языке, диалекте общеизвестного Бейсика. BlitzBasic включает в себя большое число команд и функций, позволяющих быстро создавать весьма и весьма сложные графические приложения при минимальных усилиях. Но для эффективного использования этого языка надо знать принципы построения графических приложений в этой среде.

BlitzBasic базируется на графической библиотеке DirectX, поэтому многие его функции являются фактически "обертками" соответствующих возможностей DirectX. Соответственно, и архитектура типичного графического приложения также отвечает принятым в DirectX принципам и подходам. Архитектура эта строится на концепции двойного буфера (Double Buffering).

Под буфером понимается область памяти компьютера, где хранится сформированное программой изображение. Условно можно считать каждый буфер видимым на экране рисунком (его копией).

Вывод рисуемого программой изображения в рамках данной архитектуры происходит так. Первоначально в программе необходимо создать фоновый буфер. Он не видим, но может специальной командой быть обменен местами с передним буфером (реально видимым на экране изображением).

Все операции с графикой, которые происходят в программе (рисование), выполняются на фоновом буфере. Таким образом в процессе выполнения какой-либо команды программы (например, вывод линии) реальный эффект от ее работы сразу не будет виден. Результат рисования заносится в фоновый буфер, который нигде не отображается.

Когда все функции вывода графики закончены (и таким образом изображение на фоновом буфере полностью подготовлено), фоновый буфер можно сделать передним, основным, видимым. Для этого служит специальная команда BlitzBasic, которая называется Flip.

После ее выполнения передний и задний, фоновый буферы меняются местами. То, что было на экране до выполнения Flip, попадает в фоновый буфер, а он копируется непосредственно на экран (в передний буфер). Теперь если продолжить рисование, то оно будет происходить на тех данных, что были скопированы с экрана. Поэтому как правило первоначально их очищают (стирают все, что хранится в буфере).

Итак, вот как выглядит схема функционирования графической программы по данной технике двойной буферизации:

* Задается графический режим работы программы (разрешение, глубина цветности).

* Формируется фоновый буфер.

* Запускается непрерывный цикл, повторяющий следующую последовательность действий:

** Изображение на экране копируется в фоновый буфер.
** Фоновый буфер очищается.
** На фоновом буфере рисуется нужное нам изображение.

* Цикл повторяется. Выход из него происходит обычно по нажатии какой-либо клавиши.

Данная техника хороша тем, что при выводе непосредственно на экран теоретически могут быть видны моменты стирания с него всего содержимого (перемаргивание), а отрисовка различных элементов сцены происходит не "одновременно", а последовательно, от объекта к объекту, что снижает плавность графики. Когда же весь буфер подготовлен целиком, а потом разом выводится на экран, общее изображение выходит очень гладким.

Такой пример. Вы нарисовали 10 роботов на экране, затем вам нужен следующий кадр. Вы стираете старое изображение, и рисуете роботов в новых позициях. Если экран не перерисовывать, то роботы очевидно наложатся на старые образы.

Если же его перерисовывать на видимом экране (основном буфере), то во-первых может быть виден процесс очистки (легкое перемаргивание, как при работе с монитором с низкой частотой), а во-вторых, виден бывает и сам процесс отрисовки изображений, что приводит к ухудшению общей плавности.

А когда сначала полностью все изображение рисуется на фоновом буфере, то его переключение (фоновый меняется местами с основным) обычно реализовано аппаратно в видеокарте и выполняется очень быстро. Благодаря этому удается достичь большого числа показа кадров в секунду, а плавность сохраняется.

Графический режим.
Для задания графического режима служит команда Graphics. Она имеет четыре параметра: ширина экрана в пикселах, высота экрана в пикселах, глубина цветности (число битов, чаще всего 16 или 32), и видеорежим (не обязателен, по умолчанию имеет значение 0).

Видеорежим чаще всего указывается на этапах создания программы. Он позволяет, например, определить, будет ли программа работать в полноэкранном режиме, или же в окне. Видеорежим может принимать следующие значения:

0 (программа автоматически выбирает режим; если в BlitzBasic явно задан режим отладки, то программа запустится в окне, в противном случае - в полноэкранном режиме);
1 полноэкранный режим;
2 запуск в окне;
3 масштабируемый оконный режим.

Указать режим отладки в BlitzBasic можно командой главного меню Program - Debug. Тогда данный пункт пометится флажком, а при повторном выборе флажок снимется.

Установить текущий буфер для рисования.
Данная команда записывается так:

SetBuffer буфер

В качестве буфера указывается буфер, куда будут выводиться все результаты графических действий программы. Им может быть одно из следующих значений:

FrontBuffer() - немедленный вывод рисуемого изображения на экран;
BackBuffer() - фоновый буфер;
ImageBuffer() - буфер, связанный не с экраном, а с отдельным изображением в сцене. Это удобно, когда например мы хотим рисовать не на экране, а на одном из элементов выведенного на него изображения. Допустим, на экране сформировано изображение забора, на котором затем с помощью данного буфера можно без особых усилий делать различные надписи. Работа с данным буфером будет рассмотрена позже.

Для нашей техники двойной буферизации нужно так использовать данную команду:

SetBuffer BackBuffer()

Смена буферов.
Для смены переднего и заднего буферов применяется команда Flip. У нее один параметр, который может принимать одно из двух значений true или false. По умолчанию принято значение true - оно означает, что реально обмен буферов выполняется не сразу, а только после того, когда физически на экране будет выведена последняя линия. Это время зависит от графической карты и частоты развертки монитора, а такое согласование может приводить к большей гладкости смены кадров, хотя и не всегда.

Flip

Очистка экрана.
Быстрая очистка содержимого всего экрана (выбранного для рисования буфера), выполняется закрашивание по умолчанию черным цветом, а явно он может быть задан с помощью команды ClsColor.

Cls

Условный цикл.
Как организовать в BlitzBasic условный цикл? Для этого предназначен оператор While / Wend. Он записывается так:

While условие

выполняемая группа операторов

Wend

Внутренняя группа операторов будет выполняться до тех пор, пока истинно условие.

В нашем случае таким условием должна стать проверка отсутствия нажатия на некоторую клавишу (цикл выполняется, пока клавиша не нажата). Такая проверка записывается с помощью функции KeyDown(), параметром которой выступает код нужной клавиши. Так, кодом клавиши ESC в BlitzBasic является 1, и нужная нам проверка будет выглядеть так:

Not KeyDown(1)

Not здесь - отрицание результата проверки нажатия.

Теперь соберем наш код целиком, в соответствии с описанным выше алгоритмом.

Graphics 640,480,16
SetBuffer BackBuffer()
While Not KeyDown(1)
Flip
; что-то рисуем
Wend

Строчки, начинающиеся с символа ";" (или заключительная часть строчки с этого символа), считаются в программе на BlitzBasic комментариями и пропускаются без выполнения. Они не играют никакой роли и нужны только для оформления и повышения наглядности текста программы.

Эту программу уже можно запустить. На экране покажется черное окно, в котором ничего не будет, а по нажатии на ESC оно закроется. Черным окно будет потому, что пока мы ничего в программе не рисуем.

Далее - изучаем функции двумерного рисования.


(c) 2004-2006 Сергей Бобровский bobrovsky@russianenterprisesolutions.com

Школа программирования с нуля
Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/

Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование


В избранное