Welikeit.Ru | |
|
| |
|
|
Paccal или Паскаль - Статьи - Спрайтовая анимацияДовольно часто в конференциях , посвященных программированию и разработке компьютерных игр, встречаются вопросы по спрайтовой анимации. Начинающие программисты тоже, наверное, хотели бы почитать что-нибудь на эту тему, а еще лучше — просто посмотреть, как действует подобная простенькая программа. Может ли быть что-то более интересное для школьника, чем самому написать компьютерную игру. На уроках информатики или факультативных занятиях, где рассматриваемый материал выходит за рамки школьной программы, учащимся, как правило, предлагали работать с процедурами модуля Graph. Для учебных целей или создания статической графики это, возможно, и неплохой вариант, но вот для анимированной он явно не годится из-за экранного режима и набора процедур модуля Graph. Для анимации 16-цветные режимы не слишком подходят, так как требуют довольно сложной структуры видеопамяти, а также постоянного обращения к регистрам видеоадаптера, что значительно замедляет работу. Поэтому для нашего примера мы не будем пользоваться ни модулем Graph, ни стандартными для Borland Pascal видеорежимами. Итак, примем режим 256 цветов и разрешение 320x200 точек. Этот стандартный видеорежим — самый простой с точки зрения организации видеопамяти. В данном случае она представляет собой большой байтовый массив размером 320x200 точек, где каждый байт соответствует определенной точке. Таким образом, точка с координатами (x, y) находится в видеопамяти со смещением x + 320y. Для удобства опишем экран как двумерный массив, любой байт которого может принимать 256 различных значений, так что на экране одновременно может появляться до 256 цветов, причем всякому значению байта соответствует свой цвет, определяемый регистрами палитры. Значит, записывая байт в установленное место видеопамяти, мы «зажигаем» точку. Так как стандартные драйверы экрана не поддерживают выбранный нами режим, установим его напрямую через VideoBIOS. Кроме того, не подключены графические драйверы, а потому нет и стандартных функций, позволяющих рисовать точку, линию, круг, прямоугольник, — правда, точку можно изобразить через тот же VideoBIOS, но делается это очень медленно. Впрочем, в спрайтовой анимации такие функции и не нужны, жаль только, что пропадают те из них, которые обеспечивают вывод текста. В принципе можно воспользоваться и поддерживающими 256 цветов библиотеками (к сожалению, в стандартную поставку Вorland/Turbo Рascal они не входят), однако они годятся лишь для вывода текста или расчерчивания рамок. В конце концов, вывод текста — отдельный разговор, и к нему мы еще вернемся. Теперь о спрайтах Вывод на экран Реальные спрайты редко имеют прямоугольную форму, поэтому выводить следует только отдельные точки считанного изображения, включив для этого понятие «прозрачный цвет». В данном случае мы выбираем белый цвет с кодом 255 ($FF). При выводе спрайта рисуются лишь те точки, код которых не равен 255 (для «прозрачного цвета» можно взять любое значение: 0, 5, 31 — как вам будет удобно). Чтобы скорость работы программы не зависела от производительности компьютера, применим синхронизацию с обратным ходом кадровой развертки. Она также избавит и от мерцания. В более сложных программах эти две функции реализуются с помощью различных механизмов независимо друг от друга. Текст созданной нами программы см. в листинге. Чтобы описать спрайт, определяем запись SpriteType. Для прямого доступа к видеопамяти используем массив Mem, а для вызова функции VideoBIOS — процедуру intr. Итак, что же получилось? Цвета вышли не такие, какие нам хотелось бы. Что делать? По умолчанию в среде
DOS и в Windows установлены различные палитры. Чтобы цвета были такими, какими
нужно, следует прочитать заголовок BMP-файла, взять из него данные по цветам и
записать их в регистры палитры. На приведенном здесь примере показано, как перемещать спрайт по экрану. Кроме того, чередуя несколько фаз (кадров) изображения, можно заставить спрайт «махать руками», «топать ногами» и т. п., даже находясь в одном месте экрана. Для этого нужно либо сопоставить файл каждому кадру, либо поместить все кадры в один файл (последнее предпочтительнее, но требует большей работы), а затем по очереди выводить изображение спрайта из того или иного кадра на экран (в буфер). Автор: Сергей Андрианов |
|
Copyright © 2006-09.
| |