Вход/Регистрация
Графика DirectX в Delphi
вернуться

Краснов Михаил

Шрифт:

ZeroMemory(@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD__CAPS or DDSD_HEIGHT or DDSD_WIDTH;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

dwWidth := 640;

dwHeight := 100;

end;

hRet := FDD.CreateSurface(ddsd, FDDSConsole, nil);

if Failed (hRet) then ErrorOut(hRet, 'CreateSurface1);

hRet := FDDSConsole.SetPalette(FDDPal) ;

if Failed (hRet) then ErrorOut(hRet, 'SetPalette');

ZeroMemory(gddbltfx, SizeOf(ddbltfx));

ddbltfx.dwSize := SizeOf(ddbltfx);

ddbltfx.dwFillColor :=RGB (255, 255, 255);

FDDSConsole.Bit(nil, nil, nil, DDBLT COLORFILL or DDBLT WAIT, @ddbltfx);

SetRect (rcRectConsole, 0, 0, 640, 100);

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

if ConsoleLive then begin // Надо ли рисовать консоль

if (GlobalThisTickCount - GlobalLastTickCount > DelayConsole) then

begin // Плавное появление консоли

Inc (ConsoleHeight, 5);

if ConsoleHeight > 100 then ConsoleHeight := 100;

SetRect (rcRectConsole, 0, 0, 640, ConsoleHeight);

end;

// Собственно воспроизведение консоли

FDDSBack.BltFast(0, 0, FDDSConsole, @rcRectConsole, DDBLTFAST__WAIT);

end;

Текст в консоли выводится с помощью функций GDI:

procedure OutText (const X, Y : Integer; const TextCon : String);

var

DC : HOC;

begin

FDDSConsole.GetDC (DC) ;

SetBkColor(DC, RGB (255, 255, 255)); // Цвета фона и букв необходимо

SetTextColor (DC, 0); // задавать обязательно

TextOut (DC, X, Y, PChar(TextCon), length (TextCon));

FDDSConsole.ReleaseDC (DC);

end;

Немало хлопот принесла обработка нажатия клавиши <Backspace>: чтобы стереть старый текст, приходится воспроизводить ряд пробелов:

if diks [DIK_TAB] and $80 <> 0 then begin // Клавиша <Tab>

if not ConsoleLive then begin // Включение консоли

ConsoleHeight := 0; ConsoleLive := True;

end

else ConsoleLive := False; // Выключить консоль

Sleep(lOO); // Небольшая пауза

end;

if ConsoleLive then begin // Обработка клавиш для консоли

OutText (5, 10, TextConsolel); // Вывод трех строк в консоли

OutText (5, 30, TextConsole2); OutText (5, 50, TextConsole3);

if diks [DIK_RETURN] and $80 <> 0 then begin // Ввод команды

// Введена команда "Exit"; выход из программы

if (TextConsole3 = '>EXIT_') or (TextConsole3 = '> EXIT_') then Close;

// Введена другая команда, строки стираются и поднимаются наверх

TextConsolel := ' ';

OutText (5, 10, TextConsolel); // Затираем пробелами

TextConsolel := TextConsole2; // Строка сдвигается вверх

TextConsole2 := ' ' ;

OutText (5, 30, TextConsole2);

TextConsole2 := '> Command : ' + Copy (TextConsole3, 2,

length (TextConsoleS) - 2); // Реакция на все остальные команды -

// вывод эха

TextConsoleS := ' ';

OutText (5, 50, TextConsoleS);

TextConsoleS := '>_'; // Последняя строка превратилась в приглашение

Sleep(100);

end;

if diks [DIK_BACKSPACE] and $80 <> 0 then begin // Нажата клавиша

// <Backspace>

TextConsole3 := ' ';

OutText (5, 50, TextConsoleS); // Стираем последнюю строку

TextConsoleS := '>_';

OutText (5, 50, TextConsoleS);

end;

for i := DIK_Q to DIK_M do // Просматриваем буквенные клавиши

if diks [i] and $80 <> 0 then begin // Нажата какая-то клавиша с буквой

if length (TextConsoleS) < 20 then begin // Ограничение длины строки

// Перед символом подчеркивания вставляем букву нажатой клавиши

TextConsoleS := Copy (TextConsoleS, I, length (TextConsoleS) - 1) +

ScanToChar (i) +'_';

OutText (5, 50, TextConsoleS); // Вывод получившейся строки

Sleep(100);

end;

end;

end;

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

  • Читать дальше
  • 1
  • ...
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: