Отслеживаем мышь в SDL (двигаем спрайт)

Приступим к созданию приложения.
Прежде всего установите (если до сих пор этого не сделали) SDL.

В Fedora это делается так:

yum install SDL-devel

Приступим.

Подключим заголовочные файлы и оприделим параметры окна в константах.

#include <SDL/SDL.h>


const int WINDOW_WIDTH = 640;

const int WINDOW_HEIGHT = 480;

const char* WINDOW_TITLE = «SDL HOWTO»;

Теперь начнём формировать main:

int main(int argc, char **argv){

Инициализируем библиотеку и указываем программе параметры необходимого окна:

SDL_Init( SDL_INIT_VIDEO );

SDL_Surface* screen = SDL_SetVideoMode( WINDOW_WIDTH,

WINDOW_HEIGHT, 0,

SDL_HWSURFACE | SDL_DOUBLEBUF );

SDL_WM_SetCaption( WINDOW_TITLE, 0 );

Загружаем спрайт и указываем прозрачный цвет для него:

SDL_Surface* bitmap = SDL_LoadBMP(«sprite.bmp»);

SDL_SetColorKey( bitmap, SDL_SRCCOLORKEY, SDL_MapRGB(bitmap->format,0, 0, 0) );

Задаём часть рисунка, которая будет отрисована на экране:

SDL_Rect source;

source.x = 0;

source.y = 0;

source.w = 120;

source.h = 120;

И начинаем формировать цикл ожидания событий:

SDL_Event event;

bool run = true;

while(run) {

    while ( SDL_PollEvent(&event) ) {

        switch (event.type) {

Укажем что будем улавливать движения мыши:

case SDL_MOUSEMOTION:

При каждом движении будем передвигать спрайт на новую позицию, но перед этим очистим экран от «старых зарисовок»:

SDL_Rect fill;

fill.x = 0;

fill.y = 0;

fill.w = WINDOW_WIDTH;

fill.h = WINDOW_HEIGHT;

SDL_FillRect(screen,&fill,SDL_MapRGB(bitmap->format,0, 0, 0) );

Рисуем спрайт на новом месте:

SDL_Rect destination;

destination.x = event.motion.x — 60;  //отнимаем половину ширины картинки от позиции мыши

destination.y = event.motion.y — 60;  //высоты

destination.w = 120;

destination.h = 120;                      

SDL_BlitSurface(bitmap, &source, screen, &destination);

SDL_Flip(screen);

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

printf(«Передвинулся с %d,%d в (%d,%d)\n», event.motion.xrel, event.motion.yrel,event.motion.x, event.motion.y);

Указываем что будем выходить из цыкла при нажатии кнопки закрытия окна:

case SDL_QUIT:

       run = false;

Закрываем оставшиеся скобки чистим экран и выходим из программы:

        }

    }

    }

    SDL_FreeSurface(bitmap);

    SDL_Quit();

    return 0;

}

Теперь компилируем. В линуксах так:

g++ mouse.cpp -o mouse -lSDL

При передвижении мыши спрайт должен двигаться вместе с указателем:

Пример качаем тут
ps справедливости ради должен отметить, что «передвинулся с» означает не «передвинулся с позиции:», а передвинулся с «ходом» этаким dx и dy..

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий