Переклад виконано з дозволу автора оригінального матеріалу. Усі пропозиції та зауваження щодо перекладу прохання залишати в коментарях на сторінці матеріалу.
Будь-яка хороша гра має власний курсор мишки. Вам може здатися, що було б непогано мати поверхню 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”.
Результат виглядає так:


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) як показано.
Немає коментарів:
Дописати коментар