Частина 16 - Довільний курсор мишки

Будь-яка хороша гра має власний курсор мишки. Вам може здатися, що було б непогано мати поверхню SDL2 або текстуру SDL2 і візуалізувати її як будь-який інший спрайт прямо в позиції миші, щоб імітувати курсор миші. Не робіть цього! Курсор миші обробляється окремо від іншої візуалізації, щоб він був плавним і працював у критичних ситуаціях.

Наступний код показує, як правильно налаштувати власний курсор миші за допомогою SDL2.

program SDL_MouseCursor;

uses SDL2, SDL2_image;

var
  sdlWindow1: PSDL_Window;
  sdlRenderer: PSDL_Renderer;
  sdlSurface1: PSDL_Surface;
  sdlMouseCursor: PSDL_Cursor;
  sdlEvent: TSDL_Event;
  ExitLoop: Boolean = False;

begin

  //ініціалізація підсистеми відео
  if SDL_Init(SDL_INIT_VIDEO) < 0 then Halt;

  SDL_CreateWindowAndRenderer(500, 500, SDL_WINDOW_SHOWN, @sdlWindow1, @sdlRenderer);
  if (sdlWindow1 = nil) or (sdlRenderer = nil) then Halt;

  sdlSurface1 := IMG_Load('Cursor.png' );
  if sdlSurface1 = nil then Halt;

  // створення і встановлення нового курсору мишки
  sdlMouseCursor := SDL_CreateColorCursor(sdlSurface1, 8, 8);
  if sdlMouseCursor = nil then Halt;

  SDL_SetCursor(sdlMouseCursor);

  while ExitLoop = False do
  begin

    // вийти з циклу якщо натиснута кнопка мишки
    while SDL_PollEvent(@sdlEvent) = 1 do
      if sdlEvent.type_ = SDL_MOUSEBUTTONDOWN then
        ExitLoop := True;

    SDL_SetRenderDrawColor(sdlRenderer, 128, 128, 128, SDL_ALPHA_OPAQUE);
    SDL_RenderClear(sdlRenderer);

    SDL_RenderPresent(sdlRenderer);
    SDL_Delay( 20 );
  end;

  SDL_FreeCursor(sdlMouseCursor);

  SDL_FreeSurface(sdlSurface1);
  SDL_DestroyRenderer(sdlRenderer);
  SDL_DestroyWindow (sdlWindow1);

  //вимкнення підсистеми відео
  SDL_Quit;

end.

Щоб мати власний курсор миші, нам потрібна змінна типу PSDL_Cursor. Тут ми називаємо його “sdlMouseCursor”.

Результат виглядає так:

Custom Mouse Cursor in SDL2
Creative Commons License Це зображення від https://www.freepascal-meets-sdl.net ліцензовано на умовах Синій хрестик із жовтим контуром - курсор миші на сірому полотні / вікні.
  sdlSurface1 := IMG_Load('Cursor.png' );
  if sdlSurface1 = nil then Halt;

  // створення і встановлення нового курсору мишки
  sdlMouseCursor := SDL_CreateColorCursor(sdlSurface1, 8, 8);
  if sdlMouseCursor = nil then Halt;

  SDL_SetCursor(sdlMouseCursor);  

Це найцікавіша частина коду щодо створення власного курсору мишки. Зображення курсора визначається поверхнею SDL. Тут ми створюємо поверхню SDL, як відомо з попередньої частини з файла формату png до “sdlSurface1”.

Власний курсор миші створюється наступною функцією, яка повертає nil при помилці.

SDL_CreateColorCursor(surface: PSDL_Surface; hot_x: SInt32; hot_y: SInt32): PSDL_Cursor

Потрібно, щоб поверхня використовувалася як зображення курсору, а дві координати (hot_x / hot_y) як аргументи. Вони визначають, де фактична точка потрапляння для цього курсору. Оскільки приклад зображення курсору має розміри 16 × 16 пікселів і являє собою хрест, то "гарячі" (ударяючі) координати мають значення (8/8), отже, центр хреста використовується для натискання кнопки чи чогось іншого. На відміну від цього Ви можете собі уявити типовий курсор миші у формі стрілки, де точка потрапляння повинна бути відрегульована так, щоб вона знаходилася прямо на кінчику стрілки на зображенні стрілки.

Якщо створення курсора було успішним, необхідно встановити його як дійсний курсор. Можливо, ви створили багато різних курсорів, тож повідомте SDL, який із них слід використовувати, наступною процедурою.

SDL_SetCursor(cursor: PSDL_Cursor)

Решта частини коду - це просто візуалізація вікна розміром 500 на 500 пікселів із сірим (128, 128, 128) фоном, яке оновлюється, доки не було натиснуто жодної кнопки миші.

Нарешті, не забудьте звільнити курсор миші процедурою SDL_FreeCursor(mouse cursor) як показано.

← попередня частина | наступна частина →

Немає коментарів:

Дописати коментар