|
|
|||||
|
> НАЗАД <
DirectDraw Tutorial By: Peter Kuchnio Перевод на русский язык Antiloop [введение] Вы попробовали использовать PaintPicture и ужасное качество анимации заставило вас кричать от ужаса. Вы попробовали BitBlt и нашли, что скорость обновления целого экрана 640x480 оставляет желать лучшего. Вы готовы к DirectDraw! Как вы уже могли догадаться, DirectDraw быстр. Он получает свою скорость из-за прямого доступа к 2D видеокарте, но с тех пор, как появился DirectX, вам не надо изучать специфические инструкции каждой отдельной видеокарты. Ну разве не чудесно? Вообще-то, DirectX не имел официальной поддержки VB до тех пор, пока не вышел DirectX 7. Чтобы получить доступ к функциям DirectX 3-6 из VB, вам потребуются Type Library с сайта Visual Basic Area 51. Эти библиотеки позволят вам получить доступ к DirectX из VB. И что самое хорошее, это библиотеки абсолютно бесплатны. Теперь, перейдем к обучению.
[программа] Для начала, вам надо объявить несколько типов и т. д. Вы увидите, для чего они нужны позже. Первая переменная "dir" будет
использована для того, чтобы указать, в какую сторону движется мяч
(примером будет мяч, прыгающий на фоне). Затем, нам понадобятся
несколько констант, которые будут использованы, чтобы загрузить
растровый рисунок. Затем тип BITMAP. Он будет хранить всю информацию
об растровом изображении. Тип используется позже, для загрузки
BMP.
'Направление движения
спрайта 'Константы 'Определение BMP для вызова функции
LoadImage Теперь, несколько API. Вам должны быть знакомы многие из них, если вы изучали BitBlt. 'Функции, используемые в
программе Функция LoadImage здесь самая важная. Эта
функция интегральная часть процедуры загрузки изображения в буфер.
Кстати о буферах, нам ведь надо их объявить! Вот объявления
буферов: Dim dd As IDirectDraw2 'Главный объект DirectDraw ' Наши буфера
dd - это главный объект DirectDraw. Остальные объекты - буфера (или поверхности). Поверхности в DirectDraw - это эквиваленты Memory DC, которые использовались в BitBlt Tutorial. Поверхности - это место в памяти, куда вы загружаете изображения. Также, вы копируете их содержимое на главную поверхность, чтобы увидеть что-либо на экране. Стало понятней? Мы объявили главную (переднюю) поверхность - это то, что видит пользователь. Задний буфер - здесь собирается сцена. Последние два буфера служат для хранения фона и спрайта. Далее: как DirectDraw узнает в каком месте
буфера находится нужный спрайт? Как он узнает какого размера спрайт?
Да он и не знает. Вам надо самим сказать ему об этом, передав
структуру RECT. 'Вот они - RECTS Теперь, когда мы сохранили информацию о
изображениях, надо описать передняя и заднюю
поверхности. 'Описание поверхностей Dim Running As
Boolean
' Была ли нажата клавиша Escape Последняя переменная "running" указывает на то, нажал ли пользователь клавишу Esc или нет. Если да, тогда надо прервать выполнение программы и выгрузить форму. Затем, надо уничтожить поверхности в процедуре Unload. Private Sub Form_KeyDown(KeyCode As
Integer, Shift As Integer)
Теперь, можно написать процедуру Form_Load.
Здесь собирается все вышесказанное. Происходит вызов функции
загружающей растровое изображение. Эта функция показана в конце
учебника. Private Sub Form_Load()
В этом месте происходит
присвоение некоторым переменным их начальных значений.
"Dir" - это направление движение мяча и он начинает
двигаться влево. "coorx" говорит сам за себя - координата
мяча по оси X. Теперь, очень важная переменная - "ddck".
Эта переменная содержит ключевой цвет. Ключевой цвет - это цвет,
который при наложении спрайта на фон будет прозрачным.
Здесь мы инициализировали
полноэкранный режим. Сначала инициализируется DirectDraw, затем мы
создаем эксклюзивный полноэкранный режим. Он эксклюзивный (то есть
не делится ни с кем ресурсами), потому что не может быть более
одного полноэкранного окна. Затем мы устанавливаем режим дисплея в
640x480x8.
Эта часть очень важна, так что
будьте внимательны. Заполняется описание передней поверхности.
Первая переменная задает сколько памяти будет использоваться. Затем,
мы устанавливаем флаги. Мы описываем поверхность как главную и с
возможностью копирования на нее сцены. Затем, мы задаем количество
задних буферов. В нашем случае один. Затем, мы создаем переднюю
поверхность с прикремленным к ней задним буфером.
Настал момент для загрузки в свободные буфера графики. Вызывается процедура LoadBitmap, которая выполняет загрузку изображений в буфера.
Еще одна очень важная часть.
Здесь определяется ключевой цвет. Что такое ключевой цвет? Когда вы
определяете некий цвет ключевым, он будет игнорироваться при
наложении спрайта на уже готовое изображение, чтобы создать эффект
прозрачности. Вот для чего спрайты рисуют на черном фоне. Вы можете
установить любой цвет ключевым. Последняя строка устанавливает
ключевой цвет для буфера Sprite. Вы можете устанавливать ключевые
цвета для тех буферов, которым это необходимо.
Здесь заполняются важные структуры RECT. Left и Top указывают на верхний левый угол изображения на поверхности. Right и Bottom задают правый нижний его угол. Таким образом задается размер переводимого изображения. Если вы укажете координаты, не соответствующие рисункам, которые вы загрузили в буфер, результат может быть плачевным. ' Показать форму Последние выражения копируют сперва фон на задний буфер, а затем и спрайт. DDBLTFAST_WAIT заставляет программу выждать, пока изображенеи не будет полностью скопировано, перед тем, как продолжать работу. Помните выставлять в этом месте DoEvents. Это позволит Windows заниматься другими делами, например отслеживать нажатие клавиш.
Здесь обновляется позиция
спрайта. Если Dir=1, тогда спрайт движется влево, если Dire=2, тогда
вправо.
Теперь, часть, где задний буфер с приготовленно на нем сценой копируется на главную поверхность, чтобы пользователь мог что-нибудь увидеть. Если поверхность потеряна, программа просто пропускает этот момент, вместо того, чтобы выдавать ошибку. Процедура Unload Me происходит, когда нажата клавиши Escape. Это была процедура Form_Load. Также, нам нужна еще и Form_Unload. Если вы не обнулите (установите в nothing) поверхности, ваша программа выполнит то, что обычно называют crash. DirectDraw не прощает даже таких мелочей. Private Sub
Form_Unload(Cancel As Integer)
Здесь мы восстанавливаем режим дисплея, в котором работает Windows и возвращаемся в оконный режим из полноэкранного. Затем сбрасываются буфера спрайта и фона. За ними в мусорку следуют задний буфер и передняя поверхность. СНАЧАЛА ИДЕТ ЗАДНИЙ БУФЕР, А ТОЛЬКО ПОТОМ ПЕРЕДНЯЯ ПОВЕРХНОСТЬ! В конце-концов, уничтожаем объект DirectDraw. Ну и наконец, вот функция, которая загружает растровые изображения. Вы можете попробовать устанавливать ColorKey здесь, вместо того, чтобы делать это в Form_Load. Private Function
LoadBitmapIntoDXS(DXObject As IDirectDraw2, ByVal BMPFile As String)
As IDirectDrawSurface2
> НАЗАД <
|
|||||