(******************************************************************************
 *                                                                            *
 *  Придумал и написал Кода Виктор, Март 2002                                 *
 *                                                                            *
 *  Файл:	sprite.dpr                                                    *
 *  Содержание: Пример использования DirectDraw в Delphi                      *
 *                                                                            *
 ******************************************************************************)
program Sprite;

uses
  windows,
  messages,
  basedd8 in 'basedd8.pas';



  
//------------------------------------------------------------------------------
// Константы и глобальные переменные
//------------------------------------------------------------------------------
const
  APP_NAME = 'DDDemo';
  WIN_NAME = 'DDDemo';

var
  wce:     WNDCLASSEX;
  hWindow: HWND;
  lpMSG:   MSG;

  nPosX,
  nPosY:   Integer; // Координаты спрайта




//------------------------------------------------------------------------------
// Имя:      WndProc()
// Описание: Оконная функция
//------------------------------------------------------------------------------
function WndProc(hWnd: HWND; msg: UINT; wParam: WPARAM; lParam: LPARAM):
  LRESULT; stdcall;
begin
  case msg of
    WM_KEYDOWN:
    case wParam of
      VK_ESCAPE: SendMessage( hWnd, WM_DESTROY, 0, 0 );
      VK_LEFT:  Dec( nPosX, 5 );
      VK_RIGHT: Inc( nPosX, 5 );
      VK_UP:    Dec( nPosY, 5 );
      VK_DOWN:  Inc( nPosY, 5 );
    end;
      
    WM_DESTROY:
    begin
      PostQuitMessage( 0 );
      Exit;
    end;
  end;

  WndProc := DefWindowProc( hWnd, msg, wParam, lParam );
end;




//------------------------------------------------------------------------------
// Имя:      ()
// Описание: Здесь программа получает управление
//------------------------------------------------------------------------------
begin
  with wce do
  begin
    cbSize        := SizeOf( WNDCLASSEX );
    style         := CS_HREDRAW or CS_VREDRAW;
    lpfnWndProc   := @WndProc;
    hCursor       := LoadCursor( 0, IDC_ARROW );
    hbrBackground := HBRUSH( GetStockObject( BLACK_BRUSH ) );
    lpszClassName := APP_NAME;
  end;

  RegisterClassEx( wce );

  hWindow := CreateWindowEx( WS_EX_TOPMOST, APP_NAME, WIN_NAME, WS_POPUP, 0, 0,
                             GetSystemMetrics( SM_CXSCREEN ),
                             GetSystemMetrics( SM_CYSCREEN ), 0, 0,
                             SysInit.HInstance, nil );

  ShowWindow( hWindow, CmdShow );
  UpdateWindow( hWindow );

  // Здесь начинается театр :-)
  if ( InitDirectDraw( hWindow, SCREEN_WIDTH, SCREEN_HEIGHT, 16 ) ) and
     ( LoadFiles( hWindow ) ) then
  while TRUE do
  begin
    if PeekMessage( lpMsg, 0, 0, 0, PM_NOREMOVE ) then
    if not GetMessage( lpMsg, 0, 0, 0 ) then Break
    else
    begin
      TranslateMessage( lpMsg );
      DispatchMessage( lpMsg );
    end
    else
    begin
      // Проверяем выход спрайта за границы экрана
      if nPosX < 0 then nPosX := 0;
      if nPosY < 0 then nPosY := 0;
      if nPosX > SCREEN_WIDTH - 256  then nPosX := SCREEN_WIDTH - 256;
      if nPosY > SCREEN_HEIGHT - 256 then nPosY := SCREEN_HEIGHT - 256;
      // 256 - это ширина и высота спрайта, учитываем их

      // Рисуем на экране с помощью DirectDraw
      OnDraw( nPosX, nPosY );
    end;
  end;

  // Удаляем объекты DirectDraw
  ReleaseDirectDraw();

  DestroyWindow( hWindow );
end.
