Программирование графики

Xakep, номер #040, стр. 040-075-3


4. Зарезервирован до лучших времен, обязательно должен быть nil. Вообще-то, у функций DirectDraw очень часто последний параметр зарезервирован, поэтому я буду экономить на этом место. Если я ничего не сказал про последний параметр, значит, он зарезервирован, и ставь то, что указал в примере я.

Итак, DirectDraw проинициализировали, можно пойти дальше. Следующим шагом надо установить уровень привилегий нашего приложения. Для этого вызываем SetCooperativeLevel:

FDirectDraw.SetCooperativeLevel(Handle, DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE);

Тут всего два параметра:

1. Указатель на окно.

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

Так как приложение полноэкранное с эксклюзивными правами, мы можем изменять разрешение экрана. Давай сделаем это:

FDirectDraw.SetDisplayMode (640, 480, 16, 0, 0);

Тут пять параметров: ширина экрана, высота, глубина цвета (количество бит на пиксель), частота развертки и резерв. Частоту развертки я не советую трогать на первых порах, и ставить надо 0, в этом случае будет использоваться значение по умолчанию. Размеры экрана можно использовать только стандартные, так что будь аккуратен, чтобы не повесить систему.

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

Сегодня я создам только одну поверхность. Но, прежде чем это делать, надо заполнить структуру типа TDDSurfaceDesc2 (для этого мы создали переменную SurfaceDesc типа TDDSurfaceDesc2). Эта структура должна содержать описание создаваемой поверхности.

FillChar (SurfaceDesc, SizeOf(SurfaceDesc), 0);

SurfaceDesc.dwSize := SizeOf(SurfaceDesc);

SurfaceDesc.dwFlags := DDSD_CAPS;

SurfaceDesc.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE;

Первой строкой я обнуляю содержимое всей структуры. Вторая строка заполняет свойства dwSize, записывая туда размер структуры.

Следующей строкой я заполняю необходимые флаги. В этих флагах указывается, какие еще свойства структуры будут заполнены. Я указал DDSD_CAPS, значит, я обязан заполнить еще и свойство dwCaps, что и делаю в следующей строке. В свойство dwCaps я записываю DDSCAPS_PRIMARYSURFACE, это указывает на то, что создаваемая поверхность будет главной.

Теперь можно и создать саму поверхность с помощью вызова CreateSurface:

FDirectDraw.CreateSurface(SurfaceDesc, FPrimarySurface, nil);

Назад на стр. 040-075-2  Содержание  Вперед на стр. 040-075-4