Читаем Графика DirectX в Delphi полностью

Map2.WrapScrollUp(MapScrollSpeed);

МарЗ.WrapScrollUp(MapScrollSpeed);

Map4.WrapScrollUp(MapScrollSpeed);

end;

if KeyDown(DIK_DOWN) then begin // Стрелка вниз

Mapl.WrapScrollDown(MapScrollSpeed);

Map2.WrapScrollDown(MapScrollSpeed);

МарЗ.WrapScrollDown(MapScrollSpeed);

Map4.WrapScrollDown(MapScrollSpeed); end; if KeyDown(DIK_ESCAPE) then begin // Выход

GameScreen.FadeTo(255, 255, 255, 0); // Эффект угасания

GameScreen.FadeOut(4) ;

f rmDD.Close;

end;

end;

Обрабатывается нажатие нескольких клавиш одновременно, образы можно передвигать по диагонали.

Вывод осуществляется в задний буфер, каждая карта отсекается по своему сектору:

function TfrmDD.UpdateFrame : HRESULT;

var

Windowl : TRECT; // Секторы окна

Window2 : TRECT;

Windows : TRECT;

Window4 : TRECT;

begin

SetRect (Windowl, 0, 0, 320, 240) ; // Четыре равные части экрана

SetRect (Window2, 320, 0, 640, 240);

SetRect (Window3, 0, 240, 640, 480); SetRect (Window4, 320, 240, 640, 480);

GameInput.Update; // Обновить данные о клавиатуре

OpdateKeys; // Обслужить нажатые клавиши

// Вывод в задний кадр четырех карт, отсекаемых по секторам

Map1.DrawClipped(GameScreen.GetAppBackBuffer, Windowl);

Map2.DrawClipped(GameScreen.GetAppBackBuffer, Window2);

МарЗ.DrawClipped(GameScreen.GetAppBackBuffer, Window3);

Map4.DrawClipped(GameScreen.GetAppBackBuffer, Window4);

Result := GameScreen.Flip; // Переключение страниц

end;

Для восстановления поверхностей используется метод Restore.

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

Существует одна переменная, связанная с фоном, в нее загружаются различные фрагменты растра:

GameMap := CDXMap.CDXMap(Landscape, GameScreen); // Создание лоскута

GameMap.CreateMap(MapSizeX, MapSizeY, 1) ;

GameMap.MoveTo(0, 0) ; Tile := 1;

for i := 0 to 63 do // Цикл заполнения карты

for j := 0 to 62 do begin // разными фрагментами

GameMap.SetTile (i, j, Tile);

Tile := Tile + 1;

if Tile > 4 then Tile := 1;

end;

Через некоторый промежуток времени экран заполняется новым фоном:

var

Delay : Integer =0; // Счетчик кадров

function TfrmDD.UpdateFrame : HRESULT;

var

wrk : TRECT; // Прямоугольник экрана

i, j, Tile : Integer;

begin

Game Input.Update;

UpdateKeys;

SetRect (wrk, 0, 0, ScreenWidth, ScreenHeight);

// Вывести текущее состояние фона

GameMap.DrawClipped (GameScreen.GetAppBackBuffer, wrk);

Inc (Delay);

if Delay > 40 then begin // Прошло 40 кадров

for i := 0 to 62 do

for j := 0 to 62 do begin

Tile := GaraeMap.GetTile(i, j); // Получить номер фрагмента

Inc (Tile); // Циклический сдвинуть в цепочке фрагментов

if Tile > 4 then Tile := 1;

GameMap.SetTile(i, j, Tile); // Задать новый фрагмент

end;

Delay := 0;

end;

Result := GameScreen.Flip;

end;

Код обработки клавиатуры в примере заметно короче по сравнению с предыдущим:

procedure UpdateKeys;

begin

if KeyDown(DIK_RIGHT) then GameMap.WrapScrollRight(MapScrollSpeed);

if KeyDown(DIK_LEFT) then GameMap.WrapScrollLeft(MapScrollSpeed);

if KeyDown(DIKJJP) then GameMap.WrapScrollUp(MapScrollSpeed);

if KeyDown(DIK_DOWN) then GameMap.WrapScrollDown(MapScrollSpeed);

if KeyDown(DIK_ESCAPE) then frmDD.Close;

end;

На рис. 5.15 запечатлен момент работы нашего очередного примера (проекта каталога Ех16), в котором на экране выводятся координаты пользовательского курсора.

Рис. 5.15. Пример вывода текста и обработки событий мыши

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

GameCursor := CDXSurfасе.Create;

GameCursor.CreateCDXSurfaceFromFile(GameScreen,'Cur.bmp');

GameCursor.ColorKey(0);

Для заднего буфера задается конкретный шрифт:

GameScreen.GetAppBackBuffer.ChangeFont('Times', 16, 20, FW_BOLD);

Аналогично процедуре обработки клавиатуры, требуется процедура, связанная с событиями мыши. Обратите внимание, как организована прокрутка изображения:

procedure UpDateMouse;

var

TempX, TempY : Integer;

begin

TempX := GameInput.Mouse.X; // Смещение по осям

TempY := Gamelnput.Mouse.Y;

CurX := CurX + 3 * TempX; // Текущие координаты курсора

CurY := CurY + 3 * TempY;

// Анализ положения курсора вблизи границ экрана

if CurX < 0 then CurX := 0 else

if CurX > ScreenWidth - MapSizeX then CurX := ScreenWidth - MapSizeX;

if CurY < 0 then CurY := 0 else

if CurY > ScreenHeight - MapSizeY then CurY := ScreenHeight - MapSizeY;

if CurX = 0 then begin

if TempX < 0 then GameMap.WrapScrollLeft(-TempX);

end else

if CurX = ScreenWidth - MapSizeX then

if TempX > 0 then GameMap.WrapScrollRight(TempX);

if CurY = 0 then begin

if TempY < 0 then GameMap.WrapScrollUp(-TempY);

end else

if CurY = ScreenHeight - MapSizeY then

if TempY > 0 then GameMap.WrapScrollDown(TempY);

end;

Вывод текста на экран осуществляется с помощью метода TextxY заднего буфера:

function TfrmDD.UpdateFrame : HRESULT;

var

wrk : TRECT;

begin

Gamelnput.Update;

UpdateKeys;

UpdateMouse;

SetRect (wrk, 0, 0, ScreenWidth, ScreenHeight);

GameMap.DrawClipped (GameScreen.GetAppBackBuffer, wrk);

// Вывод курсора

GameCursor.DrawFast(CurX, CurY, GameScreen.GetAppBackBuffer);

// Вьшод текста

Перейти на страницу:

Похожие книги

C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
Adobe InDesign CS3
Adobe InDesign CS3

Книга посвящена верстке и макетированию в программе Adobe InDesign CS3. Помимо того что в ней описываются возможности программы, рассматриваются также принципы и традиции верстки, приводятся примеры решения типичных задач. Все это позволит читателю не только овладеть богатым инструментарием программы, но и грамотно применять его.Материал книги разделен на логические части: теоретические сведения, инструментарий программы, решение задач, – а также рассчитан на два уровня подготовки читателей – начинающих и опытных пользователей, что выгодно отличает книгу от других изданий. Это позволит применять ее как новичкам для знакомства с программой, так и пользователям со стажем для пополнения своих знаний.

Владимир Гавриилович Завгородний , Владимир Завгородний

Программирование, программы, базы данных / Программное обеспечение / Книги по IT
Разработка приложений в среде Linux. Второе издание
Разработка приложений в среде Linux. Второе издание

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет СЃРѕР±РѕР№ отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из РґСЂСѓРіРёС… операционных систем. РџРѕРґСЂРѕР±но рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование СЃРІРѕР±одно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Р

Майкл К. Джонсон , Эрик В. Троан

Программирование, программы, базы данных